This is an automated email from the ASF dual-hosted git repository. wankai pushed a commit to branch match-query in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb-java-client.git
commit 1f60f77485da55fd4cecace86104afd4aac1fd0d Author: wankai123 <[email protected]> AuthorDate: Tue Sep 24 11:33:23 2024 +0800 Support Match Query proto. --- CHANGES.md | 1 + README.md | 2 +- .../banyandb/v1/client/PairQueryCondition.java | 42 +++++++++++++++++--- src/main/proto/banyandb/v1/banyandb-database.proto | 33 ++++++++++------ src/main/proto/banyandb/v1/banyandb-model.proto | 45 ++++++++++++++++++---- .../banyandb/v1/client/BanyanDBClientTestCI.java | 2 +- .../v1/client/ITBanyanDBStreamQueryTests.java | 3 +- .../v1/client/ITIndexRuleMetadataRegistryTest.java | 8 ++-- 8 files changed, 104 insertions(+), 32 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 690c255..9c5fd2a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,6 +8,7 @@ Release Notes. ### Features * Remove analyze DNS name to get/refresh IP for create connection. +* Support Match Query proto. 0.7.0-rc3 ------------------ diff --git a/README.md b/README.md index 3df5d88..de01823 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ IndexRule.Builder ir = IndexRule.newBuilder() .setName("trace_id")) .addTags("trace_id") .setType(IndexRule.Type.TYPE_INVERTED) - .setAnalyzer(IndexRule.Analyzer.ANALYZER_UNSPECIFIED); + .setAnalyzer("simple"); client.define(ir.build()); ``` diff --git a/src/main/java/org/apache/skywalking/banyandb/v1/client/PairQueryCondition.java b/src/main/java/org/apache/skywalking/banyandb/v1/client/PairQueryCondition.java index 4f8a9bb..84e90ef 100644 --- a/src/main/java/org/apache/skywalking/banyandb/v1/client/PairQueryCondition.java +++ b/src/main/java/org/apache/skywalking/banyandb/v1/client/PairQueryCondition.java @@ -19,6 +19,7 @@ package org.apache.skywalking.banyandb.v1.client; import org.apache.skywalking.banyandb.model.v1.BanyandbModel; +import org.apache.skywalking.banyandb.model.v1.BanyandbModel.Condition.MatchOption; import java.util.List; @@ -28,19 +29,33 @@ import java.util.List; public abstract class PairQueryCondition<T> extends AbstractCriteria { protected final BanyandbModel.Condition.BinaryOp op; private final TagAndValue<T> tagAndValue; + private final MatchOption matchOption; private PairQueryCondition(BanyandbModel.Condition.BinaryOp op, TagAndValue<T> tagAndValue) { this.op = op; this.tagAndValue = tagAndValue; + this.matchOption = MatchOption.getDefaultInstance(); + } + + private PairQueryCondition(BanyandbModel.Condition.BinaryOp op, + TagAndValue<T> tagAndValue, + MatchOption matchOption) { + this.op = op; + this.tagAndValue = tagAndValue; + this.matchOption = matchOption; } @Override public BanyandbModel.Criteria build() { + BanyandbModel.Condition.Builder condition = BanyandbModel.Condition.newBuilder() + .setName(this.tagAndValue.getTagName()) + .setOp(this.op) + .setValue(this.tagAndValue.buildTypedTagValue()); + if (this.matchOption != null) { + condition.setMatchOption(this.matchOption); + } return BanyandbModel.Criteria.newBuilder() - .setCondition(BanyandbModel.Condition.newBuilder() - .setName(this.tagAndValue.getTagName()) - .setOp(this.op) - .setValue(this.tagAndValue.buildTypedTagValue()).build()) + .setCondition(condition.build()) .build(); } @@ -138,6 +153,10 @@ public abstract class PairQueryCondition<T> extends AbstractCriteria { super(op, new TagAndValue.StringTagPair(tagName, value)); } + private StringQueryCondition(String tagName, BanyandbModel.Condition.BinaryOp op, String value, MatchOption matchOption) { + super(op, new TagAndValue.StringTagPair(tagName, value), matchOption); + } + /** * Build a query condition for {@link String} type * and {@link BanyandbModel.Condition.BinaryOp#BINARY_OP_EQ} as the relation @@ -168,11 +187,24 @@ public abstract class PairQueryCondition<T> extends AbstractCriteria { * * @param tagName name of the tag * @param val value of the tag - * @return a query that `String != value` + * @return a query that `String match value` */ public static PairQueryCondition<String> match(String tagName, String val) { return new StringQueryCondition(tagName, BanyandbModel.Condition.BinaryOp.BINARY_OP_MATCH, val); } + + /** + * Build a query condition for {@link String} type + * and {@link BanyandbModel.Condition.BinaryOp#BINARY_OP_MATCH} as the relation + * + * @param tagName name of the tag + * @param val value of the tag + * @param matchOption set the specific match options + * @return a query that `match value` + */ + public static PairQueryCondition<String> match(String tagName, String val, MatchOption matchOption) { + return new StringQueryCondition(tagName, BanyandbModel.Condition.BinaryOp.BINARY_OP_MATCH, val, matchOption); + } } /** diff --git a/src/main/proto/banyandb/v1/banyandb-database.proto b/src/main/proto/banyandb/v1/banyandb-database.proto index 3f4aebe..de642b1 100644 --- a/src/main/proto/banyandb/v1/banyandb-database.proto +++ b/src/main/proto/banyandb/v1/banyandb-database.proto @@ -94,6 +94,8 @@ message FieldSpec { EncodingMethod encoding_method = 3 [(validate.rules).enum.defined_only = true]; // compression_method indicates how to compress data during writing CompressionMethod compression_method = 4 [(validate.rules).enum.defined_only = true]; + // aggregate_function indicates how to aggregate data + model.v1.MeasureAggregate aggregate_function = 5; } // Measure intends to store data point @@ -113,6 +115,13 @@ message Measure { google.protobuf.Timestamp updated_at = 6; } +message MeasureAggregateFunction { + // type indicates the type of function argument + FieldType type = 1 [(validate.rules).enum.defined_only = true]; + // aggregate_function indicates specific function for measure data + model.v1.MeasureAggregate aggregate_function = 2; +} + // TopNAggregation generates offline TopN statistics for a measure's TopN approximation message TopNAggregation { // metadata is the identity of an aggregation @@ -157,19 +166,18 @@ message IndexRule { Type type = 3 [(validate.rules).enum.defined_only = true]; // updated_at indicates when the IndexRule is updated google.protobuf.Timestamp updated_at = 4; - enum Analyzer { - ANALYZER_UNSPECIFIED = 0; - // Keyword analyzer is a “noop” analyzer which returns the entire input string as a single token. - ANALYZER_KEYWORD = 1; - // Standard analyzer provides grammar based tokenization - ANALYZER_STANDARD = 2; - // Simple analyzer breaks text into tokens at any non-letter character, - // such as numbers, spaces, hyphens and apostrophes, discards non-letter characters, - // and changes uppercase to lowercase. - ANALYZER_SIMPLE = 3; - } + // analyzer analyzes tag value to support the full-text searching for TYPE_INVERTED indices. - Analyzer analyzer = 5; + // available analyzers are: + // - "standard" provides grammar based tokenization + // - "simple" breaks text into tokens at any non-letter character, + // such as numbers, spaces, hyphens and apostrophes, discards non-letter characters, + // and changes uppercase to lowercase. + // - "keyword" is a “noop” analyzer which returns the entire input string as a single token. + // - "url" breaks test into tokens at any non-letter and non-digit character. + string analyzer = 5; + // no_sort indicates whether the index is not for sorting. + bool no_sort = 6; } // Subject defines which stream or measure would generate indices @@ -200,6 +208,7 @@ message IndexRuleBinding { google.protobuf.Timestamp updated_at = 6; } + message StreamRegistryServiceCreateRequest { banyandb.database.v1.Stream stream = 1; } diff --git a/src/main/proto/banyandb/v1/banyandb-model.proto b/src/main/proto/banyandb/v1/banyandb-model.proto index 09824e3..5b4b2d3 100644 --- a/src/main/proto/banyandb/v1/banyandb-model.proto +++ b/src/main/proto/banyandb/v1/banyandb-model.proto @@ -25,10 +25,6 @@ import "google/protobuf/timestamp.proto"; import "google/protobuf/struct.proto"; import "validate/validate.proto"; -message ID { - string value = 1; -} - message Str { string value = 1; } @@ -57,7 +53,6 @@ message TagValue { Int int = 4; IntArray int_array = 5; bytes binary_data = 6; - ID id = 7; } } @@ -84,6 +79,32 @@ enum AggregationFunction { AGGREGATION_FUNCTION_SUM = 5; } +enum MeasureAggregate { + MEASURE_AGGREGATE_UNSPECIFIED = 0; + // Calculate the minimum value of delta measures. + MEASURE_AGGREGATE_MIN = 1; + // Calculate the maximum value of delta measures. + MEASURE_AGGREGATE_MAX = 2; + // Count the number of delta measures. + MEASURE_AGGREGATE_COUNT = 3; + // Calculate the sum value of delta measures. + MEASURE_AGGREGATE_SUM = 4; + // Calculate the average value of delta measures. + MEASURE_AGGREGATE_AVG = 5; + // Calculate the percentage of delta measures, where the input matches with the condition. + MEASURE_AGGREGATE_PERCENT = 6; + // Calculate the ratio for measures, where the input matches with the condition. + MEASURE_AGGREGATE_RATE = 7; + // Calculate the histogram for delta measures. + MEASURE_AGGREGATE_HISTOGRAM = 8; + // Calculate the {p99, p95, p90, p75, p50} for delta measures. + MEASURE_AGGREGATE_PERCENTILE2 = 9; + // Calculate the apdex for delta measures. + MEASURE_AGGREGATE_APDEX = 10; + // Same like PERCENTILE2, little different on algorithm. + MEASURE_AGGREGATE_PERCENTILE = 11; +} + // Pair is the building block of a record which is equivalent to a key-value pair. // In the context of Trace, it could be metadata of a trace such as service_name, service_instance, etc. // Besides, other tags are organized in key-value pair in the underlying storage layer. @@ -126,6 +147,16 @@ message Condition { string name = 1; BinaryOp op = 2; TagValue value = 3; + message MatchOption { + string analyzer = 1; + enum Operator { + OPERATOR_UNSPECIFIED = 0; + OPERATOR_AND = 1; + OPERATOR_OR = 2; + } + Operator operator = 2; + } + MatchOption match_option = 4; } // tag_families are indexed. @@ -168,7 +199,7 @@ message TagProjection { string name = 1; repeated string tags = 2; } - repeated TagFamily tag_families = 1 [(validate.rules).repeated.min_items = 1]; + repeated TagFamily tag_families = 1; } // TimeRange is a range query for uint64, @@ -186,4 +217,4 @@ enum Status { STATUS_NOT_FOUND = 3; STATUS_EXPIRED_SCHEMA = 4; STATUS_INTERNAL_ERROR = 5; -} \ No newline at end of file +} diff --git a/src/test/java/org/apache/skywalking/banyandb/v1/client/BanyanDBClientTestCI.java b/src/test/java/org/apache/skywalking/banyandb/v1/client/BanyanDBClientTestCI.java index 1a68f98..c7cdd6c 100644 --- a/src/test/java/org/apache/skywalking/banyandb/v1/client/BanyanDBClientTestCI.java +++ b/src/test/java/org/apache/skywalking/banyandb/v1/client/BanyanDBClientTestCI.java @@ -31,7 +31,7 @@ import java.io.IOException; public class BanyanDBClientTestCI { private static final String REGISTRY = "ghcr.io"; private static final String IMAGE_NAME = "apache/skywalking-banyandb"; - private static final String TAG = "a528a5d99745c8fa978c135b8bda2685c50cda95"; + private static final String TAG = "9770bf48f9b88574683f56e2a137555cd68066d9"; private static final String IMAGE = REGISTRY + "/" + IMAGE_NAME + ":" + TAG; diff --git a/src/test/java/org/apache/skywalking/banyandb/v1/client/ITBanyanDBStreamQueryTests.java b/src/test/java/org/apache/skywalking/banyandb/v1/client/ITBanyanDBStreamQueryTests.java index 5d8d255..c4f2573 100644 --- a/src/test/java/org/apache/skywalking/banyandb/v1/client/ITBanyanDBStreamQueryTests.java +++ b/src/test/java/org/apache/skywalking/banyandb/v1/client/ITBanyanDBStreamQueryTests.java @@ -213,8 +213,7 @@ public class ITBanyanDBStreamQueryTests extends BanyanDBClientTestCI { .setGroup("sw_record") .setName("trace_id")) .addTags("trace_id") - .setType(IndexRule.Type.TYPE_INVERTED) - .setAnalyzer(IndexRule.Analyzer.ANALYZER_UNSPECIFIED); + .setType(IndexRule.Type.TYPE_INVERTED); return builder.build(); } diff --git a/src/test/java/org/apache/skywalking/banyandb/v1/client/ITIndexRuleMetadataRegistryTest.java b/src/test/java/org/apache/skywalking/banyandb/v1/client/ITIndexRuleMetadataRegistryTest.java index b6113cf..7463e72 100644 --- a/src/test/java/org/apache/skywalking/banyandb/v1/client/ITIndexRuleMetadataRegistryTest.java +++ b/src/test/java/org/apache/skywalking/banyandb/v1/client/ITIndexRuleMetadataRegistryTest.java @@ -87,12 +87,12 @@ public class ITIndexRuleMetadataRegistryTest extends BanyanDBClientTestCI { public void testIndexRuleRegistry_createAndUpdate() throws BanyanDBException { this.client.define(buildIndexRule()); IndexRule before = client.findIndexRule("sw_record", "trace_id"); - Assert.assertEquals(IndexRule.Analyzer.ANALYZER_SIMPLE, before.getAnalyzer()); - IndexRule updatedIndexRule = before.toBuilder().setAnalyzer(IndexRule.Analyzer.ANALYZER_STANDARD).build(); + Assert.assertEquals("simple", before.getAnalyzer()); + IndexRule updatedIndexRule = before.toBuilder().setAnalyzer("standard").build(); this.client.update(updatedIndexRule); IndexRule after = this.client.findIndexRule("sw_record", "trace_id"); Assert.assertNotNull(after); - Assert.assertEquals(IndexRule.Analyzer.ANALYZER_STANDARD, after.getAnalyzer()); + Assert.assertEquals("standard", after.getAnalyzer()); } @Test @@ -111,7 +111,7 @@ public class ITIndexRuleMetadataRegistryTest extends BanyanDBClientTestCI { .setName("trace_id")) .addTags("trace_id") .setType(IndexRule.Type.TYPE_INVERTED) - .setAnalyzer(IndexRule.Analyzer.ANALYZER_SIMPLE); + .setAnalyzer("simple"); return builder.build(); } }
