From e14d15cb0322fc5b278f0e49a8fab17afe34487e Mon Sep 17 00:00:00 2001 From: JohnnyJie <771886728@qq.com> Date: Tue, 23 Mar 2021 15:15:37 +0800 Subject: [PATCH 1/3] support rlimit --- .../client/value/request/LastPointQuery.java | 43 +++++++++ .../value/request/MultiFieldSubQuery.java | 45 ++++++++- .../TestHiTSDBClientMultiFieldFeatures.java | 92 +++++++++++++++---- .../TestHiTSDBClientQueryLimitAndDpValue.java | 13 ++- .../value/request/LastPointQueryTest.java | 17 ++++ ...ultiPointTest.java => MultiFieldTest.java} | 25 ++++- 6 files changed, 209 insertions(+), 26 deletions(-) rename src/test/java/com/aliyun/hitsdb/client/value/request/{MultiPointTest.java => MultiFieldTest.java} (74%) diff --git a/src/main/java/com/aliyun/hitsdb/client/value/request/LastPointQuery.java b/src/main/java/com/aliyun/hitsdb/client/value/request/LastPointQuery.java index 0b5f69e4..e5c62fcc 100644 --- a/src/main/java/com/aliyun/hitsdb/client/value/request/LastPointQuery.java +++ b/src/main/java/com/aliyun/hitsdb/client/value/request/LastPointQuery.java @@ -28,6 +28,10 @@ public static class Builder { private LastLimit limit; + private Integer rlimit; + + private Integer roffset; + private Map> hint; // this field is only allowed for Lindorm TSDB @@ -80,6 +84,23 @@ public Builder queryType(QueryType queryType) { return this; } + /** + * only valid for multi field model + */ + public Builder rlimit(Integer rlimit) { + this.rlimit = rlimit; + return this; + } + + /** + * only valid for multi field model + */ + + public Builder roffset(Integer roffset) { + this.roffset = roffset; + return this; + } + public LastPointQuery build() { if (queries == null || queries.isEmpty()) { throw new IllegalArgumentException("the LastPointSubQuery must be set"); @@ -91,6 +112,8 @@ public LastPointQuery build() { query.setQueries(queries); query.tupleFormat = tupleFormat; query.limit = limit; + query.rlimit = rlimit; + query.roffset = roffset; query.hint = hint; query.queryType = queryType; return query; @@ -110,6 +133,10 @@ public static Builder builder() { private LastLimit limit; + private Integer rlimit; + + private Integer roffset; + /** * Optional tupleFormat parameter. * Used for multi-field latest data points query and show results in tuple format. @@ -172,6 +199,22 @@ public void setLimit(LastLimit limit) { this.limit = limit; } + public Integer getRlimit() { + return rlimit; + } + + public void setRLimit(int rlimit) { + this.rlimit = rlimit; + } + + public Integer getRoffset() { + return roffset; + } + + public void setRoffset(int roffset) { + this.roffset = roffset; + } + public Map> getHint() { return hint; } diff --git a/src/main/java/com/aliyun/hitsdb/client/value/request/MultiFieldSubQuery.java b/src/main/java/com/aliyun/hitsdb/client/value/request/MultiFieldSubQuery.java index e05207dc..9f72b068 100644 --- a/src/main/java/com/aliyun/hitsdb/client/value/request/MultiFieldSubQuery.java +++ b/src/main/java/com/aliyun/hitsdb/client/value/request/MultiFieldSubQuery.java @@ -15,16 +15,20 @@ public class MultiFieldSubQuery { private List filters; private List fields; private Integer limit; - private Integer globalLimit; private Integer offset; + private Integer rlimit; + private Integer roffset; + private Integer globalLimit; private int index; private Map> hint; public static class Builder { private String metric; private Integer limit; - private Integer globalLimit; private Integer offset; + private Integer rlimit; + private Integer roffset; + private Integer globalLimit; private Map tags = new HashMap(); private List filters = new ArrayList(); private List fieldsInfo = new ArrayList(); @@ -60,6 +64,27 @@ public Builder limit(Integer limit) { return this; } + public Builder rlimit(Integer rlimit) { + if (rlimit != null) { + if (rlimit < 0 || rlimit > Integer.MAX_VALUE) { + throw new IllegalArgumentException("Illegal rlimit value."); + } + this.rlimit = rlimit; + } + return this; + } + + public Builder roffset(Integer roffset) { + if (roffset != null) { + if (roffset < 0 || roffset > Integer.MAX_VALUE) { + throw new IllegalArgumentException("Illegal roffset value."); + } + this.roffset = roffset; + } + return this; + } + + @Deprecated public Builder globalLimit(Integer globalLimit) { if (globalLimit != null) { if (globalLimit < 0 || globalLimit > Integer.MAX_VALUE) { @@ -170,6 +195,14 @@ public MultiFieldSubQuery build() { subQuery.limit = this.limit; } + if (this.rlimit != null && this.rlimit > 0) { + subQuery.rlimit = this.rlimit; + } + + if (this.roffset != null && this.roffset > 0) { + subQuery.roffset = this.roffset; + } + if (this.globalLimit != null && this.globalLimit > 0) { subQuery.globalLimit = this.globalLimit; } @@ -222,6 +255,14 @@ public Integer getLimit() { return limit; } + public Integer getRlimit() { + return rlimit; + } + + public Integer getRoffset() { + return roffset; + } + public Integer getGlobalLimit() { return globalLimit; } diff --git a/src/test/java/com/aliyun/hitsdb/client/TestHiTSDBClientMultiFieldFeatures.java b/src/test/java/com/aliyun/hitsdb/client/TestHiTSDBClientMultiFieldFeatures.java index 98c813cc..0cadbdc4 100644 --- a/src/test/java/com/aliyun/hitsdb/client/TestHiTSDBClientMultiFieldFeatures.java +++ b/src/test/java/com/aliyun/hitsdb/client/TestHiTSDBClientMultiFieldFeatures.java @@ -3,6 +3,7 @@ import com.alibaba.fastjson.JSON; import com.aliyun.hitsdb.client.exception.http.HttpClientInitException; import com.aliyun.hitsdb.client.value.request.*; +import com.aliyun.hitsdb.client.value.response.LastDataValue; import com.aliyun.hitsdb.client.value.response.MultiFieldQueryLastResult; import com.aliyun.hitsdb.client.value.response.MultiFieldQueryResult; import com.aliyun.hitsdb.client.value.type.Aggregator; @@ -314,10 +315,12 @@ public void testMultiFieldQueryWithWhereClause() { /** * test the basic behavior of the limit and global interface of SDK - * @note it is required that the version of TSDB engine greater than v2.6.4 + * @note it is required that the version of TSDB engine greater than v2.6.13 + * Q1: MQuery + rlimit + roffset Q2: MLast + limit + rlimit + roffset + * Q3: MLast + limit + rlimit Q4: MLast + limit + roffset */ @Test - public void testMultiFieldQueryWithLimit() { + public void testMultiFieldQueryWithRLimitAndRoffset() { final String METRIC = "testMultiFieldQueryWithLimit", TAGK = "tagk"; try { @@ -343,28 +346,23 @@ public void testMultiFieldQueryWithLimit() { } // timeline2, no field3 - mpoints.add(MultiFieldPoint.metric(METRIC) - .tag(TAGK, "tagv2") - .field("f1", 100) - .field("f2", 222.22) - .field("f4", strings[2 % 3]) - .timestamp(startTime + 90).build()); - - // timeline2, no field4 - mpoints.add(MultiFieldPoint.metric(METRIC) - .tag(TAGK, "tagv3") - .field("f1", 105) - .field("f2", 111.11) - .field("f3", 100) - .timestamp(startTime + 120).build()); + for (int i = 0; i < 4; i++) { + mpoints.add(MultiFieldPoint.metric(METRIC) + .tag(TAGK, "tagv2") + .field("f1", 100 + i) + .field("f2", 333.33) + .field("f3", 300 - i * 100) + .timestamp(startTime + i * 30).build()); + } tsdb.multiFieldPutSync(mpoints); - + // Q1: MQuery + rlimit + roffset MultiFieldQuery mq = MultiFieldQuery.start(startTime) .sub(MultiFieldSubQuery .metric(METRIC) - .limit(2) - .globalLimit(3) + .limit(3) + .rlimit(1) + .roffset(1) .fieldsInfo(MultiFieldSubQueryDetails .aggregator(Aggregator.NONE) .field("*") @@ -379,12 +377,66 @@ public void testMultiFieldQueryWithLimit() { Assert.assertEquals(5, r.getColumns().size()); if (r.getTags().get(TAGK).equals("tagv1")) { - Assert.assertEquals(2, r.getValues().size()); + Assert.assertEquals(1, r.getValues().size()); + Assert.assertEquals("[[1514736030, 101.0, 333.33, 200.0, ABC]]", r.getValues().toString()); } else if (r.getTags().get(TAGK).equals("tagv2")) { Assert.assertEquals(1, r.getValues().size()); + Assert.assertEquals("[[1514736030, 101.0, 333.33, 200.0, null]]", r.getValues().toString()); } else { Assert.fail("unexpected tag value retrieved: " + r.getTags().get(TAGK)); } } + + // Q2: MLast + rlimit + roffset + LastPointQuery lastPointQuery = LastPointQuery.builder() + .limit(new LastLimit(startTime, 3)) + .rlimit(1) + .roffset(1) + .sub(LastPointSubQuery.builder(METRIC, Collections.singletonList("*"), Collections.emptyMap()).build()) + .tupleFormat(true).build(); + List lastResults = tsdb.multiFieldQueryLast(lastPointQuery); + Assert.assertEquals(2, lastResults.size()); + for (MultiFieldQueryLastResult multiFieldQueryLastResult : lastResults) { + Assert.assertEquals(1, multiFieldQueryLastResult.getValues().size()); + if (multiFieldQueryLastResult.getTags().get("tagk").equals("tagv1")) { + Assert.assertEquals("[1514736060000, 102.0, 333.33, 100.0, 11.11a]", multiFieldQueryLastResult.getValues().get(0).toString()); + } else { + Assert.assertEquals("[1514736060000, 102.0, 333.33, 100.0]", multiFieldQueryLastResult.getValues().get(0).toString()); + } + } + + // Q3: MLast + limit + rlimit + lastPointQuery = LastPointQuery.builder() + .limit(new LastLimit(startTime, 3)) + .rlimit(1) + .sub(LastPointSubQuery.builder(METRIC, Collections.singletonList("*"), Collections.emptyMap()).build()) + .tupleFormat(true).build(); + lastResults = tsdb.multiFieldQueryLast(lastPointQuery); + Assert.assertEquals(2, lastResults.size()); + for (MultiFieldQueryLastResult multiFieldQueryLastResult : lastResults) { + Assert.assertEquals(1, multiFieldQueryLastResult.getValues().size()); + if (multiFieldQueryLastResult.getTags().get("tagk").equals("tagv1")) { + Assert.assertEquals("[1514736030000, 101.0, 333.33, 200.0, ABC]", multiFieldQueryLastResult.getValues().get(0).toString()); + } else { + Assert.assertEquals("[1514736030000, 101.0, 333.33, 200.0]", multiFieldQueryLastResult.getValues().get(0).toString()); + } + } + + // Q3: MLast + limit + roffset + lastPointQuery = LastPointQuery.builder() + .limit(new LastLimit(startTime, 3)) + .roffset(1) + .sub(LastPointSubQuery.builder(METRIC, Collections.singletonList("*"), Collections.emptyMap()).build()) + .tupleFormat(true).build(); + lastResults = tsdb.multiFieldQueryLast(lastPointQuery); + Assert.assertEquals(2, lastResults.size()); + for (MultiFieldQueryLastResult multiFieldQueryLastResult : lastResults) { + Assert.assertEquals(2, multiFieldQueryLastResult.getValues().size()); + if (multiFieldQueryLastResult.getTags().get("tagk").equals("tagv1")) { + Assert.assertEquals("[1514736060000, 102.0, 333.33, 100.0, 11.11a]", multiFieldQueryLastResult.getValues().get(0).toString()); + } else { + Assert.assertEquals("[1514736060000, 102.0, 333.33, 100.0]", multiFieldQueryLastResult.getValues().get(0).toString()); + } + } } } diff --git a/src/test/java/com/aliyun/hitsdb/client/TestHiTSDBClientQueryLimitAndDpValue.java b/src/test/java/com/aliyun/hitsdb/client/TestHiTSDBClientQueryLimitAndDpValue.java index 3a89784e..70d119f9 100644 --- a/src/test/java/com/aliyun/hitsdb/client/TestHiTSDBClientQueryLimitAndDpValue.java +++ b/src/test/java/com/aliyun/hitsdb/client/TestHiTSDBClientQueryLimitAndDpValue.java @@ -237,10 +237,17 @@ public void testQueryGlobalLimit() throws InterruptedException { .offset(offset).build()).build(); System.out.println("查询条件:" + query.toJSON()); - List queryResults = tsdb.query(query); + final List queryResults = tsdb.query(query); Assert.assertEquals(2, queryResults.size()); - contentAssert(checklist1, (List) queryResults.get(0)); - contentAssert(checklist2, (List) queryResults.get(1)); + List resultList1 = new ArrayList() {{add(queryResults.get(0));}}; + List resultList2 = new ArrayList() {{add(queryResults.get(1));}}; + if (resultList1.get(0).getTags().containsKey("tagk1")) { + contentAssert(checklist1, resultList1); + contentAssert(checklist2, resultList2); + } else { + contentAssert(checklist1, resultList2); + contentAssert(checklist2, resultList1); + } } } } diff --git a/src/test/java/com/aliyun/hitsdb/client/value/request/LastPointQueryTest.java b/src/test/java/com/aliyun/hitsdb/client/value/request/LastPointQueryTest.java index 870788a4..fe63ab24 100644 --- a/src/test/java/com/aliyun/hitsdb/client/value/request/LastPointQueryTest.java +++ b/src/test/java/com/aliyun/hitsdb/client/value/request/LastPointQueryTest.java @@ -64,4 +64,21 @@ public void testLastLimit() { String expected = "{\"limit\":{\"from\":1511927280,\"global\":true,\"size\":2},\"queries\":[{\"metric\":\"m1\",\"tags\":{\"k1\":\"v1\"}},{\"metric\":\"m2\",\"tags\":{\"k1\":\"v1\"}}]}"; assertEquals(expected, lastPointQuery.toString()); } + + @Test + public void testLastRLimit() { + Map tags = new HashMap(); + tags.put("k1", "v1"); + LastLimit lastLimit = new LastLimit(1511927280, 2 , true); + + LastPointQuery lastPointQuery = LastPointQuery + .builder() + .rlimit(2).roffset(2) + .limit(lastLimit) + .sub(LastPointSubQuery.builder("m1", tags).build()) + .sub(LastPointSubQuery.builder("m2", tags).build()).build(); + + String expected = "{\"limit\":{\"from\":1511927280,\"global\":true,\"size\":2},\"queries\":[{\"metric\":\"m1\",\"tags\":{\"k1\":\"v1\"}},{\"metric\":\"m2\",\"tags\":{\"k1\":\"v1\"}}],\"rlimit\":2,\"roffset\":2}"; + assertEquals(expected, lastPointQuery.toString()); + } } diff --git a/src/test/java/com/aliyun/hitsdb/client/value/request/MultiPointTest.java b/src/test/java/com/aliyun/hitsdb/client/value/request/MultiFieldTest.java similarity index 74% rename from src/test/java/com/aliyun/hitsdb/client/value/request/MultiPointTest.java rename to src/test/java/com/aliyun/hitsdb/client/value/request/MultiFieldTest.java index 7ba47b0e..e497eeb6 100644 --- a/src/test/java/com/aliyun/hitsdb/client/value/request/MultiPointTest.java +++ b/src/test/java/com/aliyun/hitsdb/client/value/request/MultiFieldTest.java @@ -1,11 +1,16 @@ package com.aliyun.hitsdb.client.value.request; import com.alibaba.fastjson.JSON; +import com.aliyun.hitsdb.client.value.type.Aggregator; import org.junit.Assert; import org.junit.Test; -public class MultiPointTest { +import java.util.HashMap; +import java.util.Map; +import static org.junit.Assert.assertEquals; + +public class MultiFieldTest { @Test public void test_can_set_empty_string_tag_value() { @@ -86,4 +91,22 @@ public void testMultiFieldGeoPointSerialize() { Assert.assertEquals(point1.getFields().get("f3"), gp); Assert.assertEquals(point1.getFields().get("f3"), point.getFields().get("f3")); } + + @Test + public void testQueryRLimit() { + long startTime = 1511927280; + long endTime = 1511937280; + String metric = "test-test-test"; + Map tags = new HashMap(); + tags.put("k1", "v1"); + + MultiFieldQuery mq = MultiFieldQuery.start(startTime).end(endTime).sub( + MultiFieldSubQuery.metric(metric).rlimit(2).roffset(3).limit(4).fieldsInfo( + MultiFieldSubQueryDetails.aggregator(Aggregator.NONE).field("*").build() + ).build() + ).build(); + + String expected = "{\"end\":1511937280,\"queries\":[{\"fields\":[{\"aggregator\":\"none\",\"aggregatorType\":\"NONE\",\"delta\":false,\"field\":\"*\",\"rate\":false,\"top\":0}],\"index\":0,\"limit\":4,\"metric\":\"test-test-test\",\"rlimit\":2,\"roffset\":3}],\"start\":1511927280}"; + assertEquals(expected, mq.toString()); + } } From 5c3afe4208753692adf2bbb2a606784cbd530079 Mon Sep 17 00:00:00 2001 From: JohnnyJie <771886728@qq.com> Date: Mon, 26 Apr 2021 20:01:08 +0800 Subject: [PATCH 2/3] support slimit --- .../client/value/request/LastPointQuery.java | 26 +++++++++++++++-- .../value/request/MultiFieldSubQuery.java | 29 +++++++++++++++++++ .../hitsdb/client/value/request/SubQuery.java | 18 ++++++++++++ .../value/request/LastPointQueryTest.java | 17 +++++++++++ .../client/value/request/MultiFieldTest.java | 18 ++++++++++++ .../client/value/request/QueryTest.java | 9 ++++++ 6 files changed, 114 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/aliyun/hitsdb/client/value/request/LastPointQuery.java b/src/main/java/com/aliyun/hitsdb/client/value/request/LastPointQuery.java index e5c62fcc..8dae1de6 100644 --- a/src/main/java/com/aliyun/hitsdb/client/value/request/LastPointQuery.java +++ b/src/main/java/com/aliyun/hitsdb/client/value/request/LastPointQuery.java @@ -32,6 +32,8 @@ public static class Builder { private Integer roffset; + private Integer slimit; + private Map> hint; // this field is only allowed for Lindorm TSDB @@ -85,7 +87,7 @@ public Builder queryType(QueryType queryType) { } /** - * only valid for multi field model + * only support for multi field model */ public Builder rlimit(Integer rlimit) { this.rlimit = rlimit; @@ -93,14 +95,21 @@ public Builder rlimit(Integer rlimit) { } /** - * only valid for multi field model + * only support for multi field model */ - public Builder roffset(Integer roffset) { this.roffset = roffset; return this; } + /** + * current only support for super tag model + */ + public Builder slimit(Integer slimit) { + this.slimit = slimit; + return this; + } + public LastPointQuery build() { if (queries == null || queries.isEmpty()) { throw new IllegalArgumentException("the LastPointSubQuery must be set"); @@ -114,6 +123,7 @@ public LastPointQuery build() { query.limit = limit; query.rlimit = rlimit; query.roffset = roffset; + query.slimit = slimit; query.hint = hint; query.queryType = queryType; return query; @@ -137,6 +147,8 @@ public static Builder builder() { private Integer roffset; + private Integer slimit; + /** * Optional tupleFormat parameter. * Used for multi-field latest data points query and show results in tuple format. @@ -215,6 +227,14 @@ public void setRoffset(int roffset) { this.roffset = roffset; } + public Integer getSlimit() { + return slimit; + } + + public void setSLimit(int slimit) { + this.slimit = slimit; + } + public Map> getHint() { return hint; } diff --git a/src/main/java/com/aliyun/hitsdb/client/value/request/MultiFieldSubQuery.java b/src/main/java/com/aliyun/hitsdb/client/value/request/MultiFieldSubQuery.java index 9f72b068..b7024c9f 100644 --- a/src/main/java/com/aliyun/hitsdb/client/value/request/MultiFieldSubQuery.java +++ b/src/main/java/com/aliyun/hitsdb/client/value/request/MultiFieldSubQuery.java @@ -18,6 +18,7 @@ public class MultiFieldSubQuery { private Integer offset; private Integer rlimit; private Integer roffset; + private Integer slimit; private Integer globalLimit; private int index; private Map> hint; @@ -28,6 +29,7 @@ public static class Builder { private Integer offset; private Integer rlimit; private Integer roffset; + private Integer slimit; private Integer globalLimit; private Map tags = new HashMap(); private List filters = new ArrayList(); @@ -64,6 +66,9 @@ public Builder limit(Integer limit) { return this; } + /** + * only support for multi field model + */ public Builder rlimit(Integer rlimit) { if (rlimit != null) { if (rlimit < 0 || rlimit > Integer.MAX_VALUE) { @@ -74,6 +79,9 @@ public Builder rlimit(Integer rlimit) { return this; } + /** + * only support for multi field model + */ public Builder roffset(Integer roffset) { if (roffset != null) { if (roffset < 0 || roffset > Integer.MAX_VALUE) { @@ -84,6 +92,19 @@ public Builder roffset(Integer roffset) { return this; } + /** + * current only support for super tag model + */ + public Builder slimit(Integer slimit) { + if (slimit != null) { + if (slimit < 0 || slimit > Integer.MAX_VALUE) { + throw new IllegalArgumentException("Illegal slimit value."); + } + this.slimit = slimit; + } + return this; + } + @Deprecated public Builder globalLimit(Integer globalLimit) { if (globalLimit != null) { @@ -203,6 +224,10 @@ public MultiFieldSubQuery build() { subQuery.roffset = this.roffset; } + if (this.slimit != null && this.slimit > 0) { + subQuery.slimit = this.slimit; + } + if (this.globalLimit != null && this.globalLimit > 0) { subQuery.globalLimit = this.globalLimit; } @@ -263,6 +288,10 @@ public Integer getRoffset() { return roffset; } + public Integer getSlimit() { + return slimit; + } + public Integer getGlobalLimit() { return globalLimit; } diff --git a/src/main/java/com/aliyun/hitsdb/client/value/request/SubQuery.java b/src/main/java/com/aliyun/hitsdb/client/value/request/SubQuery.java index 03e7b6ea..d7a9e213 100644 --- a/src/main/java/com/aliyun/hitsdb/client/value/request/SubQuery.java +++ b/src/main/java/com/aliyun/hitsdb/client/value/request/SubQuery.java @@ -32,6 +32,7 @@ public class SubQuery { private Boolean explicitTags; private Integer realTimeSeconds; private Integer limit; + private Integer slimit; private Integer globalLimit; private Integer offset; private String dpValue; @@ -48,6 +49,7 @@ public static class Builder { private Boolean delta; private DeltaOptions deltaOptions; private Integer limit; + private Integer slimit; private Integer globalLimit; private Integer offset; private String dpValue; @@ -209,6 +211,14 @@ public Builder limit(Integer limit) { return this; } + /** + * current only support for super tag model + */ + public Builder slimit(Integer slimit) { + this.slimit = slimit; + return this; + } + public Builder globalLimit(Integer globalLimit) { if (limit != null) { this.globalLimit = globalLimit; @@ -336,6 +346,10 @@ public SubQuery build() { subQuery.limit = this.limit; } + if (this.slimit != null && this.slimit > 0) { + subQuery.slimit = this.slimit; + } + if (this.globalLimit != null && this.globalLimit > 0) { subQuery.globalLimit = this.globalLimit; } @@ -465,6 +479,10 @@ public Integer getLimit() { return limit; } + public Integer getSlimit() { + return slimit; + } + public Integer getGlobalLimit() { return globalLimit; } diff --git a/src/test/java/com/aliyun/hitsdb/client/value/request/LastPointQueryTest.java b/src/test/java/com/aliyun/hitsdb/client/value/request/LastPointQueryTest.java index fe63ab24..9ad2829e 100644 --- a/src/test/java/com/aliyun/hitsdb/client/value/request/LastPointQueryTest.java +++ b/src/test/java/com/aliyun/hitsdb/client/value/request/LastPointQueryTest.java @@ -81,4 +81,21 @@ public void testLastRLimit() { String expected = "{\"limit\":{\"from\":1511927280,\"global\":true,\"size\":2},\"queries\":[{\"metric\":\"m1\",\"tags\":{\"k1\":\"v1\"}},{\"metric\":\"m2\",\"tags\":{\"k1\":\"v1\"}}],\"rlimit\":2,\"roffset\":2}"; assertEquals(expected, lastPointQuery.toString()); } + + @Test + public void testLastSLimit() { + Map tags = new HashMap(); + tags.put("k1", "v1"); + LastLimit lastLimit = new LastLimit(1511927280, 2 , true); + + LastPointQuery lastPointQuery = LastPointQuery + .builder() + .slimit(2) + .limit(lastLimit) + .sub(LastPointSubQuery.builder("m1", tags).build()) + .sub(LastPointSubQuery.builder("m2", tags).build()).build(); + + String expected = "{\"limit\":{\"from\":1511927280,\"global\":true,\"size\":2},\"queries\":[{\"metric\":\"m1\",\"tags\":{\"k1\":\"v1\"}},{\"metric\":\"m2\",\"tags\":{\"k1\":\"v1\"}}],\"slimit\":2}"; + assertEquals(expected, lastPointQuery.toString()); + } } diff --git a/src/test/java/com/aliyun/hitsdb/client/value/request/MultiFieldTest.java b/src/test/java/com/aliyun/hitsdb/client/value/request/MultiFieldTest.java index e497eeb6..7bf9877e 100644 --- a/src/test/java/com/aliyun/hitsdb/client/value/request/MultiFieldTest.java +++ b/src/test/java/com/aliyun/hitsdb/client/value/request/MultiFieldTest.java @@ -109,4 +109,22 @@ public void testQueryRLimit() { String expected = "{\"end\":1511937280,\"queries\":[{\"fields\":[{\"aggregator\":\"none\",\"aggregatorType\":\"NONE\",\"delta\":false,\"field\":\"*\",\"rate\":false,\"top\":0}],\"index\":0,\"limit\":4,\"metric\":\"test-test-test\",\"rlimit\":2,\"roffset\":3}],\"start\":1511927280}"; assertEquals(expected, mq.toString()); } + + @Test + public void testQuerySLimit() { + long startTime = 1511927280; + long endTime = 1511937280; + String metric = "test-test-test"; + Map tags = new HashMap(); + tags.put("k1", "v1"); + + MultiFieldQuery mq = MultiFieldQuery.start(startTime).end(endTime).sub( + MultiFieldSubQuery.metric(metric).slimit(2).limit(4).fieldsInfo( + MultiFieldSubQueryDetails.aggregator(Aggregator.NONE).field("*").build() + ).build() + ).build(); + + String expected = "{\"end\":1511937280,\"queries\":[{\"fields\":[{\"aggregator\":\"none\",\"aggregatorType\":\"NONE\",\"delta\":false,\"field\":\"*\",\"rate\":false,\"top\":0}],\"index\":0,\"limit\":4,\"metric\":\"test-test-test\",\"slimit\":2}],\"start\":1511927280}"; + assertEquals(expected, mq.toString()); + } } diff --git a/src/test/java/com/aliyun/hitsdb/client/value/request/QueryTest.java b/src/test/java/com/aliyun/hitsdb/client/value/request/QueryTest.java index 77183c42..e5c61f92 100644 --- a/src/test/java/com/aliyun/hitsdb/client/value/request/QueryTest.java +++ b/src/test/java/com/aliyun/hitsdb/client/value/request/QueryTest.java @@ -57,5 +57,14 @@ public void testQueryTestSerialization() { String serializedString = JSON.toJSONString(query); Assert.assertEquals("{\"queries\":[{\"aggregator\":\"none\",\"index\":0,\"metric\":\"metric\"}],\"start\":4294968}", serializedString); } + { + Query query = Query + .start(4294968) + .showType() + .sub(SubQuery.metric("metric").aggregator(Aggregator.NONE) + .tag(new HashMap()).slimit(2).build()).build(); + String serializedString = JSON.toJSONString(query); + Assert.assertEquals("{\"queries\":[{\"aggregator\":\"none\",\"index\":0,\"metric\":\"metric\",\"slimit\":2}],\"start\":4294968}", serializedString); + } } } From 6468c85bd9267b71c605822e19317e2348bec18d Mon Sep 17 00:00:00 2001 From: JohnnyJie <771886728@qq.com> Date: Wed, 28 Apr 2021 16:20:02 +0800 Subject: [PATCH 3/3] support both set limit,offset,rlimit,roffset,slimit in query or subquery --- .../value/request/LastPointSubQuery.java | 57 ++++++++++++++++ .../client/value/request/MultiFieldQuery.java | 61 +++++++++++++++++ .../value/request/MultiFieldSubQuery.java | 26 ++----- .../hitsdb/client/value/request/Query.java | 67 +++++++++++++++++++ .../value/request/LastPointQueryTest.java | 35 ++++++++++ .../client/value/request/QueryTest.java | 62 +++++++++++++++++ 6 files changed, 288 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/aliyun/hitsdb/client/value/request/LastPointSubQuery.java b/src/main/java/com/aliyun/hitsdb/client/value/request/LastPointSubQuery.java index 233fa4d0..cef084d1 100644 --- a/src/main/java/com/aliyun/hitsdb/client/value/request/LastPointSubQuery.java +++ b/src/main/java/com/aliyun/hitsdb/client/value/request/LastPointSubQuery.java @@ -13,6 +13,14 @@ public class LastPointSubQuery extends HashMap { public static class Builder { private LastPointSubQuery query = new LastPointSubQuery(); + private LastLimit limit; + + private Integer rlimit; + + private Integer roffset; + + private Integer slimit; + public Builder(String metric) { this.query.setMetric(metric); } @@ -37,6 +45,35 @@ public Builder hint(Map> hint) { return this; } + public Builder limit(LastLimit limit) { + this.query.setLimit(limit); + return this; + } + + /** + * only support for multi field model + */ + public Builder rlimit(Integer rlimit) { + this.query.setRlimit(rlimit); + return this; + } + + /** + * only support for multi field model + */ + public Builder roffset(Integer roffset) { + this.query.setRoffset(roffset); + return this; + } + + /** + * current only support for super tag model + */ + public Builder slimit(Integer slimit) { + this.query.setSlimit(slimit); + return this; + } + public LastPointSubQuery build() { // prevent an empty hint map if ((this.query.getHint() != null) && (this.query.getHint().isEmpty())) { @@ -71,6 +108,10 @@ public static Builder builder(List tsuids){ private static final String TAGS = "tags"; private static final String TSUIDS = "tsuids"; private static final String HINT = "hint"; + private static final String LIMIT = "limit"; + private static final String RLIMIT = "rlimit"; + private static final String ROFFSET = "roffset"; + private static final String SLIMIT = "slimit"; public String getMetric() { return (String) this.get(METRIC); @@ -117,4 +158,20 @@ public Map> getHint() { public void setHint(Map> hint) { this.put(HINT, hint); } + + public void setLimit(LastLimit limit) { + this.put(LIMIT, limit); + } + + public void setRlimit(Integer rlimit) { + this.put(RLIMIT, rlimit); + } + + public void setRoffset(Integer roffset) { + this.put(ROFFSET, roffset); + } + + public void setSlimit(Integer slimit) { + this.put(SLIMIT, slimit); + } } diff --git a/src/main/java/com/aliyun/hitsdb/client/value/request/MultiFieldQuery.java b/src/main/java/com/aliyun/hitsdb/client/value/request/MultiFieldQuery.java index 4aef8d49..430d6361 100644 --- a/src/main/java/com/aliyun/hitsdb/client/value/request/MultiFieldQuery.java +++ b/src/main/java/com/aliyun/hitsdb/client/value/request/MultiFieldQuery.java @@ -24,6 +24,11 @@ public class MultiFieldQuery extends JSONValue { // this field is only allowed for Lindorm TSDB @JSONField(name = "type") private String queryType; + private Integer limit; + private Integer offset; + private Integer rlimit; + private Integer roffset; + private Integer slimit; public static class Builder { private Long startTime; @@ -35,6 +40,11 @@ public static class Builder { private Map> hint; // this field is only allowed for Lindorm TSDB private String queryType; + private Integer limit; + private Integer offset; + private Integer rlimit; + private Integer roffset; + private Integer slimit; /** * 1970-02-20 00:59:28 @@ -109,6 +119,31 @@ public Builder queryType(QueryType queryType) { return this; } + public Builder limit(int limit) { + this.limit = limit; + return this; + } + + public Builder offset(int offset) { + this.offset = offset; + return this; + } + + public Builder rlimit(int rlimit) { + this.rlimit = rlimit; + return this; + } + + public Builder roffset(int roffset) { + this.roffset = roffset; + return this; + } + + public Builder slimit(int slimit) { + this.slimit = slimit; + return this; + } + public Builder sub(MultiFieldSubQuery... subQuerys) { for (MultiFieldSubQuery subQuery : subQuerys) { subQueryList.add(subQuery); @@ -153,6 +188,11 @@ public MultiFieldQuery build() { query.types = this.types; query.hint = this.hint; query.queryType = this.queryType; + query.limit = this.limit; + query.offset = this.offset; + query.rlimit = this.rlimit; + query.roffset = this.roffset; + query.slimit = this.slimit; return query; } } @@ -249,4 +289,25 @@ public String getQueryType() { public void setQueryType(QueryType queryType) { this.queryType = queryType.getName(); } + + + public Integer getLimit() { + return limit; + } + + public Integer getOffset() { + return offset; + } + + public Integer getRlimit() { + return rlimit; + } + + public Integer getRoffset() { + return roffset; + } + + public Integer getSlimit() { + return slimit; + } } diff --git a/src/main/java/com/aliyun/hitsdb/client/value/request/MultiFieldSubQuery.java b/src/main/java/com/aliyun/hitsdb/client/value/request/MultiFieldSubQuery.java index b7024c9f..be81d1de 100644 --- a/src/main/java/com/aliyun/hitsdb/client/value/request/MultiFieldSubQuery.java +++ b/src/main/java/com/aliyun/hitsdb/client/value/request/MultiFieldSubQuery.java @@ -212,30 +212,16 @@ public MultiFieldSubQuery build() { } subQuery.fields = this.fieldsInfo; - if (this.limit != null && this.limit > 0) { - subQuery.limit = this.limit; - } - - if (this.rlimit != null && this.rlimit > 0) { - subQuery.rlimit = this.rlimit; - } - - if (this.roffset != null && this.roffset > 0) { - subQuery.roffset = this.roffset; - } - - if (this.slimit != null && this.slimit > 0) { - subQuery.slimit = this.slimit; - } - + // TSDB Server will set limit, offset, rlimit, roffset, slimit for subquery if (this.globalLimit != null && this.globalLimit > 0) { subQuery.globalLimit = this.globalLimit; } - if (this.offset != null && this.offset > 0) { - subQuery.offset = this.offset; - } - + subQuery.limit = limit; + subQuery.offset = offset; + subQuery.slimit = slimit; + subQuery.rlimit = rlimit; + subQuery.roffset = roffset; subQuery.hint = this.hint; return subQuery; diff --git a/src/main/java/com/aliyun/hitsdb/client/value/request/Query.java b/src/main/java/com/aliyun/hitsdb/client/value/request/Query.java index d1ec5273..02894792 100644 --- a/src/main/java/com/aliyun/hitsdb/client/value/request/Query.java +++ b/src/main/java/com/aliyun/hitsdb/client/value/request/Query.java @@ -24,6 +24,9 @@ public class Query extends JSONValue { // this field is only allowed for Lindorm TSDB @JSONField(name = "type") private String queryType; + private Integer limit; + private Integer offset; + private Integer slimit; public static class Builder { private Long startTime; @@ -35,6 +38,9 @@ public static class Builder { private Class type; // this field is only allowed for Lindorm TSDB private String queryType; + private Integer limit; + private Integer offset; + private Integer slimit; private Map> hint; /** @@ -89,6 +95,39 @@ public Builder queryType(QueryType queryType) { return this; } + public Builder limit(Integer limit) { + if (limit != null) { + if (limit < 0 || limit > Integer.MAX_VALUE) { + throw new IllegalArgumentException("Illegal limit value."); + } + this.limit = limit; + } + return this; + } + + public Builder offset(Integer offset) { + if (offset != null) { + if (offset < 0 || offset > Integer.MAX_VALUE) { + throw new IllegalArgumentException("Illegal offset value."); + } + this.offset = offset; + } + return this; + } + + /** + * current only support for super tag model + */ + public Builder slimit(Integer slimit) { + if (slimit != null) { + if (slimit < 0 || slimit > Integer.MAX_VALUE) { + throw new IllegalArgumentException("Illegal slimit value."); + } + this.slimit = slimit; + } + return this; + } + public Builder sub(SubQuery... subQuerys) { int newIndex = subQueryList.size(); int i = 0; @@ -178,6 +217,9 @@ public Query build() { query.type = this.type; query.hint = this.hint; query.queryType = queryType; + query.limit = limit; + query.offset = offset; + query.slimit = slimit; return query; } @@ -279,4 +321,29 @@ public String getQueryType() { public void setQueryType(QueryType queryType) { this.queryType = queryType.getName(); } + + + public Integer getLimit() { + return limit; + } + + public void setLimit(Integer limit) { + this.limit = limit; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + + public Integer getSlimit() { + return slimit; + } + + public void setSlimit(Integer slimit) { + this.slimit = slimit; + } } diff --git a/src/test/java/com/aliyun/hitsdb/client/value/request/LastPointQueryTest.java b/src/test/java/com/aliyun/hitsdb/client/value/request/LastPointQueryTest.java index 9ad2829e..7a383aac 100644 --- a/src/test/java/com/aliyun/hitsdb/client/value/request/LastPointQueryTest.java +++ b/src/test/java/com/aliyun/hitsdb/client/value/request/LastPointQueryTest.java @@ -33,6 +33,41 @@ public void testLastPointQuerySerialization() { String serializedString = JSON.toJSONString(query); Assert.assertEquals("{\"msResolution\":true,\"queries\":[{\"metric\":\"wind1\",\"fields\":[\"*\"],\"tags\":{}}],\"tupleFormat\":true}", serializedString); } + { + LastPointQuery query = LastPointQuery + .builder() + .msResolution(true) + .tupleFormat(true) + .slimit(1) + .limit(new LastLimit(1, 2)) + .roffset(3) + .rlimit(4) + .sub(LastPointSubQuery.builder("wind1", new ArrayList() {{add("*");}}, new HashMap()).build()).build(); + String serializedString = JSON.toJSONString(query); + Assert.assertEquals("{\"limit\":{\"from\":1,\"global\":false,\"size\":2},\"msResolution\":true,\"queries\":[{\"metric\":\"wind1\",\"fields\":[\"*\"],\"tags\":{}}],\"rlimit\":4,\"roffset\":3,\"slimit\":1,\"tupleFormat\":true}", serializedString); + } + + { + LastPointQuery query = LastPointQuery + .builder() + .msResolution(true) + .tupleFormat(true) + .slimit(1) + .limit(new LastLimit(1, 2)) + .roffset(3) + .rlimit(4) + .sub(LastPointSubQuery + .builder("wind1", new ArrayList() {{add("*");}}, new HashMap()) + .slimit(5) + .limit(new LastLimit(1, 6)) + .roffset(7) + .rlimit(8) + .build()) + .build(); + String serializedString = JSON.toJSONString(query); + Assert.assertEquals("{\"limit\":{\"from\":1,\"global\":false,\"size\":2},\"msResolution\":true,\"queries\":[{\"rlimit\":8,\"metric\":\"wind1\",\"slimit\":5,\"limit\":{\"from\":1,\"global\":false,\"size\":6},\"roffset\":7,\"fields\":[\"*\"],\"tags\":{}}],\"rlimit\":4,\"roffset\":3,\"slimit\":1,\"tupleFormat\":true}", serializedString); + } + } @Test diff --git a/src/test/java/com/aliyun/hitsdb/client/value/request/QueryTest.java b/src/test/java/com/aliyun/hitsdb/client/value/request/QueryTest.java index e5c61f92..7344ea17 100644 --- a/src/test/java/com/aliyun/hitsdb/client/value/request/QueryTest.java +++ b/src/test/java/com/aliyun/hitsdb/client/value/request/QueryTest.java @@ -34,6 +34,41 @@ public void testMultiFieldQueryTestSerialization() { String serializedString = JSON.toJSONString(query); Assert.assertEquals("{\"queries\":[{\"fields\":[{\"aggregator\":\"none\",\"aggregatorType\":\"NONE\",\"delta\":false,\"field\":\"*\",\"rate\":false,\"top\":0}],\"index\":0,\"metric\":\"wind1\"}],\"start\":4294968}", serializedString); } + { + MultiFieldQuery query = MultiFieldQuery + .start(4294968) + .slimit(1) + .limit(2) + .offset(3) + .rlimit(4) + .roffset(5) + .sub(MultiFieldSubQuery.metric("wind1") + .fieldsInfo(MultiFieldSubQueryDetails.field("*").aggregator(Aggregator.NONE).build()) + .build()) + .build(); + String serializedString = JSON.toJSONString(query); + Assert.assertEquals("{\"limit\":2,\"offset\":3,\"queries\":[{\"fields\":[{\"aggregator\":\"none\",\"aggregatorType\":\"NONE\",\"delta\":false,\"field\":\"*\",\"rate\":false,\"top\":0}],\"index\":0,\"metric\":\"wind1\"}],\"rlimit\":4,\"roffset\":5,\"slimit\":1,\"start\":4294968}", serializedString); + } + { + MultiFieldQuery query = MultiFieldQuery + .start(4294968) + .slimit(1) + .limit(2) + .offset(3) + .rlimit(4) + .roffset(5) + .sub(MultiFieldSubQuery.metric("wind1") + .slimit(6) + .limit(7) + .offset(8) + .rlimit(9) + .roffset(10) + .fieldsInfo(MultiFieldSubQueryDetails.field("*").aggregator(Aggregator.NONE).build()) + .build()) + .build(); + String serializedString = JSON.toJSONString(query); + Assert.assertEquals("{\"limit\":2,\"offset\":3,\"queries\":[{\"fields\":[{\"aggregator\":\"none\",\"aggregatorType\":\"NONE\",\"delta\":false,\"field\":\"*\",\"rate\":false,\"top\":0}],\"index\":0,\"limit\":7,\"metric\":\"wind1\",\"offset\":8,\"rlimit\":9,\"roffset\":10,\"slimit\":6}],\"rlimit\":4,\"roffset\":5,\"slimit\":1,\"start\":4294968}", serializedString); + } } @Test @@ -66,5 +101,32 @@ public void testQueryTestSerialization() { String serializedString = JSON.toJSONString(query); Assert.assertEquals("{\"queries\":[{\"aggregator\":\"none\",\"index\":0,\"metric\":\"metric\",\"slimit\":2}],\"start\":4294968}", serializedString); } + + { + Query query = Query + .start(4294968) + .slimit(1) + .limit(2) + .offset(3) + .sub(SubQuery.metric("metric").aggregator(Aggregator.NONE) + .tag(new HashMap()).slimit(2).build()).build(); + String serializedString = JSON.toJSONString(query); + Assert.assertEquals("{\"limit\":2,\"offset\":3,\"queries\":[{\"aggregator\":\"none\",\"index\":0,\"metric\":\"metric\",\"slimit\":2}],\"slimit\":1,\"start\":4294968}", serializedString); + } + + { + Query query = Query + .start(4294968) + .slimit(1) + .limit(2) + .offset(3) + .sub(SubQuery.metric("metric").aggregator(Aggregator.NONE) + .slimit(4) + .limit(5) + .offset(6) + .tag(new HashMap()).build()).build(); + String serializedString = JSON.toJSONString(query); + Assert.assertEquals("{\"limit\":2,\"offset\":3,\"queries\":[{\"aggregator\":\"none\",\"index\":0,\"limit\":5,\"metric\":\"metric\",\"offset\":6,\"slimit\":4}],\"slimit\":1,\"start\":4294968}", serializedString); + } } }