You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by lu...@apache.org on 2022/04/05 14:10:51 UTC

[skywalking-banyandb-java-client] 01/01: adjust API and add property support

This is an automated email from the ASF dual-hosted git repository.

lujiajing pushed a commit to branch add-property-api
in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb-java-client.git

commit ec26b4b3c22fbeb63c53e08407b34487ec4f10d2
Author: Megrez Lu <lu...@gmail.com>
AuthorDate: Tue Apr 5 22:10:35 2022 +0800

    adjust API and add property support
---
 .../banyandb/v1/client/PairQueryCondition.java     | 64 ++++-----------
 .../skywalking/banyandb/v1/client/TagAndValue.java | 67 +++++++++++++++-
 .../banyandb/v1/client/metadata/Property.java      | 75 ++++++++++++++++++
 src/main/proto/banyandb/v1/banyandb-property.proto | 90 ++++++++++++++++++++++
 4 files changed, 244 insertions(+), 52 deletions(-)

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 ff7540f..f2f2b0c 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
@@ -25,43 +25,32 @@ import java.util.List;
 /**
  * PairQuery represents a query condition, including tag name, operator, and value(s);
  */
-public abstract class PairQueryCondition<T> extends TagAndValue<T> {
+public abstract class PairQueryCondition<T> {
     protected final BanyandbModel.Condition.BinaryOp op;
+    private final TagAndValue<T> tagAndValue;
 
-    private PairQueryCondition(String tagName, BanyandbModel.Condition.BinaryOp op, T value) {
-        super(tagName, value);
+    private PairQueryCondition(BanyandbModel.Condition.BinaryOp op, TagAndValue<T> tagAndValue) {
         this.op = op;
+        this.tagAndValue = tagAndValue;
     }
 
     BanyandbModel.Condition build() {
         return BanyandbModel.Condition.newBuilder()
-                .setName(this.tagName)
+                .setName(this.tagAndValue.getTagName())
                 .setOp(this.op)
-                .setValue(buildTypedPair()).build();
+                .setValue(this.tagAndValue.buildTypedTagValue()).build();
     }
 
-    /**
-     * The various implementations should build different TypedPair
-     *
-     * @return typedPair to be included
-     */
-    protected abstract BanyandbModel.TagValue buildTypedPair();
+    public String getTagName() {
+        return this.tagAndValue.getTagName();
+    }
 
     /**
      * LongQueryCondition represents `tag(Long) $op value` condition.
      */
     public static class LongQueryCondition extends PairQueryCondition<Long> {
         private LongQueryCondition(String tagName, BanyandbModel.Condition.BinaryOp op, Long value) {
-            super(tagName, op, value);
-        }
-
-        @Override
-        protected BanyandbModel.TagValue buildTypedPair() {
-            return BanyandbModel.TagValue.newBuilder()
-                    .setInt(BanyandbModel.Int
-                            .newBuilder()
-                            .setValue(value).build())
-                    .build();
+            super(op, new TagAndValue.LongTagPair(tagName, value));
         }
 
         /**
@@ -142,16 +131,7 @@ public abstract class PairQueryCondition<T> extends TagAndValue<T> {
      */
     public static class StringQueryCondition extends PairQueryCondition<String> {
         private StringQueryCondition(String tagName, BanyandbModel.Condition.BinaryOp op, String value) {
-            super(tagName, op, value);
-        }
-
-        @Override
-        protected BanyandbModel.TagValue buildTypedPair() {
-            return BanyandbModel.TagValue.newBuilder()
-                    .setStr(BanyandbModel.Str
-                            .newBuilder()
-                            .setValue(value).build())
-                    .build();
+            super(op, new TagAndValue.StringTagPair(tagName, value));
         }
 
         /**
@@ -184,16 +164,7 @@ public abstract class PairQueryCondition<T> extends TagAndValue<T> {
      */
     public static class StringArrayQueryCondition extends PairQueryCondition<List<String>> {
         private StringArrayQueryCondition(String tagName, BanyandbModel.Condition.BinaryOp op, List<String> value) {
-            super(tagName, op, value);
-        }
-
-        @Override
-        protected BanyandbModel.TagValue buildTypedPair() {
-            return BanyandbModel.TagValue.newBuilder()
-                    .setStrArray(BanyandbModel.StrArray
-                            .newBuilder()
-                            .addAllValue(value).build())
-                    .build();
+            super(op, new TagAndValue.StringArrayTagPair(tagName, value));
         }
 
         /**
@@ -250,16 +221,7 @@ public abstract class PairQueryCondition<T> extends TagAndValue<T> {
      */
     public static class LongArrayQueryCondition extends PairQueryCondition<List<Long>> {
         private LongArrayQueryCondition(String tagName, BanyandbModel.Condition.BinaryOp op, List<Long> value) {
-            super(tagName, op, value);
-        }
-
-        @Override
-        protected BanyandbModel.TagValue buildTypedPair() {
-            return BanyandbModel.TagValue.newBuilder()
-                    .setIntArray(BanyandbModel.IntArray
-                            .newBuilder()
-                            .addAllValue(value).build())
-                    .build();
+            super(op, new TagAndValue.LongArrayTagPair(tagName, value));
         }
 
         /**
diff --git a/src/main/java/org/apache/skywalking/banyandb/v1/client/TagAndValue.java b/src/main/java/org/apache/skywalking/banyandb/v1/client/TagAndValue.java
index afab5b6..cf4ad0f 100644
--- a/src/main/java/org/apache/skywalking/banyandb/v1/client/TagAndValue.java
+++ b/src/main/java/org/apache/skywalking/banyandb/v1/client/TagAndValue.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.banyandb.v1.client;
 import java.util.List;
 
 import com.google.protobuf.ByteString;
+import com.google.protobuf.NullValue;
 import lombok.EqualsAndHashCode;
 import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
 
@@ -50,7 +51,21 @@ public abstract class TagAndValue<T> extends Value<T> {
         return this.value == null;
     }
 
-    static TagAndValue<?> build(BanyandbModel.Tag tag) {
+    /**
+     * TagValue is referenced from various derived data structs.
+     *
+     * @return TagValue to be included
+     */
+    protected abstract BanyandbModel.TagValue buildTypedTagValue();
+
+    public BanyandbModel.Tag build() {
+        return BanyandbModel.Tag.newBuilder()
+                .setKey(this.tagName)
+                .setValue(buildTypedTagValue())
+                .build();
+    }
+
+    static TagAndValue<?> fromProtobuf(BanyandbModel.Tag tag) {
         switch (tag.getValue().getValueCase()) {
             case INT:
                 return new LongTagPair(tag.getKey(), tag.getValue().getInt().getValue());
@@ -73,30 +88,73 @@ public abstract class TagAndValue<T> extends Value<T> {
         StringTagPair(final String tagName, final String value) {
             super(tagName, value);
         }
+
+        @Override
+        protected BanyandbModel.TagValue buildTypedTagValue() {
+            return BanyandbModel.TagValue.newBuilder()
+                    .setStr(BanyandbModel.Str
+                            .newBuilder()
+                            .setValue(value).build())
+                    .build();
+        }
     }
 
     public static class StringArrayTagPair extends TagAndValue<List<String>> {
         StringArrayTagPair(final String tagName, final List<String> value) {
             super(tagName, value);
         }
+
+        @Override
+        protected BanyandbModel.TagValue buildTypedTagValue() {
+            return BanyandbModel.TagValue.newBuilder()
+                    .setStrArray(BanyandbModel.StrArray
+                            .newBuilder()
+                            .addAllValue(value).build())
+                    .build();
+        }
     }
 
     public static class LongTagPair extends TagAndValue<Long> {
         LongTagPair(final String tagName, final Long value) {
             super(tagName, value);
         }
+
+        @Override
+        protected BanyandbModel.TagValue buildTypedTagValue() {
+            return BanyandbModel.TagValue.newBuilder()
+                    .setInt(BanyandbModel.Int
+                            .newBuilder()
+                            .setValue(value).build())
+                    .build();
+        }
     }
 
     public static class LongArrayTagPair extends TagAndValue<List<Long>> {
         LongArrayTagPair(final String tagName, final List<Long> value) {
             super(tagName, value);
         }
+
+        @Override
+        protected BanyandbModel.TagValue buildTypedTagValue() {
+            return BanyandbModel.TagValue.newBuilder()
+                    .setIntArray(BanyandbModel.IntArray
+                            .newBuilder()
+                            .addAllValue(value).build())
+                    .build();
+        }
     }
 
     public static class BinaryTagPair extends TagAndValue<ByteString> {
         public BinaryTagPair(String fieldName, ByteString byteString) {
             super(fieldName, byteString);
         }
+
+        @Override
+        protected BanyandbModel.TagValue buildTypedTagValue() {
+            return BanyandbModel.TagValue.newBuilder()
+                    .setBinaryData(this.value)
+                    .build();
+        }
     }
 
     public static class NullTagPair extends TagAndValue<Void> {
@@ -104,6 +162,13 @@ public abstract class TagAndValue<T> extends Value<T> {
             super(tagName, null);
         }
 
+        @Override
+        protected BanyandbModel.TagValue buildTypedTagValue() {
+            return BanyandbModel.TagValue.newBuilder()
+                    .setNull(NullValue.NULL_VALUE)
+                    .build();
+        }
+
         @Override
         public boolean isNull() {
             return true;
diff --git a/src/main/java/org/apache/skywalking/banyandb/v1/client/metadata/Property.java b/src/main/java/org/apache/skywalking/banyandb/v1/client/metadata/Property.java
new file mode 100644
index 0000000..5669bc2
--- /dev/null
+++ b/src/main/java/org/apache/skywalking/banyandb/v1/client/metadata/Property.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.banyandb.v1.client.metadata;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
+import org.apache.skywalking.banyandb.property.v1.BanyandbProperty;
+import org.apache.skywalking.banyandb.v1.client.TagAndValue;
+
+import java.time.ZonedDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+@AutoValue
+public abstract class Property extends NamedSchema<BanyandbProperty.Property> {
+    abstract String id();
+
+    abstract ImmutableList<TagAndValue<?>> tags();
+
+    @Override
+    public BanyandbProperty.Property serialize() {
+        List<BanyandbModel.Tag> tags = new ArrayList<>(this.tags().size());
+        for (final TagAndValue<?> tagAndValue : this.tags()) {
+            tags.add(tagAndValue.build());
+        }
+        return BanyandbProperty.Property.newBuilder()
+                .setMetadata(BanyandbProperty.Metadata.newBuilder()
+                        .setId(id())
+                        .setContainer(buildMetadata())
+                        .build())
+                .addAllTags(tags)
+                .build();
+    }
+
+    public static Builder create(String group, String name, String id) {
+        return new AutoValue_Property.Builder().setGroup(group).setName(name).setId(id);
+    }
+
+    @AutoValue.Builder
+    public abstract static class Builder {
+        abstract Builder setGroup(String group);
+
+        abstract Builder setName(String name);
+
+        abstract Builder setUpdatedAt(ZonedDateTime updatedAt);
+
+        public abstract Builder setId(String id);
+
+        abstract ImmutableList.Builder<TagAndValue<?>> tagsBuilder();
+
+        public final Builder addTag(TagAndValue<?> tagAndValue) {
+            tagsBuilder().add(tagAndValue);
+            return this;
+        }
+
+        public abstract Property build();
+    }
+}
diff --git a/src/main/proto/banyandb/v1/banyandb-property.proto b/src/main/proto/banyandb/v1/banyandb-property.proto
new file mode 100644
index 0000000..fafe19f
--- /dev/null
+++ b/src/main/proto/banyandb/v1/banyandb-property.proto
@@ -0,0 +1,90 @@
+// Licensed to Apache Software Foundation (ASF) under one or more contributor
+// license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright
+// ownership. Apache Software Foundation (ASF) licenses this file to you under
+// the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+syntax = "proto3";
+
+option java_package = "org.apache.skywalking.banyandb.property.v1";
+
+package banyandb.property.v1;
+
+import "google/protobuf/timestamp.proto";
+import "banyandb/v1/banyandb-common.proto";
+import "banyandb/v1/banyandb-model.proto";
+
+// Metadata is for multi-tenant use
+message Metadata {
+  // container is created when it receives the first property
+  common.v1.Metadata container = 1;
+  // id identifies a property
+  string id = 2;
+}
+
+// Property stores the user defined data
+message Property {
+  // metadata is the identity of a property
+  Metadata metadata = 1;
+  // tag stores the content of a property
+  repeated model.v1.Tag tags = 2;
+  // updated_at indicates when the property is updated
+  google.protobuf.Timestamp updated_at = 3;
+}
+
+message CreateRequest {
+  banyandb.property.v1.Property property = 1;
+}
+
+message CreateResponse {
+}
+
+message UpdateRequest {
+  banyandb.property.v1.Property property = 1;
+}
+
+message UpdateResponse {
+}
+
+message DeleteRequest {
+  banyandb.property.v1.Metadata metadata = 1;
+}
+
+message DeleteResponse {
+  bool deleted = 1;
+}
+
+message GetRequest {
+  banyandb.property.v1.Metadata metadata = 1;
+}
+
+message GetResponse {
+  banyandb.property.v1.Property property = 1;
+}
+
+message ListRequest {
+  banyandb.common.v1.Metadata container = 1;
+}
+
+message ListResponse {
+  repeated banyandb.property.v1.Property property = 1;
+}
+
+service PropertyService {
+  rpc Create(CreateRequest) returns (CreateResponse);
+  rpc Update(UpdateRequest) returns (UpdateResponse);
+  rpc Delete(DeleteRequest) returns (DeleteResponse);
+  rpc Get(GetRequest) returns (GetResponse);
+  rpc List(ListRequest) returns (ListResponse);
+}