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();
     }
 }

Reply via email to