Skip to content

Commit deff207

Browse files
authored
feat(timescaledb): 支持配置TimescaleDB函数所在的schema (#710)
* feat(timescaledb): 支持配置TimescaleDB函数所在的schema - 在application.yml和application-default.yml中新增TIMESCALEDB_FUNCTION_SCHEMA配置项 - 修改TimescaleDBCreateTableSqlBuilder类,移除构造函数中的schema参数 - 更新创建超表和保留策略的SQL语句,使用functionSchema替代原有schema - 在TimescaleDBTimeSeriesManager中注入TimescaleDBProperties并设置FunctionSchema特性 - 调整时间分组列的创建逻辑,支持传入functionSchema参数 - 引入FunctionSchema类管理TimescaleDB相关的函数位置信息 * 把配置放进RDBDatabaseMetadata里 * 优化
1 parent 4d7d406 commit deff207

File tree

13 files changed

+88
-23
lines changed

13 files changed

+88
-23
lines changed

jetlinks-components/timescaledb-component/src/main/java/org/jetlinks/community/timescaledb/TimescaleDBProperties.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import org.springframework.boot.autoconfigure.r2dbc.R2dbcProperties;
2323
import org.springframework.boot.context.properties.ConfigurationProperties;
2424

25+
import java.util.Objects;
26+
2527
@ConfigurationProperties(prefix = "timescaledb")
2628
@Getter
2729
@Setter
@@ -39,6 +41,15 @@ public class TimescaleDBProperties {
3941
//数据库的schema
4042
private String schema = "public";
4143

44+
/**
45+
* TimescaleDB超表函数所在的位置
46+
*/
47+
private String functionSchema = null;
48+
49+
public String getFunctionSchema() {
50+
return functionSchema == null ? schema : functionSchema;
51+
}
52+
4253
/**
4354
* 写入缓冲区配置
4455
*

jetlinks-components/timescaledb-component/src/main/java/org/jetlinks/community/timescaledb/TimescaleDBUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,15 @@ public static String getTableName(String name) {
4040
return ThingsDatabaseUtils.createTableName(name);
4141
}
4242

43-
public static NativeSelectColumn createTimeGroupColumn(long startWith, Interval interval) {
43+
public static NativeSelectColumn createTimeGroupColumn(long startWith, Interval interval, String functionSchema) {
4444

4545
String unit = interval.getNumber().intValue() + " " + interval
4646
.getUnit()
4747
.name()
4848
.toLowerCase();
4949

5050
return NativeSelectColumn
51-
.of("time_bucket('" + unit + "',timestamp)");
51+
.of("\"" + functionSchema + "\"" + ".time_bucket('" + unit + "',timestamp)");
5252
}
5353

5454
public static TimeSeriesData convertToTimeSeriesData(Record record) {

jetlinks-components/timescaledb-component/src/main/java/org/jetlinks/community/timescaledb/configuration/TimescaleDBTimeSeriesConfiguration.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.jetlinks.community.timescaledb.configuration;
1717

1818
import org.jetlinks.community.timescaledb.TimescaleDBOperations;
19+
import org.jetlinks.community.timescaledb.TimescaleDBProperties;
1920
import org.jetlinks.community.timescaledb.timeseries.TimescaleDBTimeSeriesManager;
2021
import org.jetlinks.community.timescaledb.timeseries.TimescaleDBTimeSeriesProperties;
2122
import org.springframework.boot.autoconfigure.AutoConfiguration;
@@ -35,8 +36,9 @@ public class TimescaleDBTimeSeriesConfiguration {
3536
@Bean
3637
@Primary
3738
public TimescaleDBTimeSeriesManager timescaleDBTimeSeriesManager(TimescaleDBOperations operations,
38-
TimescaleDBTimeSeriesProperties properties) {
39-
return new TimescaleDBTimeSeriesManager(properties, operations);
39+
TimescaleDBTimeSeriesProperties properties,
40+
TimescaleDBProperties timescaleDBProperties) {
41+
return new TimescaleDBTimeSeriesManager(properties, operations,timescaleDBProperties);
4042
}
4143

4244

jetlinks-components/timescaledb-component/src/main/java/org/jetlinks/community/timescaledb/impl/DefaultTimescaleDBOperations.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.jetlinks.community.timescaledb.TimescaleDBOperations;
3232
import org.jetlinks.community.timescaledb.TimescaleDBProperties;
3333
import org.jetlinks.community.timescaledb.metadata.TimescaleDBDialectProvider;
34+
import org.jetlinks.community.timescaledb.metadata.TimescaleDBPropertiesFeature;
3435
import org.springframework.beans.BeansException;
3536
import org.springframework.boot.CommandLineRunner;
3637
import org.springframework.boot.SpringApplication;
@@ -64,7 +65,7 @@ public void init() {
6465
RDBDatabaseMetadata database = new RDBDatabaseMetadata(Dialect.POSTGRES);
6566
database.addFeature(sqlExecutor);
6667
database.addFeature(ReactiveSyncSqlExecutor.of(sqlExecutor));
67-
68+
database.addFeature(TimescaleDBPropertiesFeature.of(properties));
6869
RDBSchemaMetadata schema = TimescaleDBDialectProvider.GLOBAL.createSchema(properties.getSchema());
6970
database.addSchema(schema);
7071
database.setCurrentSchema(schema);
@@ -91,6 +92,7 @@ public void init() {
9192
.create("TimescaleDB", datasource);
9293
disposable.add(dataSource);
9394
database = dataSource.operator();
95+
database.getMetadata().addFeature(TimescaleDBPropertiesFeature.of(properties));
9496
}
9597
writer = new DefaultTimescaleDBDataWriter(database, properties.getWriteBuffer());
9698
writer.init();

jetlinks-components/timescaledb-component/src/main/java/org/jetlinks/community/timescaledb/metadata/TimescaleDBCreateTableSqlBuilder.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,11 @@
2323

2424
public class TimescaleDBCreateTableSqlBuilder extends CommonCreateTableSqlBuilder {
2525

26-
private String schema;
27-
28-
public TimescaleDBCreateTableSqlBuilder(String schema) {
29-
this.schema = schema;
30-
}
31-
3226
@Override
3327
public SqlRequest build(RDBTableMetadata table) {
3428
DefaultBatchSqlRequest sqlRequest = (DefaultBatchSqlRequest) super.build(table);
3529

30+
3631
table.getFeature(CreateHypertable.ID)
3732
.ifPresent(createHypertable -> sqlRequest.addBatch(createCreateHypertableSQL(table, createHypertable)));
3833

@@ -47,9 +42,12 @@ private SqlRequest createCreateRetentionPolicySQL(RDBTableMetadata table, Create
4742

4843
String interval = createHypertable.getInterval().getNumber().intValue() + " "
4944
+ createHypertable.getInterval().getUnit().name().toLowerCase();
45+
String functionSchema = table.findFeatureNow(TimescaleDBPropertiesFeature.ID)
46+
.getProperties()
47+
.getFunctionSchema();
5048

5149
return SqlRequests.of(
52-
"SELECT "+ schema +".add_retention_policy( ? , INTERVAL '" + interval + "')",
50+
"SELECT " + "\"" + functionSchema + "\"" + ".add_retention_policy( ? , INTERVAL '" + interval + "')",
5351
table.getFullName()
5452
);
5553
}
@@ -58,9 +56,11 @@ private SqlRequest createCreateHypertableSQL(RDBTableMetadata table, CreateHyper
5856

5957
String interval = createHypertable.getChunkTimeInterval().getNumber().intValue() + " "
6058
+ createHypertable.getChunkTimeInterval().getUnit().name().toLowerCase();
61-
59+
String functionSchema = table.findFeatureNow(TimescaleDBPropertiesFeature.ID)
60+
.getProperties()
61+
.getFunctionSchema();
6262
return SqlRequests.of(
63-
"SELECT "+ schema +".create_hypertable( ? , ? , chunk_time_interval => INTERVAL '" + interval + "')",
63+
"SELECT " + "\"" + functionSchema + "\"" + ".create_hypertable( ? , ? , chunk_time_interval => INTERVAL '" + interval + "')",
6464
table.getFullName(),
6565
table.getColumnNow(createHypertable.getColumn()).getName()
6666
);

jetlinks-components/timescaledb-component/src/main/java/org/jetlinks/community/timescaledb/metadata/TimescaleDBDialectProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public String getBindSymbol() {
4949
@Override
5050
public RDBSchemaMetadata createSchema(String name) {
5151
PostgresqlSchemaMetadata schema = new PostgresqlSchemaMetadata(name);
52-
schema.addFeature(new TimescaleDBCreateTableSqlBuilder(name));
52+
schema.addFeature(new TimescaleDBCreateTableSqlBuilder());
5353
schema.addFeature(new TimescaleDBAlterTableSqlBuilder());
5454
DefaultValueCodecFactory codecFactory = new DefaultValueCodecFactory();
5555
codecFactory
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.jetlinks.community.timescaledb.metadata;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import org.hswebframework.ezorm.core.FeatureId;
6+
import org.hswebframework.ezorm.core.FeatureType;
7+
import org.hswebframework.ezorm.core.meta.Feature;
8+
import org.jetlinks.community.timescaledb.TimescaleDBProperties;
9+
10+
@AllArgsConstructor(staticName = "of")
11+
@Getter
12+
public class TimescaleDBPropertiesFeature implements Feature, FeatureType {
13+
14+
public static final FeatureId<TimescaleDBPropertiesFeature> ID = FeatureId.of("TimescaleDBPropertiesFeature");
15+
16+
private final TimescaleDBProperties properties;
17+
18+
@Override
19+
public String getId() {
20+
return ID.getId();
21+
}
22+
23+
@Override
24+
public String getName() {
25+
return "TimescaleDBPropertiesFeature";
26+
}
27+
28+
@Override
29+
public FeatureType getType() {
30+
return this;
31+
}
32+
}

jetlinks-components/timescaledb-component/src/main/java/org/jetlinks/community/timescaledb/thing/TimescaleDBColumnModeQueryOperations.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import org.hswebframework.web.api.crud.entity.PagerResult;
2929
import org.hswebframework.web.api.crud.entity.QueryParamEntity;
3030
import org.hswebframework.web.crud.query.QueryHelper;
31-
import org.jetlinks.core.metadata.EventMetadata;
31+
import org.jetlinks.community.timescaledb.metadata.TimescaleDBPropertiesFeature;
3232
import org.jetlinks.core.things.ThingsRegistry;
3333
import org.jetlinks.community.things.data.AggregationRequest;
3434
import org.jetlinks.community.things.data.PropertyAggregation;
@@ -37,7 +37,6 @@
3737
import org.jetlinks.community.things.data.operations.ColumnModeQueryOperationsBase;
3838
import org.jetlinks.community.things.data.operations.DataSettings;
3939
import org.jetlinks.community.things.data.operations.MetricBuilder;
40-
import org.jetlinks.community.things.data.operations.RowModeQueryOperationsBase;
4140
import org.jetlinks.community.timescaledb.TimescaleDBUtils;
4241
import org.jetlinks.community.timeseries.TimeSeriesData;
4342
import org.jetlinks.community.timeseries.query.Aggregation;
@@ -122,7 +121,11 @@ static Flux<AggregationData> doAggregation0(DatabaseOperator database,
122121
if (request.getInterval() != null) {
123122
NativeSelectColumn column = createTimeGroupColumn(
124123
request.getFrom().getTime(),
125-
request.getInterval()
124+
request.getInterval(),
125+
database.getMetadata()
126+
.getFeatureNow(TimescaleDBPropertiesFeature.ID)
127+
.getProperties()
128+
.getFunctionSchema()
126129
);
127130
query.groupBy(column);
128131
query.select(column);

jetlinks-components/timescaledb-component/src/main/java/org/jetlinks/community/timescaledb/thing/TimescaleDBRowModeQueryOperations.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import org.hswebframework.web.api.crud.entity.PagerResult;
2929
import org.hswebframework.web.api.crud.entity.QueryParamEntity;
3030
import org.hswebframework.web.crud.query.QueryHelper;
31-
import org.jetlinks.core.metadata.EventMetadata;
31+
import org.jetlinks.community.timescaledb.metadata.TimescaleDBPropertiesFeature;
3232
import org.jetlinks.core.things.ThingsRegistry;
3333
import org.jetlinks.community.things.data.AggregationRequest;
3434
import org.jetlinks.community.things.data.PropertyAggregation;
@@ -49,8 +49,6 @@
4949
import java.util.*;
5050
import java.util.function.Function;
5151

52-
import static org.jetlinks.community.timescaledb.thing.TimescaleDBColumnModeQueryOperations.doAggregation0;
53-
5452
@Slf4j
5553
public class TimescaleDBRowModeQueryOperations extends RowModeQueryOperationsBase {
5654
private final DatabaseOperator database;
@@ -117,7 +115,11 @@ protected Flux<AggregationData> doAggregation(String metric,
117115
if (request.getInterval() != null) {
118116
NativeSelectColumn column = TimescaleDBUtils.createTimeGroupColumn(
119117
request.getFrom().getTime(),
120-
request.getInterval()
118+
request.getInterval(),
119+
database.getMetadata()
120+
.getFeatureNow(TimescaleDBPropertiesFeature.ID)
121+
.getProperties()
122+
.getFunctionSchema()
121123
);
122124

123125
query.groupBy(column);

jetlinks-components/timescaledb-component/src/main/java/org/jetlinks/community/timescaledb/timeseries/TimescaleDBTimeSeriesManager.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.hswebframework.ezorm.rdb.codec.DateTimeCodec;
2121
import org.hswebframework.ezorm.rdb.metadata.RDBIndexMetadata;
2222
import org.hswebframework.ezorm.rdb.operator.ddl.TableBuilder;
23+
import org.jetlinks.community.timescaledb.TimescaleDBProperties;
2324
import org.jetlinks.core.metadata.PropertyMetadata;
2425
import org.jetlinks.community.Interval;
2526
import org.jetlinks.community.things.data.ThingsDataConstants;
@@ -48,6 +49,8 @@ public class TimescaleDBTimeSeriesManager implements TimeSeriesManager {
4849

4950
private final TimescaleDBOperations operations;
5051

52+
private final TimescaleDBProperties timescaleDBProperties;
53+
5154
@Override
5255
public TimeSeriesService getService(TimeSeriesMetric metric) {
5356
return getService(metric.getId());

0 commit comments

Comments
 (0)