Skip to content

Commit 680135e

Browse files
杨恋杨恋
杨恋
authored and
杨恋
committed
support sorter for MetaFilter and filter of fields for DataGetter
1 parent 1d85303 commit 680135e

25 files changed

+878
-37
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<modelVersion>4.0.0</modelVersion>
55
<groupId>com.aliyun.openservices</groupId>
66
<artifactId>tablestore</artifactId>
7-
<version>4.12.1</version>
7+
<version>4.12.2</version>
88
<packaging>jar</packaging>
99
<name>AliCloud TableStore SDK for Java</name>
1010
<url>http://www.aliyun.com</url>

src/main/java/com/alicloud/openservices/tablestore/timestream/TimestreamDBClient.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717

1818
/**
1919
* {@link TimestreamDBClient}定义,提供删建表,以及数据读写功能。
20-
* <p>后台默认打开自动更新时间线updateTime功能,可以通过{@link TimestreamDBConfiguration#enableDumpMeta}选择关闭 </p>
21-
* <p>当后台打开自动更新时间线updateTime功能时({@link TimestreamDBConfiguration#enableDumpMeta}),TimestreamDBClient后台会维护一个内存缓存最近更新过的时间线。数据写入时,会判断该时间线是否需要更新updateTime(缓存中没有或者上次更新时间线超过设置的阈值),
20+
* <p>后台默认打开自动更新时间线updateTime功能,可以通过{@link TimestreamDBConfiguration#dumpMeta}选择关闭 </p>
21+
* <p>当后台打开自动更新时间线updateTime功能时({@link TimestreamDBConfiguration#dumpMeta}),TimestreamDBClient后台会维护一个内存缓存最近更新过的时间线。数据写入时,会判断该时间线是否需要更新updateTime(缓存中没有或者上次更新时间线超过设置的阈值),
2222
* 如果需要更新则往meta表中插入一条记录(只更新updateTime)。</p>
2323
* <p>数据写入的异步api是通过{@link TableStoreWriter}来实现的,如果需要获取异步写入的结果,可以传入{@link TableStoreCallback},该callback是所有数据表写入共用的</p>
2424
*/
@@ -187,9 +187,9 @@ private IndexSchema getIndexSchema(List<AttributeIndexSchema> indexForAttributes
187187
fieldSchemas.add(
188188
new FieldSchema(TableMetaGenerator.CN_PK0, FieldType.KEYWORD));
189189
fieldSchemas.add(
190-
new FieldSchema(TableMetaGenerator.CN_PK1, FieldType.KEYWORD).setIndex(true));
190+
new FieldSchema(TableMetaGenerator.CN_PK1, FieldType.KEYWORD).setIndex(true).setEnableSortAndAgg(true));
191191
fieldSchemas.add(
192-
new FieldSchema(TableMetaGenerator.CN_PK2, FieldType.KEYWORD).setIndex(true).setIsArray(true));
192+
new FieldSchema(TableMetaGenerator.CN_PK2, FieldType.KEYWORD).setIndex(true).setIsArray(true).setEnableSortAndAgg(true));
193193
fieldSchemas.add(
194194
new FieldSchema(TableMetaGenerator.CN_TAMESTAMP_NAME, FieldType.LONG).setIndex(true).setStore(true));
195195
indexSchema.setFieldSchemas(fieldSchemas);

src/main/java/com/alicloud/openservices/tablestore/timestream/TimestreamMetaTable.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
import com.alicloud.openservices.tablestore.timestream.internal.Utils;
77
import com.alicloud.openservices.tablestore.timestream.model.TimestreamIdentifier;
88
import com.alicloud.openservices.tablestore.timestream.model.TimestreamMeta;
9-
import com.alicloud.openservices.tablestore.timestream.model.filter.Filter;
109
import com.alicloud.openservices.tablestore.timestream.model.query.MetaGetter;
1110
import com.alicloud.openservices.tablestore.timestream.model.query.MetaFilter;
11+
import com.alicloud.openservices.tablestore.timestream.model.filter.Filter;
1212

1313
import java.util.concurrent.Future;
1414

src/main/java/com/alicloud/openservices/tablestore/timestream/model/AttributeIndexSchema.java

+9
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,15 @@ public Boolean isArray() {
8181
return this.fieldSchema.isArray();
8282
}
8383

84+
public AttributeIndexSchema setEnableSortAndAgg(boolean enableSortAndAgg) {
85+
this.fieldSchema.setEnableSortAndAgg(enableSortAndAgg);
86+
return this;
87+
}
88+
89+
public Boolean isEnableSortAndAgg() {
90+
return this.fieldSchema.isEnableSortAndAgg();
91+
}
92+
8493
public FieldSchema getFieldSchema() {
8594
return this.fieldSchema;
8695
}

src/main/java/com/alicloud/openservices/tablestore/timestream/model/filter/Attribute.java

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.alicloud.openservices.tablestore.model.ColumnValue;
44
import com.alicloud.openservices.tablestore.model.search.query.Query;
5-
import com.alicloud.openservices.tablestore.timestream.internal.TableMetaGenerator;
65
import com.alicloud.openservices.tablestore.timestream.model.expression.*;
76

87
import java.util.List;

src/main/java/com/alicloud/openservices/tablestore/timestream/model/filter/LastUpdateTime.java

-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
import com.alicloud.openservices.tablestore.timestream.model.expression.Expression;
88
import com.alicloud.openservices.tablestore.timestream.model.expression.RangeExpression;
99

10-
import java.util.concurrent.TimeUnit;
11-
1210
/**
1311
* {@link com.alicloud.openservices.tablestore.timestream.model.TimestreamMeta#updateTime}过滤器,查询满足条件的TimestreamMeta
1412
*/

src/main/java/com/alicloud/openservices/tablestore/timestream/model/filter/Name.java

-4
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@
55
import com.alicloud.openservices.tablestore.timestream.internal.TableMetaGenerator;
66
import com.alicloud.openservices.tablestore.timestream.model.expression.*;
77

8-
import java.util.ArrayList;
9-
import java.util.Arrays;
10-
import java.util.List;
11-
128
/**
139
* {@link com.alicloud.openservices.tablestore.timestream.model.TimestreamIdentifier#name}过滤器,查询满足条件的TimestreamMeta
1410
*/

src/main/java/com/alicloud/openservices/tablestore/timestream/model/filter/Tag.java

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.alicloud.openservices.tablestore.model.search.query.Query;
55
import com.alicloud.openservices.tablestore.timestream.internal.TableMetaGenerator;
66
import com.alicloud.openservices.tablestore.timestream.model.expression.*;
7+
78
import static com.alicloud.openservices.tablestore.timestream.internal.Utils.buildTagValue;
89

910
/**

src/main/java/com/alicloud/openservices/tablestore/timestream/model/query/DataGetter.java

+30
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.alicloud.openservices.tablestore.timestream.model.query;
22

33
import com.alicloud.openservices.tablestore.AsyncClient;
4+
import com.alicloud.openservices.tablestore.ClientException;
5+
import com.alicloud.openservices.tablestore.model.filter.Filter;
46
import com.alicloud.openservices.tablestore.timestream.model.*;
57

68
import java.util.concurrent.TimeUnit;
@@ -19,6 +21,16 @@ public DataGetter(AsyncClient asyncClient, String tableName, TimestreamIdentifie
1921
this.identifier = identifier;
2022
}
2123

24+
/**
25+
* 设置数据行的过滤条件,仅支持对数据行的fields进行过滤
26+
* @param filter
27+
* @return
28+
*/
29+
public DataGetter filter(Filter filter) {
30+
setFilter(filter);
31+
return this;
32+
}
33+
2234
/**
2335
* 设置需要读取的field列表
2436
* @param fields 需要查询的数据字段
@@ -50,6 +62,24 @@ public DataGetter timestamp(long timestamp, TimeUnit unit) {
5062
return this;
5163
}
5264

65+
/**
66+
* 按照数据点的时间戳进行逆序排序,默认正序
67+
* @return
68+
*/
69+
public DataGetter descTimestamp() {
70+
setOrderByTimestampDesc();
71+
return this;
72+
}
73+
74+
/**
75+
* 设置查询时单次请求返回的行数
76+
* @param limit
77+
*/
78+
public DataGetter limit(int limit) {
79+
setLimit(limit);
80+
return this;
81+
}
82+
5383
/**
5484
* 查询
5585
* @return

src/main/java/com/alicloud/openservices/tablestore/timestream/model/query/DataQuery.java

+83-10
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
import com.alicloud.openservices.tablestore.AsyncClient;
44
import com.alicloud.openservices.tablestore.ClientException;
55
import com.alicloud.openservices.tablestore.model.*;
6+
import com.alicloud.openservices.tablestore.model.filter.Filter;
67
import com.alicloud.openservices.tablestore.timestream.internal.TableMetaGenerator;
78
import com.alicloud.openservices.tablestore.timestream.internal.Utils;
89
import com.alicloud.openservices.tablestore.timestream.model.*;
910
import com.alicloud.openservices.tablestore.timestream.model.TimeRange;
10-
import com.alicloud.openservices.tablestore.timestream.model.filter.Filter;
1111

1212
import java.util.ArrayList;
1313
import java.util.Arrays;
@@ -20,6 +20,9 @@ public class DataQuery {
2020
private List<String> columnToGet = new ArrayList<String>();
2121
private TimeRange timeRange;
2222
private long timestamp = -1;
23+
private boolean isDesc = false;
24+
private Filter filter;
25+
private int limit = -1;
2326

2427
public DataQuery(AsyncClient asyncClient, String tableName) {
2528
this.asyncClient = asyncClient;
@@ -57,21 +60,38 @@ private PointIterator getTimestreamWithRange(TimestreamIdentifier identifier) {
5760
end = timeRange.getEndTime();
5861
}
5962
PrimaryKeyBuilder beginPk = Utils.convertIdentifierToPK(identifier);
60-
beginPk.addPrimaryKeyColumn(
61-
TableMetaGenerator.CN_TAMESTAMP_NAME,
62-
PrimaryKeyValue.fromLong(start)
63-
);
64-
6563
PrimaryKeyBuilder endPk = Utils.convertIdentifierToPK(identifier);
66-
endPk.addPrimaryKeyColumn(
67-
TableMetaGenerator.CN_TAMESTAMP_NAME,
68-
PrimaryKeyValue.fromLong(end)
69-
);
64+
if (isDesc) {
65+
beginPk.addPrimaryKeyColumn(
66+
TableMetaGenerator.CN_TAMESTAMP_NAME,
67+
PrimaryKeyValue.fromLong(end)
68+
);
69+
endPk.addPrimaryKeyColumn(
70+
TableMetaGenerator.CN_TAMESTAMP_NAME,
71+
PrimaryKeyValue.fromLong(start)
72+
);
73+
rangeRowQueryCriteria.setDirection(Direction.BACKWARD);
74+
} else {
75+
beginPk.addPrimaryKeyColumn(
76+
TableMetaGenerator.CN_TAMESTAMP_NAME,
77+
PrimaryKeyValue.fromLong(start)
78+
);
79+
endPk.addPrimaryKeyColumn(
80+
TableMetaGenerator.CN_TAMESTAMP_NAME,
81+
PrimaryKeyValue.fromLong(end)
82+
);
83+
}
7084

7185
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(beginPk.build());
7286
rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPk.build());
7387
rangeRowQueryCriteria.setMaxVersions(1);
7488
rangeRowQueryCriteria.addColumnsToGet(columnToGet);
89+
if (filter != null) {
90+
rangeRowQueryCriteria.setFilter(filter);
91+
}
92+
if (limit > 0) {
93+
rangeRowQueryCriteria.setLimit(limit);
94+
}
7595
GetRangeRequest request = new GetRangeRequest();
7696
request.setRangeRowQueryCriteria(rangeRowQueryCriteria);
7797

@@ -88,6 +108,9 @@ private PointIterator getTimestreamWithTimestamp(TimestreamIdentifier identifie
88108
singleRowQueryCriteria.setPrimaryKey(pkBuilder.build());
89109
singleRowQueryCriteria.setMaxVersions(1);
90110
singleRowQueryCriteria.addColumnsToGet(columnToGet);
111+
if (filter != null) {
112+
singleRowQueryCriteria.setFilter(filter);
113+
}
91114
GetRowRequest request = new GetRowRequest(singleRowQueryCriteria);
92115
return new PointIterator(new GetRowIterator(asyncClient, request), identifier);
93116
}
@@ -111,4 +134,54 @@ public TimeRange getTimeRange() {
111134
public long getTimestamp() {
112135
return timestamp;
113136
}
137+
138+
/**
139+
* 设置按照数据的时间戳进行逆序排序
140+
*/
141+
protected void setOrderByTimestampDesc() {
142+
this.isDesc = true;
143+
}
144+
145+
/**
146+
*
147+
* @return 查询是否按照数据的时间戳进行逆序排序
148+
*/
149+
public boolean isDescTimestamp() {
150+
return this.isDesc;
151+
}
152+
153+
/**
154+
* 数据查询的过滤条件
155+
* @param filter 数据查询过滤条件
156+
*/
157+
protected void setFilter(Filter filter) {
158+
this.filter = filter;
159+
}
160+
161+
/**
162+
* 获取数据查询的过滤条件
163+
* @return
164+
*/
165+
public Filter getFilter() {
166+
return this.filter;
167+
}
168+
169+
/**
170+
* 设置查询时单次请求返回的行数
171+
* @param limit
172+
*/
173+
protected void setLimit(int limit) {
174+
if (limit <= 0) {
175+
throw new ClientException("The limit must be greater than 0.");
176+
}
177+
this.limit = limit;
178+
}
179+
180+
/**
181+
* 获取查询时单次请求返回的行数
182+
* @return
183+
*/
184+
public int getLimit() {
185+
return limit;
186+
}
114187
}

src/main/java/com/alicloud/openservices/tablestore/timestream/model/query/MetaFilter.java

+15
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.alicloud.openservices.tablestore.model.search.SearchQuery;
66
import com.alicloud.openservices.tablestore.model.search.SearchRequest;
77
import com.alicloud.openservices.tablestore.model.search.query.MatchAllQuery;
8+
import com.alicloud.openservices.tablestore.model.search.sort.Sort;
89
import com.alicloud.openservices.tablestore.timestream.internal.TableMetaGenerator;
910
import com.alicloud.openservices.tablestore.timestream.model.*;
1011
import com.alicloud.openservices.tablestore.timestream.model.filter.Filter;
@@ -27,6 +28,7 @@ public class MetaFilter {
2728
private List<String> attrToGet = null;
2829
private int limit = 100;
2930
private int offset = 0;
31+
private Sort sort = null;
3032

3133
public MetaFilter(AsyncClient asyncClient,
3234
String metaTableName, String indexName,
@@ -56,6 +58,16 @@ public MetaFilter offset(int offset) {
5658
return this;
5759
}
5860

61+
/**
62+
* 指定排序条件会返回结果进行排序
63+
* @param sorter 排序规则
64+
* @return
65+
*/
66+
public MetaFilter sort(Sorter sorter) {
67+
this.sort = new Sort(sorter.getSorter());
68+
return this;
69+
}
70+
5971
/**
6072
* 设置需要查询的attributes列名
6173
* @param columns
@@ -115,6 +127,9 @@ private TimestreamMetaIterator fetchMeta(List<String> colsToGet) {
115127
} else {
116128
searchQuery.setQuery(filter.getQuery());
117129
}
130+
if (sort != null) {
131+
searchQuery.setSort(sort);
132+
}
118133

119134
SearchRequest request = new SearchRequest(metaTableName, indexName, searchQuery);
120135
SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();

0 commit comments

Comments
 (0)