You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ha...@apache.org on 2021/08/13 05:43:15 UTC

[skywalking-banyandb] branch proto-replace created (now 6496402)

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

hanahmily pushed a change to branch proto-replace
in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb.git.


      at 6496402  move proto files to proper packages

This branch includes the following new commits:

     new 6496402  move proto files to proper packages

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[skywalking-banyandb] 01/01: move proto files to proper packages

Posted by ha...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

hanahmily pushed a commit to branch proto-replace
in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb.git

commit 64964021195e50e2ddf2d57f72ae6df55a82f04a
Author: Gao Hongtao <ha...@gmail.com>
AuthorDate: Fri Aug 13 13:40:49 2021 +0800

    move proto files to proper packages
    
    Signed-off-by: Gao Hongtao <ha...@gmail.com>
---
 api/Makefile                                       |    6 +-
 api/common/metadata.go                             |   10 +-
 api/data/trace.go                                  |    8 +-
 api/event/discovery.go                             |    2 +-
 api/proto/banyandb/common/v1/common.pb.go          |  180 ++++
 .../{v1/rpc.proto => common/v1/common.proto}       |   18 +-
 api/proto/banyandb/database/v1/database.pb.go      |  332 ++++++
 .../{v1/rpc.proto => database/v1/database.proto}   |   29 +-
 api/proto/banyandb/database/v1/event.pb.go         |  550 ++++++++++
 .../{v1/database.proto => database/v1/event.proto} |   62 +-
 api/proto/banyandb/{ => database}/v1/schema.pb.go  |  738 +++++--------
 api/proto/banyandb/database/v1/schema.proto        |  187 ++++
 api/proto/banyandb/model/v1/query.pb.go            |  807 ++++++++++++++
 api/proto/banyandb/model/v1/query.proto            |   97 ++
 api/proto/banyandb/model/v1/write.pb.go            |  521 +++++++++
 .../{v1/rpc.proto => model/v1/write.proto}         |   38 +-
 api/proto/banyandb/trace/v1/query.pb.go            |  449 ++++++++
 api/proto/banyandb/{ => trace}/v1/query.proto      |   92 +-
 api/proto/banyandb/trace/v1/rpc.pb.go              |  113 ++
 api/proto/banyandb/{ => trace}/v1/rpc.proto        |   14 +-
 api/proto/banyandb/{ => trace}/v1/rpc_grpc.pb.go   |   10 +-
 api/proto/banyandb/trace/v1/write.pb.go            |  357 ++++++
 api/proto/banyandb/{ => trace}/v1/write.proto      |   42 +-
 api/proto/banyandb/v1/database.pb.go               |  644 -----------
 api/proto/banyandb/v1/query.pb.go                  | 1132 --------------------
 api/proto/banyandb/v1/rpc.pb.go                    |  109 --
 api/proto/banyandb/v1/schema.proto                 |  198 ----
 api/proto/banyandb/v1/write.pb.go                  |  764 -------------
 api/schema/index.go                                |    2 +-
 api/schema/series.go                               |    2 +-
 banyand/index/index.go                             |   24 +-
 banyand/index/index_test.go                        |   15 +-
 banyand/index/search.go                            |   28 +-
 banyand/index/search_test.go                       |   26 +-
 .../grpc/{data => testdata}/server_cert.pem        |    0
 .../liaison/grpc/{data => testdata}/server_key.pem |    0
 banyand/liaison/grpc/{grpc.go => trace.go}         |  227 ++--
 .../liaison/grpc/{grpc_test.go => trace_test.go}   |   24 +-
 banyand/query/processor.go                         |    2 +-
 banyand/query/processor_test.go                    |   23 +-
 banyand/series/schema/sw/sw.go                     |    8 +-
 banyand/series/series.go                           |    2 +-
 banyand/series/trace/common_test.go                |    2 +-
 banyand/series/trace/query.go                      |    2 +-
 banyand/series/trace/schema.go                     |    9 +-
 banyand/series/trace/schema_test.go                |   25 +-
 banyand/series/trace/service.go                    |   21 +-
 banyand/series/trace/trace.go                      |   24 +-
 banyand/series/trace/write.go                      |   18 +-
 pkg/pb/database.go                                 |   39 +-
 pkg/pb/fields.go                                   |   17 +-
 pkg/pb/query.go                                    |  124 +--
 pkg/pb/write.go                                    |   62 +-
 pkg/query/logical/analyzer.go                      |   13 +-
 pkg/query/logical/analyzer_test.go                 |   12 +-
 pkg/query/logical/expr.go                          |   43 +-
 pkg/query/logical/expr_literal.go                  |   18 +-
 pkg/query/logical/interface.go                     |    2 +-
 pkg/query/logical/plan_execution_test.go           |   14 +-
 pkg/query/logical/plan_indexscan.go                |    6 +-
 pkg/query/logical/plan_orderby.go                  |   20 +-
 pkg/query/logical/schema.go                        |   12 +-
 62 files changed, 4444 insertions(+), 3931 deletions(-)

diff --git a/api/Makefile b/api/Makefile
index daf91d1..303d7f1 100644
--- a/api/Makefile
+++ b/api/Makefile
@@ -18,11 +18,13 @@
 
 NAME := api
 
+proto_dir := $(root_dir)/api/proto
+
 include ../scripts/build/base.mk
 include ../scripts/build/help.mk
 
 generate: $(PROTOC)
-	@PATH=$(PATH):$(tool_bin) buf generate
+	@PATH=$(PATH):$(tool_bin):$(proto_dir) buf generate
 
 lint: $(PROTOC)
-	@PATH=$(PATH):$(tool_bin) buf lint
+	@PATH=$(PATH):$(tool_bin):$(proto_dir) buf lint
diff --git a/api/common/metadata.go b/api/common/metadata.go
index 8706aaf..8f55c1a 100644
--- a/api/common/metadata.go
+++ b/api/common/metadata.go
@@ -18,14 +18,14 @@
 package common
 
 import (
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	commonv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
 )
 
-var MetadataKindVersion = KindVersion{Version: "v1", Kind: "metadata"}
+var MetadataKindVersion = KindVersion{Version: "commonv1", Kind: "metadata"}
 
 type Metadata struct {
 	KindVersion
-	Spec *v1.Metadata
+	Spec *commonv1.Metadata
 }
 
 func (md Metadata) Equal(other Metadata) bool {
@@ -34,7 +34,7 @@ func (md Metadata) Equal(other Metadata) bool {
 		md.Spec.Name == other.Spec.Name
 }
 
-func NewMetadata(spec *v1.Metadata) *Metadata {
+func NewMetadata(spec *commonv1.Metadata) *Metadata {
 	return &Metadata{
 		KindVersion: MetadataKindVersion,
 		Spec:        spec,
@@ -44,7 +44,7 @@ func NewMetadata(spec *v1.Metadata) *Metadata {
 func NewMetadataByNameAndGroup(name, group string) *Metadata {
 	return &Metadata{
 		KindVersion: MetadataKindVersion,
-		Spec: &v1.Metadata{
+		Spec: &commonv1.Metadata{
 			Name:  name,
 			Group: group,
 		},
diff --git a/api/data/trace.go b/api/data/trace.go
index 0f8b84d..19ac991 100644
--- a/api/data/trace.go
+++ b/api/data/trace.go
@@ -19,7 +19,7 @@ package data
 
 import (
 	"github.com/apache/skywalking-banyandb/api/common"
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	tracev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/trace/v1"
 	"github.com/apache/skywalking-banyandb/pkg/bus"
 )
 
@@ -43,16 +43,16 @@ type Trace struct {
 }
 
 type Entity struct {
-	*v1.Entity
+	*tracev1.Entity
 }
 
 type EntityValue struct {
-	*v1.EntityValue
+	*tracev1.EntityValue
 }
 type TraceWriteDate struct {
 	ShardID      uint
 	SeriesID     uint64
-	WriteRequest *v1.WriteRequest
+	WriteRequest *tracev1.WriteRequest
 }
 type Write struct {
 	common.KindVersion
diff --git a/api/event/discovery.go b/api/event/discovery.go
index 7b55de8..db9695e 100644
--- a/api/event/discovery.go
+++ b/api/event/discovery.go
@@ -19,7 +19,7 @@ package event
 
 import (
 	"github.com/apache/skywalking-banyandb/api/common"
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
 	"github.com/apache/skywalking-banyandb/pkg/bus"
 )
 
diff --git a/api/proto/banyandb/common/v1/common.pb.go b/api/proto/banyandb/common/v1/common.pb.go
new file mode 100644
index 0000000..ed6aa71
--- /dev/null
+++ b/api/proto/banyandb/common/v1/common.pb.go
@@ -0,0 +1,180 @@
+// 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.
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.27.1
+// 	protoc        v3.17.3
+// source: banyandb/common/v1/common.proto
+
+package v1
+
+import (
+	reflect "reflect"
+	sync "sync"
+
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// Metadata is for multi-tenant, multi-model use
+type Metadata struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// group contains a set of options, like retention policy, max
+	Group string `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"`
+	// name of the entity
+	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *Metadata) Reset() {
+	*x = Metadata{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_common_v1_common_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Metadata) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Metadata) ProtoMessage() {}
+
+func (x *Metadata) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_common_v1_common_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Metadata.ProtoReflect.Descriptor instead.
+func (*Metadata) Descriptor() ([]byte, []int) {
+	return file_banyandb_common_v1_common_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Metadata) GetGroup() string {
+	if x != nil {
+		return x.Group
+	}
+	return ""
+}
+
+func (x *Metadata) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+var File_banyandb_common_v1_common_proto protoreflect.FileDescriptor
+
+var file_banyandb_common_v1_common_proto_rawDesc = []byte{
+	0x0a, 0x1f, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
+	0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x12, 0x12, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
+	0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x22, 0x34, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+	0x61, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x6e, 0x0a, 0x28, 0x6f,
+	0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c,
+	0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f,
+	0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
+	0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61,
+	0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61,
+	0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
+	0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x33,
+}
+
+var (
+	file_banyandb_common_v1_common_proto_rawDescOnce sync.Once
+	file_banyandb_common_v1_common_proto_rawDescData = file_banyandb_common_v1_common_proto_rawDesc
+)
+
+func file_banyandb_common_v1_common_proto_rawDescGZIP() []byte {
+	file_banyandb_common_v1_common_proto_rawDescOnce.Do(func() {
+		file_banyandb_common_v1_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_common_v1_common_proto_rawDescData)
+	})
+	return file_banyandb_common_v1_common_proto_rawDescData
+}
+
+var file_banyandb_common_v1_common_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_banyandb_common_v1_common_proto_goTypes = []interface{}{
+	(*Metadata)(nil), // 0: banyandb.common.v1.Metadata
+}
+var file_banyandb_common_v1_common_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_banyandb_common_v1_common_proto_init() }
+func file_banyandb_common_v1_common_proto_init() {
+	if File_banyandb_common_v1_common_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_banyandb_common_v1_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Metadata); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_banyandb_common_v1_common_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_banyandb_common_v1_common_proto_goTypes,
+		DependencyIndexes: file_banyandb_common_v1_common_proto_depIdxs,
+		MessageInfos:      file_banyandb_common_v1_common_proto_msgTypes,
+	}.Build()
+	File_banyandb_common_v1_common_proto = out.File
+	file_banyandb_common_v1_common_proto_rawDesc = nil
+	file_banyandb_common_v1_common_proto_goTypes = nil
+	file_banyandb_common_v1_common_proto_depIdxs = nil
+}
diff --git a/api/proto/banyandb/v1/rpc.proto b/api/proto/banyandb/common/v1/common.proto
similarity index 71%
copy from api/proto/banyandb/v1/rpc.proto
copy to api/proto/banyandb/common/v1/common.proto
index 85fafd8..3282d83 100644
--- a/api/proto/banyandb/v1/rpc.proto
+++ b/api/proto/banyandb/common/v1/common.proto
@@ -17,15 +17,15 @@
 
 syntax = "proto3";
 
-option java_package = "org.apache.skywalking.banyandb";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1;v1";
+option java_package = "org.apache.skywalking.banyandb.common.v1";
+option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1";
 
-package banyandb.v1;
+package banyandb.common.v1;
 
-import "banyandb/v1/query.proto";
-import "banyandb/v1/write.proto";
-
-service TraceService {
-  rpc Query(banyandb.v1.QueryRequest) returns (banyandb.v1.QueryResponse);
-  rpc Write(stream banyandb.v1.WriteRequest) returns (stream banyandb.v1.WriteResponse);
+// Metadata is for multi-tenant, multi-model use
+message Metadata {
+    // group contains a set of options, like retention policy, max
+    string group = 1;
+    // name of the entity
+    string name = 2;
 }
\ No newline at end of file
diff --git a/api/proto/banyandb/database/v1/database.pb.go b/api/proto/banyandb/database/v1/database.pb.go
new file mode 100644
index 0000000..3720d45
--- /dev/null
+++ b/api/proto/banyandb/database/v1/database.pb.go
@@ -0,0 +1,332 @@
+// 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.
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.27.1
+// 	protoc        v3.17.3
+// source: banyandb/database/v1/database.proto
+
+package v1
+
+import (
+	reflect "reflect"
+	sync "sync"
+
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
+
+	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type Node struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id        string                 `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Addr      string                 `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"`
+	UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`
+	CreatedAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
+}
+
+func (x *Node) Reset() {
+	*x = Node{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_database_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Node) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Node) ProtoMessage() {}
+
+func (x *Node) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_database_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Node.ProtoReflect.Descriptor instead.
+func (*Node) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_database_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Node) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *Node) GetAddr() string {
+	if x != nil {
+		return x.Addr
+	}
+	return ""
+}
+
+func (x *Node) GetUpdatedAt() *timestamppb.Timestamp {
+	if x != nil {
+		return x.UpdatedAt
+	}
+	return nil
+}
+
+func (x *Node) GetCreatedAt() *timestamppb.Timestamp {
+	if x != nil {
+		return x.CreatedAt
+	}
+	return nil
+}
+
+type Shard struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id        uint64                 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
+	Series    *v1.Metadata           `protobuf:"bytes,2,opt,name=series,proto3" json:"series,omitempty"`
+	Node      *Node                  `protobuf:"bytes,3,opt,name=node,proto3" json:"node,omitempty"`
+	Total     uint32                 `protobuf:"varint,4,opt,name=total,proto3" json:"total,omitempty"`
+	UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`
+	CreatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
+}
+
+func (x *Shard) Reset() {
+	*x = Shard{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_database_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Shard) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Shard) ProtoMessage() {}
+
+func (x *Shard) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_database_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Shard.ProtoReflect.Descriptor instead.
+func (*Shard) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_database_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *Shard) GetId() uint64 {
+	if x != nil {
+		return x.Id
+	}
+	return 0
+}
+
+func (x *Shard) GetSeries() *v1.Metadata {
+	if x != nil {
+		return x.Series
+	}
+	return nil
+}
+
+func (x *Shard) GetNode() *Node {
+	if x != nil {
+		return x.Node
+	}
+	return nil
+}
+
+func (x *Shard) GetTotal() uint32 {
+	if x != nil {
+		return x.Total
+	}
+	return 0
+}
+
+func (x *Shard) GetUpdatedAt() *timestamppb.Timestamp {
+	if x != nil {
+		return x.UpdatedAt
+	}
+	return nil
+}
+
+func (x *Shard) GetCreatedAt() *timestamppb.Timestamp {
+	if x != nil {
+		return x.CreatedAt
+	}
+	return nil
+}
+
+var File_banyandb_database_v1_database_proto protoreflect.FileDescriptor
+
+var file_banyandb_database_v1_database_proto_rawDesc = []byte{
+	0x0a, 0x23, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62,
+	0x61, 0x73, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e,
+	0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x62, 0x61,
+	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31,
+	0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa0, 0x01,
+	0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
+	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
+	0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61,
+	0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+	0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74,
+	0x22, 0x89, 0x02, 0x0a, 0x05, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x65,
+	0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e,
+	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e,
+	0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x06, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73,
+	0x12, 0x2e, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
+	0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61,
+	0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65,
+	0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52,
+	0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41,
+	0x74, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18,
+	0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x72, 0x0a, 0x2a,
+	0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x6b, 0x79, 0x77, 0x61,
+	0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64,
+	0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68,
+	0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x73, 0x6b,
+	0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
+	0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x61, 0x6e, 0x79,
+	0x61, 0x6e, 0x64, 0x62, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x76, 0x31,
+	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_banyandb_database_v1_database_proto_rawDescOnce sync.Once
+	file_banyandb_database_v1_database_proto_rawDescData = file_banyandb_database_v1_database_proto_rawDesc
+)
+
+func file_banyandb_database_v1_database_proto_rawDescGZIP() []byte {
+	file_banyandb_database_v1_database_proto_rawDescOnce.Do(func() {
+		file_banyandb_database_v1_database_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_database_v1_database_proto_rawDescData)
+	})
+	return file_banyandb_database_v1_database_proto_rawDescData
+}
+
+var file_banyandb_database_v1_database_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_banyandb_database_v1_database_proto_goTypes = []interface{}{
+	(*Node)(nil),                  // 0: banyandb.database.v1.Node
+	(*Shard)(nil),                 // 1: banyandb.database.v1.Shard
+	(*timestamppb.Timestamp)(nil), // 2: google.protobuf.Timestamp
+	(*v1.Metadata)(nil),           // 3: banyandb.common.v1.Metadata
+}
+var file_banyandb_database_v1_database_proto_depIdxs = []int32{
+	2, // 0: banyandb.database.v1.Node.updated_at:type_name -> google.protobuf.Timestamp
+	2, // 1: banyandb.database.v1.Node.created_at:type_name -> google.protobuf.Timestamp
+	3, // 2: banyandb.database.v1.Shard.series:type_name -> banyandb.common.v1.Metadata
+	0, // 3: banyandb.database.v1.Shard.node:type_name -> banyandb.database.v1.Node
+	2, // 4: banyandb.database.v1.Shard.updated_at:type_name -> google.protobuf.Timestamp
+	2, // 5: banyandb.database.v1.Shard.created_at:type_name -> google.protobuf.Timestamp
+	6, // [6:6] is the sub-list for method output_type
+	6, // [6:6] is the sub-list for method input_type
+	6, // [6:6] is the sub-list for extension type_name
+	6, // [6:6] is the sub-list for extension extendee
+	0, // [0:6] is the sub-list for field type_name
+}
+
+func init() { file_banyandb_database_v1_database_proto_init() }
+func file_banyandb_database_v1_database_proto_init() {
+	if File_banyandb_database_v1_database_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_banyandb_database_v1_database_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Node); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_database_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Shard); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_banyandb_database_v1_database_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   2,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_banyandb_database_v1_database_proto_goTypes,
+		DependencyIndexes: file_banyandb_database_v1_database_proto_depIdxs,
+		MessageInfos:      file_banyandb_database_v1_database_proto_msgTypes,
+	}.Build()
+	File_banyandb_database_v1_database_proto = out.File
+	file_banyandb_database_v1_database_proto_rawDesc = nil
+	file_banyandb_database_v1_database_proto_goTypes = nil
+	file_banyandb_database_v1_database_proto_depIdxs = nil
+}
diff --git a/api/proto/banyandb/v1/rpc.proto b/api/proto/banyandb/database/v1/database.proto
similarity index 61%
copy from api/proto/banyandb/v1/rpc.proto
copy to api/proto/banyandb/database/v1/database.proto
index 85fafd8..2d26c9d 100644
--- a/api/proto/banyandb/v1/rpc.proto
+++ b/api/proto/banyandb/database/v1/database.proto
@@ -17,15 +17,26 @@
 
 syntax = "proto3";
 
-option java_package = "org.apache.skywalking.banyandb";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1;v1";
+option java_package = "org.apache.skywalking.banyandb.database.v1";
+option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1";
 
-package banyandb.v1;
+package banyandb.database.v1;
 
-import "banyandb/v1/query.proto";
-import "banyandb/v1/write.proto";
+import "google/protobuf/timestamp.proto";
+import "banyandb/common/v1/common.proto";
 
-service TraceService {
-  rpc Query(banyandb.v1.QueryRequest) returns (banyandb.v1.QueryResponse);
-  rpc Write(stream banyandb.v1.WriteRequest) returns (stream banyandb.v1.WriteResponse);
-}
\ No newline at end of file
+message Node {
+    string id = 1;
+    string addr = 2;
+    google.protobuf.Timestamp updated_at = 3;
+    google.protobuf.Timestamp created_at = 4;
+}
+
+message Shard {
+    uint64 id = 1;
+    common.v1.Metadata series = 2;
+    Node node = 3;
+    uint32 total = 4;
+    google.protobuf.Timestamp updated_at = 5;
+    google.protobuf.Timestamp created_at = 6;
+}
diff --git a/api/proto/banyandb/database/v1/event.pb.go b/api/proto/banyandb/database/v1/event.pb.go
new file mode 100644
index 0000000..9341bb9
--- /dev/null
+++ b/api/proto/banyandb/database/v1/event.pb.go
@@ -0,0 +1,550 @@
+// 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.
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.27.1
+// 	protoc        v3.17.3
+// source: banyandb/database/v1/event.proto
+
+package v1
+
+import (
+	reflect "reflect"
+	sync "sync"
+
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
+
+	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type Action int32
+
+const (
+	Action_ACTION_UNSPECIFIED Action = 0
+	Action_ACTION_PUT         Action = 1
+	Action_ACTION_DELETE      Action = 2
+)
+
+// Enum value maps for Action.
+var (
+	Action_name = map[int32]string{
+		0: "ACTION_UNSPECIFIED",
+		1: "ACTION_PUT",
+		2: "ACTION_DELETE",
+	}
+	Action_value = map[string]int32{
+		"ACTION_UNSPECIFIED": 0,
+		"ACTION_PUT":         1,
+		"ACTION_DELETE":      2,
+	}
+)
+
+func (x Action) Enum() *Action {
+	p := new(Action)
+	*p = x
+	return p
+}
+
+func (x Action) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Action) Descriptor() protoreflect.EnumDescriptor {
+	return file_banyandb_database_v1_event_proto_enumTypes[0].Descriptor()
+}
+
+func (Action) Type() protoreflect.EnumType {
+	return &file_banyandb_database_v1_event_proto_enumTypes[0]
+}
+
+func (x Action) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Action.Descriptor instead.
+func (Action) EnumDescriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_event_proto_rawDescGZIP(), []int{0}
+}
+
+type ShardEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Shard  *Shard                 `protobuf:"bytes,1,opt,name=shard,proto3" json:"shard,omitempty"`
+	Action Action                 `protobuf:"varint,2,opt,name=action,proto3,enum=banyandb.database.v1.Action" json:"action,omitempty"`
+	Time   *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=time,proto3" json:"time,omitempty"`
+}
+
+func (x *ShardEvent) Reset() {
+	*x = ShardEvent{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_event_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ShardEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ShardEvent) ProtoMessage() {}
+
+func (x *ShardEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_event_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ShardEvent.ProtoReflect.Descriptor instead.
+func (*ShardEvent) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_event_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *ShardEvent) GetShard() *Shard {
+	if x != nil {
+		return x.Shard
+	}
+	return nil
+}
+
+func (x *ShardEvent) GetAction() Action {
+	if x != nil {
+		return x.Action
+	}
+	return Action_ACTION_UNSPECIFIED
+}
+
+func (x *ShardEvent) GetTime() *timestamppb.Timestamp {
+	if x != nil {
+		return x.Time
+	}
+	return nil
+}
+
+type SeriesEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Series                      *v1.Metadata           `protobuf:"bytes,1,opt,name=series,proto3" json:"series,omitempty"`
+	FieldNamesCompositeSeriesId []string               `protobuf:"bytes,2,rep,name=field_names_composite_series_id,json=fieldNamesCompositeSeriesId,proto3" json:"field_names_composite_series_id,omitempty"`
+	Action                      Action                 `protobuf:"varint,3,opt,name=action,proto3,enum=banyandb.database.v1.Action" json:"action,omitempty"`
+	Time                        *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=time,proto3" json:"time,omitempty"`
+}
+
+func (x *SeriesEvent) Reset() {
+	*x = SeriesEvent{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_event_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SeriesEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SeriesEvent) ProtoMessage() {}
+
+func (x *SeriesEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_event_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SeriesEvent.ProtoReflect.Descriptor instead.
+func (*SeriesEvent) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_event_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *SeriesEvent) GetSeries() *v1.Metadata {
+	if x != nil {
+		return x.Series
+	}
+	return nil
+}
+
+func (x *SeriesEvent) GetFieldNamesCompositeSeriesId() []string {
+	if x != nil {
+		return x.FieldNamesCompositeSeriesId
+	}
+	return nil
+}
+
+func (x *SeriesEvent) GetAction() Action {
+	if x != nil {
+		return x.Action
+	}
+	return Action_ACTION_UNSPECIFIED
+}
+
+func (x *SeriesEvent) GetTime() *timestamppb.Timestamp {
+	if x != nil {
+		return x.Time
+	}
+	return nil
+}
+
+type IndexRuleEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Series *v1.Metadata                       `protobuf:"bytes,1,opt,name=series,proto3" json:"series,omitempty"`
+	Rules  []*IndexRuleEvent_ShardedIndexRule `protobuf:"bytes,2,rep,name=rules,proto3" json:"rules,omitempty"`
+	Action Action                             `protobuf:"varint,4,opt,name=action,proto3,enum=banyandb.database.v1.Action" json:"action,omitempty"`
+	Time   *timestamppb.Timestamp             `protobuf:"bytes,5,opt,name=time,proto3" json:"time,omitempty"`
+}
+
+func (x *IndexRuleEvent) Reset() {
+	*x = IndexRuleEvent{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_event_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleEvent) ProtoMessage() {}
+
+func (x *IndexRuleEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_event_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleEvent.ProtoReflect.Descriptor instead.
+func (*IndexRuleEvent) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_event_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *IndexRuleEvent) GetSeries() *v1.Metadata {
+	if x != nil {
+		return x.Series
+	}
+	return nil
+}
+
+func (x *IndexRuleEvent) GetRules() []*IndexRuleEvent_ShardedIndexRule {
+	if x != nil {
+		return x.Rules
+	}
+	return nil
+}
+
+func (x *IndexRuleEvent) GetAction() Action {
+	if x != nil {
+		return x.Action
+	}
+	return Action_ACTION_UNSPECIFIED
+}
+
+func (x *IndexRuleEvent) GetTime() *timestamppb.Timestamp {
+	if x != nil {
+		return x.Time
+	}
+	return nil
+}
+
+type IndexRuleEvent_ShardedIndexRule struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ShardId uint64       `protobuf:"varint,1,opt,name=shard_id,json=shardId,proto3" json:"shard_id,omitempty"`
+	Rules   []*IndexRule `protobuf:"bytes,2,rep,name=rules,proto3" json:"rules,omitempty"`
+}
+
+func (x *IndexRuleEvent_ShardedIndexRule) Reset() {
+	*x = IndexRuleEvent_ShardedIndexRule{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_event_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleEvent_ShardedIndexRule) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleEvent_ShardedIndexRule) ProtoMessage() {}
+
+func (x *IndexRuleEvent_ShardedIndexRule) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_event_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleEvent_ShardedIndexRule.ProtoReflect.Descriptor instead.
+func (*IndexRuleEvent_ShardedIndexRule) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_event_proto_rawDescGZIP(), []int{2, 0}
+}
+
+func (x *IndexRuleEvent_ShardedIndexRule) GetShardId() uint64 {
+	if x != nil {
+		return x.ShardId
+	}
+	return 0
+}
+
+func (x *IndexRuleEvent_ShardedIndexRule) GetRules() []*IndexRule {
+	if x != nil {
+		return x.Rules
+	}
+	return nil
+}
+
+var File_banyandb_database_v1_event_proto protoreflect.FileDescriptor
+
+var file_banyandb_database_v1_event_proto_rawDesc = []byte{
+	0x0a, 0x20, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62,
+	0x61, 0x73, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x12, 0x14, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74,
+	0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
+	0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x62, 0x61, 0x6e, 0x79, 0x61,
+	0x6e, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f,
+	0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x62, 0x61, 0x6e, 0x79,
+	0x61, 0x6e, 0x64, 0x62, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x76, 0x31,
+	0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
+	0x21, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61,
+	0x73, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x22, 0xa5, 0x01, 0x0a, 0x0a, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x76, 0x65, 0x6e,
+	0x74, 0x12, 0x31, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1b, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61,
+	0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73,
+	0x68, 0x61, 0x72, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e,
+	0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69,
+	0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69,
+	0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73,
+	0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xef, 0x01, 0x0a, 0x0b, 0x53,
+	0x65, 0x72, 0x69, 0x65, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x65,
+	0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e,
+	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e,
+	0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x06, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73,
+	0x12, 0x44, 0x0a, 0x1f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f,
+	0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73,
+	0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1b, 0x66, 0x69, 0x65, 0x6c, 0x64,
+	0x4e, 0x61, 0x6d, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x53, 0x65,
+	0x72, 0x69, 0x65, 0x73, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
+	0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63,
+	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x04,
+	0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xdf, 0x02, 0x0a,
+	0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
+	0x34, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
+	0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x06, 0x73,
+	0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x4b, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x02,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e,
+	0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65,
+	0x78, 0x52, 0x75, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64,
+	0x65, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c,
+	0x65, 0x73, 0x12, 0x34, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61,
+	0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65,
+	0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0x64, 0x0a, 0x10, 0x53, 0x68, 0x61, 0x72,
+	0x64, 0x65, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x08,
+	0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07,
+	0x73, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73,
+	0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
+	0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e,
+	0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2a, 0x43,
+	0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x43, 0x54, 0x49,
+	0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,
+	0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x54, 0x10, 0x01,
+	0x12, 0x11, 0x0a, 0x0d, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54,
+	0x45, 0x10, 0x02, 0x42, 0x72, 0x0a, 0x2a, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68,
+	0x65, 0x2e, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e,
+	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76,
+	0x31, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70,
+	0x61, 0x63, 0x68, 0x65, 0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2d,
+	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2f, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x64, 0x61, 0x74, 0x61,
+	0x62, 0x61, 0x73, 0x65, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_banyandb_database_v1_event_proto_rawDescOnce sync.Once
+	file_banyandb_database_v1_event_proto_rawDescData = file_banyandb_database_v1_event_proto_rawDesc
+)
+
+func file_banyandb_database_v1_event_proto_rawDescGZIP() []byte {
+	file_banyandb_database_v1_event_proto_rawDescOnce.Do(func() {
+		file_banyandb_database_v1_event_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_database_v1_event_proto_rawDescData)
+	})
+	return file_banyandb_database_v1_event_proto_rawDescData
+}
+
+var file_banyandb_database_v1_event_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_banyandb_database_v1_event_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
+var file_banyandb_database_v1_event_proto_goTypes = []interface{}{
+	(Action)(0),                             // 0: banyandb.database.v1.Action
+	(*ShardEvent)(nil),                      // 1: banyandb.database.v1.ShardEvent
+	(*SeriesEvent)(nil),                     // 2: banyandb.database.v1.SeriesEvent
+	(*IndexRuleEvent)(nil),                  // 3: banyandb.database.v1.IndexRuleEvent
+	(*IndexRuleEvent_ShardedIndexRule)(nil), // 4: banyandb.database.v1.IndexRuleEvent.ShardedIndexRule
+	(*Shard)(nil),                           // 5: banyandb.database.v1.Shard
+	(*timestamppb.Timestamp)(nil),           // 6: google.protobuf.Timestamp
+	(*v1.Metadata)(nil),                     // 7: banyandb.common.v1.Metadata
+	(*IndexRule)(nil),                       // 8: banyandb.database.v1.IndexRule
+}
+var file_banyandb_database_v1_event_proto_depIdxs = []int32{
+	5,  // 0: banyandb.database.v1.ShardEvent.shard:type_name -> banyandb.database.v1.Shard
+	0,  // 1: banyandb.database.v1.ShardEvent.action:type_name -> banyandb.database.v1.Action
+	6,  // 2: banyandb.database.v1.ShardEvent.time:type_name -> google.protobuf.Timestamp
+	7,  // 3: banyandb.database.v1.SeriesEvent.series:type_name -> banyandb.common.v1.Metadata
+	0,  // 4: banyandb.database.v1.SeriesEvent.action:type_name -> banyandb.database.v1.Action
+	6,  // 5: banyandb.database.v1.SeriesEvent.time:type_name -> google.protobuf.Timestamp
+	7,  // 6: banyandb.database.v1.IndexRuleEvent.series:type_name -> banyandb.common.v1.Metadata
+	4,  // 7: banyandb.database.v1.IndexRuleEvent.rules:type_name -> banyandb.database.v1.IndexRuleEvent.ShardedIndexRule
+	0,  // 8: banyandb.database.v1.IndexRuleEvent.action:type_name -> banyandb.database.v1.Action
+	6,  // 9: banyandb.database.v1.IndexRuleEvent.time:type_name -> google.protobuf.Timestamp
+	8,  // 10: banyandb.database.v1.IndexRuleEvent.ShardedIndexRule.rules:type_name -> banyandb.database.v1.IndexRule
+	11, // [11:11] is the sub-list for method output_type
+	11, // [11:11] is the sub-list for method input_type
+	11, // [11:11] is the sub-list for extension type_name
+	11, // [11:11] is the sub-list for extension extendee
+	0,  // [0:11] is the sub-list for field type_name
+}
+
+func init() { file_banyandb_database_v1_event_proto_init() }
+func file_banyandb_database_v1_event_proto_init() {
+	if File_banyandb_database_v1_event_proto != nil {
+		return
+	}
+	file_banyandb_database_v1_database_proto_init()
+	file_banyandb_database_v1_schema_proto_init()
+	if !protoimpl.UnsafeEnabled {
+		file_banyandb_database_v1_event_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ShardEvent); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_event_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SeriesEvent); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_event_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleEvent); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_event_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleEvent_ShardedIndexRule); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_banyandb_database_v1_event_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   4,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_banyandb_database_v1_event_proto_goTypes,
+		DependencyIndexes: file_banyandb_database_v1_event_proto_depIdxs,
+		EnumInfos:         file_banyandb_database_v1_event_proto_enumTypes,
+		MessageInfos:      file_banyandb_database_v1_event_proto_msgTypes,
+	}.Build()
+	File_banyandb_database_v1_event_proto = out.File
+	file_banyandb_database_v1_event_proto_rawDesc = nil
+	file_banyandb_database_v1_event_proto_goTypes = nil
+	file_banyandb_database_v1_event_proto_depIdxs = nil
+}
diff --git a/api/proto/banyandb/v1/database.proto b/api/proto/banyandb/database/v1/event.proto
similarity index 53%
rename from api/proto/banyandb/v1/database.proto
rename to api/proto/banyandb/database/v1/event.proto
index 8c3b477..1a9bd21 100644
--- a/api/proto/banyandb/v1/database.proto
+++ b/api/proto/banyandb/database/v1/event.proto
@@ -17,52 +17,42 @@
 
 syntax = "proto3";
 
-option java_package = "org.apache.skywalking.banyandb";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1;v1";
+option java_package = "org.apache.skywalking.banyandb.database.v1";
+option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1";
 
-package banyandb.v1;
+package banyandb.database.v1;
 
 import "google/protobuf/timestamp.proto";
-
-message Node {
-  string id = 1;
-  string addr = 2;
-  google.protobuf.Timestamp updated_at = 3;
-  google.protobuf.Timestamp created_at = 4;
-}
-
-message Shard {
-  uint64 id = 1;
-  Metadata series = 2;
-  Node node = 3;
-  uint32 total = 4;
-  google.protobuf.Timestamp updated_at = 5;
-  google.protobuf.Timestamp created_at = 6;
-}
+import "banyandb/common/v1/common.proto";
+import "banyandb/database/v1/database.proto";
+import "banyandb/database/v1/schema.proto";
 
 enum Action {
-  ACTION_UNSPECIFIED = 0;
-  ACTION_PUT = 1;
-  ACTION_DELETE = 2;
+    ACTION_UNSPECIFIED = 0;
+    ACTION_PUT = 1;
+    ACTION_DELETE = 2;
 }
 
 message ShardEvent {
-  Shard shard = 1;
-  Action action = 2;
-  google.protobuf.Timestamp time = 3;
+    Shard shard = 1;
+    Action action = 2;
+    google.protobuf.Timestamp time = 3;
 }
 
 message SeriesEvent {
-  Metadata series = 1;
-  repeated string field_names_composite_series_id = 2;
-  Action action = 3;
-  google.protobuf.Timestamp time = 4;
+    common.v1.Metadata series = 1;
+    repeated string field_names_composite_series_id = 2;
+    Action action = 3;
+    google.protobuf.Timestamp time = 4;
 }
 
-// Metadata is for multi-tenant, multi-model use
-message Metadata {
-  // group contains a set of options, like retention policy, max
-  string group = 1;
-  // name of the entity
-  string name = 2;
-}
\ No newline at end of file
+message IndexRuleEvent {
+    common.v1.Metadata series = 1;
+    message ShardedIndexRule {
+        uint64 shard_id = 1;
+        repeated IndexRule rules  = 2;
+    }
+    repeated ShardedIndexRule rules = 2;
+    Action action = 4;
+    google.protobuf.Timestamp time = 5;
+}
diff --git a/api/proto/banyandb/v1/schema.pb.go b/api/proto/banyandb/database/v1/schema.pb.go
similarity index 51%
rename from api/proto/banyandb/v1/schema.pb.go
rename to api/proto/banyandb/database/v1/schema.pb.go
index 3e6c668..d10008b 100644
--- a/api/proto/banyandb/v1/schema.pb.go
+++ b/api/proto/banyandb/database/v1/schema.pb.go
@@ -19,7 +19,7 @@
 // versions:
 // 	protoc-gen-go v1.27.1
 // 	protoc        v3.17.3
-// source: banyandb/v1/schema.proto
+// source: banyandb/database/v1/schema.proto
 
 package v1
 
@@ -30,6 +30,8 @@ import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
+
+	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
 )
 
 const (
@@ -78,11 +80,11 @@ func (x Duration_DurationUnit) String() string {
 }
 
 func (Duration_DurationUnit) Descriptor() protoreflect.EnumDescriptor {
-	return file_banyandb_v1_schema_proto_enumTypes[0].Descriptor()
+	return file_banyandb_database_v1_schema_proto_enumTypes[0].Descriptor()
 }
 
 func (Duration_DurationUnit) Type() protoreflect.EnumType {
-	return &file_banyandb_v1_schema_proto_enumTypes[0]
+	return &file_banyandb_database_v1_schema_proto_enumTypes[0]
 }
 
 func (x Duration_DurationUnit) Number() protoreflect.EnumNumber {
@@ -91,7 +93,7 @@ func (x Duration_DurationUnit) Number() protoreflect.EnumNumber {
 
 // Deprecated: Use Duration_DurationUnit.Descriptor instead.
 func (Duration_DurationUnit) EnumDescriptor() ([]byte, []int) {
-	return file_banyandb_v1_schema_proto_rawDescGZIP(), []int{1, 0}
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{1, 0}
 }
 
 type FieldSpec_FieldType int32
@@ -133,11 +135,11 @@ func (x FieldSpec_FieldType) String() string {
 }
 
 func (FieldSpec_FieldType) Descriptor() protoreflect.EnumDescriptor {
-	return file_banyandb_v1_schema_proto_enumTypes[1].Descriptor()
+	return file_banyandb_database_v1_schema_proto_enumTypes[1].Descriptor()
 }
 
 func (FieldSpec_FieldType) Type() protoreflect.EnumType {
-	return &file_banyandb_v1_schema_proto_enumTypes[1]
+	return &file_banyandb_database_v1_schema_proto_enumTypes[1]
 }
 
 func (x FieldSpec_FieldType) Number() protoreflect.EnumNumber {
@@ -146,7 +148,7 @@ func (x FieldSpec_FieldType) Number() protoreflect.EnumNumber {
 
 // Deprecated: Use FieldSpec_FieldType.Descriptor instead.
 func (FieldSpec_FieldType) EnumDescriptor() ([]byte, []int) {
-	return file_banyandb_v1_schema_proto_rawDescGZIP(), []int{2, 0}
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{2, 0}
 }
 
 // IndexType determine the index structure under the hood
@@ -196,11 +198,11 @@ func (x IndexObject_IndexType) String() string {
 }
 
 func (IndexObject_IndexType) Descriptor() protoreflect.EnumDescriptor {
-	return file_banyandb_v1_schema_proto_enumTypes[2].Descriptor()
+	return file_banyandb_database_v1_schema_proto_enumTypes[2].Descriptor()
 }
 
 func (IndexObject_IndexType) Type() protoreflect.EnumType {
-	return &file_banyandb_v1_schema_proto_enumTypes[2]
+	return &file_banyandb_database_v1_schema_proto_enumTypes[2]
 }
 
 func (x IndexObject_IndexType) Number() protoreflect.EnumNumber {
@@ -209,7 +211,7 @@ func (x IndexObject_IndexType) Number() protoreflect.EnumNumber {
 
 // Deprecated: Use IndexObject_IndexType.Descriptor instead.
 func (IndexObject_IndexType) EnumDescriptor() ([]byte, []int) {
-	return file_banyandb_v1_schema_proto_rawDescGZIP(), []int{6, 0}
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{6, 0}
 }
 
 // Catalog refers to a placement contains objects belonged to a particular data type
@@ -249,11 +251,11 @@ func (x Series_Catalog) String() string {
 }
 
 func (Series_Catalog) Descriptor() protoreflect.EnumDescriptor {
-	return file_banyandb_v1_schema_proto_enumTypes[3].Descriptor()
+	return file_banyandb_database_v1_schema_proto_enumTypes[3].Descriptor()
 }
 
 func (Series_Catalog) Type() protoreflect.EnumType {
-	return &file_banyandb_v1_schema_proto_enumTypes[3]
+	return &file_banyandb_database_v1_schema_proto_enumTypes[3]
 }
 
 func (x Series_Catalog) Number() protoreflect.EnumNumber {
@@ -262,7 +264,7 @@ func (x Series_Catalog) Number() protoreflect.EnumNumber {
 
 // Deprecated: Use Series_Catalog.Descriptor instead.
 func (Series_Catalog) EnumDescriptor() ([]byte, []int) {
-	return file_banyandb_v1_schema_proto_rawDescGZIP(), []int{8, 0}
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{8, 0}
 }
 
 type ShardInfo struct {
@@ -277,7 +279,7 @@ type ShardInfo struct {
 func (x *ShardInfo) Reset() {
 	*x = ShardInfo{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_schema_proto_msgTypes[0]
+		mi := &file_banyandb_database_v1_schema_proto_msgTypes[0]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -290,7 +292,7 @@ func (x *ShardInfo) String() string {
 func (*ShardInfo) ProtoMessage() {}
 
 func (x *ShardInfo) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_schema_proto_msgTypes[0]
+	mi := &file_banyandb_database_v1_schema_proto_msgTypes[0]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -303,7 +305,7 @@ func (x *ShardInfo) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ShardInfo.ProtoReflect.Descriptor instead.
 func (*ShardInfo) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_schema_proto_rawDescGZIP(), []int{0}
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{0}
 }
 
 func (x *ShardInfo) GetNumber() uint32 {
@@ -327,13 +329,13 @@ type Duration struct {
 	unknownFields protoimpl.UnknownFields
 
 	Val  uint32                `protobuf:"varint,1,opt,name=val,proto3" json:"val,omitempty"`
-	Unit Duration_DurationUnit `protobuf:"varint,2,opt,name=unit,proto3,enum=banyandb.v1.Duration_DurationUnit" json:"unit,omitempty"`
+	Unit Duration_DurationUnit `protobuf:"varint,2,opt,name=unit,proto3,enum=banyandb.database.v1.Duration_DurationUnit" json:"unit,omitempty"`
 }
 
 func (x *Duration) Reset() {
 	*x = Duration{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_schema_proto_msgTypes[1]
+		mi := &file_banyandb_database_v1_schema_proto_msgTypes[1]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -346,7 +348,7 @@ func (x *Duration) String() string {
 func (*Duration) ProtoMessage() {}
 
 func (x *Duration) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_schema_proto_msgTypes[1]
+	mi := &file_banyandb_database_v1_schema_proto_msgTypes[1]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -359,7 +361,7 @@ func (x *Duration) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Duration.ProtoReflect.Descriptor instead.
 func (*Duration) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_schema_proto_rawDescGZIP(), []int{1}
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{1}
 }
 
 func (x *Duration) GetVal() uint32 {
@@ -382,13 +384,13 @@ type FieldSpec struct {
 	unknownFields protoimpl.UnknownFields
 
 	Name string              `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	Type FieldSpec_FieldType `protobuf:"varint,2,opt,name=type,proto3,enum=banyandb.v1.FieldSpec_FieldType" json:"type,omitempty"`
+	Type FieldSpec_FieldType `protobuf:"varint,2,opt,name=type,proto3,enum=banyandb.database.v1.FieldSpec_FieldType" json:"type,omitempty"`
 }
 
 func (x *FieldSpec) Reset() {
 	*x = FieldSpec{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_schema_proto_msgTypes[2]
+		mi := &file_banyandb_database_v1_schema_proto_msgTypes[2]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -401,7 +403,7 @@ func (x *FieldSpec) String() string {
 func (*FieldSpec) ProtoMessage() {}
 
 func (x *FieldSpec) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_schema_proto_msgTypes[2]
+	mi := &file_banyandb_database_v1_schema_proto_msgTypes[2]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -414,7 +416,7 @@ func (x *FieldSpec) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FieldSpec.ProtoReflect.Descriptor instead.
 func (*FieldSpec) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_schema_proto_rawDescGZIP(), []int{2}
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{2}
 }
 
 func (x *FieldSpec) GetName() string {
@@ -444,7 +446,7 @@ type TraceStateMap struct {
 func (x *TraceStateMap) Reset() {
 	*x = TraceStateMap{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_schema_proto_msgTypes[3]
+		mi := &file_banyandb_database_v1_schema_proto_msgTypes[3]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -457,7 +459,7 @@ func (x *TraceStateMap) String() string {
 func (*TraceStateMap) ProtoMessage() {}
 
 func (x *TraceStateMap) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_schema_proto_msgTypes[3]
+	mi := &file_banyandb_database_v1_schema_proto_msgTypes[3]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -470,7 +472,7 @@ func (x *TraceStateMap) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use TraceStateMap.ProtoReflect.Descriptor instead.
 func (*TraceStateMap) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_schema_proto_rawDescGZIP(), []int{3}
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{3}
 }
 
 func (x *TraceStateMap) GetField() string {
@@ -512,7 +514,7 @@ type TraceFieldMap struct {
 func (x *TraceFieldMap) Reset() {
 	*x = TraceFieldMap{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_schema_proto_msgTypes[4]
+		mi := &file_banyandb_database_v1_schema_proto_msgTypes[4]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -525,7 +527,7 @@ func (x *TraceFieldMap) String() string {
 func (*TraceFieldMap) ProtoMessage() {}
 
 func (x *TraceFieldMap) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_schema_proto_msgTypes[4]
+	mi := &file_banyandb_database_v1_schema_proto_msgTypes[4]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -538,7 +540,7 @@ func (x *TraceFieldMap) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use TraceFieldMap.ProtoReflect.Descriptor instead.
 func (*TraceFieldMap) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_schema_proto_rawDescGZIP(), []int{4}
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{4}
 }
 
 func (x *TraceFieldMap) GetTraceId() string {
@@ -569,7 +571,7 @@ type TraceSeries struct {
 	unknownFields protoimpl.UnknownFields
 
 	// metadata is the identity of a trace series
-	Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
+	Metadata *v1.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
 	// fields defines accepted fields
 	Fields []*FieldSpec `protobuf:"bytes,2,rep,name=fields,proto3" json:"fields,omitempty"`
 	// reserved_fields_map indicates how to index reserved fields to ingested fields
@@ -585,7 +587,7 @@ type TraceSeries struct {
 func (x *TraceSeries) Reset() {
 	*x = TraceSeries{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_schema_proto_msgTypes[5]
+		mi := &file_banyandb_database_v1_schema_proto_msgTypes[5]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -598,7 +600,7 @@ func (x *TraceSeries) String() string {
 func (*TraceSeries) ProtoMessage() {}
 
 func (x *TraceSeries) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_schema_proto_msgTypes[5]
+	mi := &file_banyandb_database_v1_schema_proto_msgTypes[5]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -611,10 +613,10 @@ func (x *TraceSeries) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use TraceSeries.ProtoReflect.Descriptor instead.
 func (*TraceSeries) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_schema_proto_rawDescGZIP(), []int{5}
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{5}
 }
 
-func (x *TraceSeries) GetMetadata() *Metadata {
+func (x *TraceSeries) GetMetadata() *v1.Metadata {
 	if x != nil {
 		return x.Metadata
 	}
@@ -669,13 +671,13 @@ type IndexObject struct {
 	// Caveat: All fields in a multi-field index MUST have an identical IndexType
 	Fields []string `protobuf:"bytes,2,rep,name=fields,proto3" json:"fields,omitempty"`
 	// type is the IndexType of this IndexObject.
-	Type IndexObject_IndexType `protobuf:"varint,3,opt,name=type,proto3,enum=banyandb.v1.IndexObject_IndexType" json:"type,omitempty"`
+	Type IndexObject_IndexType `protobuf:"varint,3,opt,name=type,proto3,enum=banyandb.database.v1.IndexObject_IndexType" json:"type,omitempty"`
 }
 
 func (x *IndexObject) Reset() {
 	*x = IndexObject{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_schema_proto_msgTypes[6]
+		mi := &file_banyandb_database_v1_schema_proto_msgTypes[6]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -688,7 +690,7 @@ func (x *IndexObject) String() string {
 func (*IndexObject) ProtoMessage() {}
 
 func (x *IndexObject) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_schema_proto_msgTypes[6]
+	mi := &file_banyandb_database_v1_schema_proto_msgTypes[6]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -701,7 +703,7 @@ func (x *IndexObject) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use IndexObject.ProtoReflect.Descriptor instead.
 func (*IndexObject) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_schema_proto_rawDescGZIP(), []int{6}
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{6}
 }
 
 func (x *IndexObject) GetName() string {
@@ -757,7 +759,7 @@ type IndexRule struct {
 	unknownFields protoimpl.UnknownFields
 
 	// metadata define the rule's identity
-	Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
+	Metadata *v1.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
 	// objects refer to which fields should be indexed
 	Objects []*IndexObject `protobuf:"bytes,2,rep,name=objects,proto3" json:"objects,omitempty"`
 	// updated_at_nanoseconds indicates when the IndexRule is updated
@@ -767,7 +769,7 @@ type IndexRule struct {
 func (x *IndexRule) Reset() {
 	*x = IndexRule{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_schema_proto_msgTypes[7]
+		mi := &file_banyandb_database_v1_schema_proto_msgTypes[7]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -780,7 +782,7 @@ func (x *IndexRule) String() string {
 func (*IndexRule) ProtoMessage() {}
 
 func (x *IndexRule) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_schema_proto_msgTypes[7]
+	mi := &file_banyandb_database_v1_schema_proto_msgTypes[7]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -793,10 +795,10 @@ func (x *IndexRule) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use IndexRule.ProtoReflect.Descriptor instead.
 func (*IndexRule) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_schema_proto_rawDescGZIP(), []int{7}
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{7}
 }
 
-func (x *IndexRule) GetMetadata() *Metadata {
+func (x *IndexRule) GetMetadata() *v1.Metadata {
 	if x != nil {
 		return x.Metadata
 	}
@@ -830,15 +832,15 @@ type Series struct {
 	unknownFields protoimpl.UnknownFields
 
 	// catalog is where the subject/series belongs to
-	Catalog Series_Catalog `protobuf:"varint,1,opt,name=catalog,proto3,enum=banyandb.v1.Series_Catalog" json:"catalog,omitempty"`
+	Catalog Series_Catalog `protobuf:"varint,1,opt,name=catalog,proto3,enum=banyandb.database.v1.Series_Catalog" json:"catalog,omitempty"`
 	// series refers to a series in a particular catalog
-	Series *Metadata `protobuf:"bytes,2,opt,name=series,proto3" json:"series,omitempty"`
+	Series *v1.Metadata `protobuf:"bytes,2,opt,name=series,proto3" json:"series,omitempty"`
 }
 
 func (x *Series) Reset() {
 	*x = Series{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_schema_proto_msgTypes[8]
+		mi := &file_banyandb_database_v1_schema_proto_msgTypes[8]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -851,7 +853,7 @@ func (x *Series) String() string {
 func (*Series) ProtoMessage() {}
 
 func (x *Series) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_schema_proto_msgTypes[8]
+	mi := &file_banyandb_database_v1_schema_proto_msgTypes[8]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -864,7 +866,7 @@ func (x *Series) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Series.ProtoReflect.Descriptor instead.
 func (*Series) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_schema_proto_rawDescGZIP(), []int{8}
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{8}
 }
 
 func (x *Series) GetCatalog() Series_Catalog {
@@ -874,7 +876,7 @@ func (x *Series) GetCatalog() Series_Catalog {
 	return Series_CATALOG_UNSPECIFIED
 }
 
-func (x *Series) GetSeries() *Metadata {
+func (x *Series) GetSeries() *v1.Metadata {
 	if x != nil {
 		return x.Series
 	}
@@ -890,9 +892,9 @@ type IndexRuleBinding struct {
 	unknownFields protoimpl.UnknownFields
 
 	// metadata is the identity of this binding
-	Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
+	Metadata *v1.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
 	// rule_ref refers to the IndexRule
-	RuleRef *Metadata `protobuf:"bytes,2,opt,name=rule_ref,json=ruleRef,proto3" json:"rule_ref,omitempty"`
+	RuleRef *v1.Metadata `protobuf:"bytes,2,opt,name=rule_ref,json=ruleRef,proto3" json:"rule_ref,omitempty"`
 	// subjects indicate the subjects of binding action
 	Subjects []*Series `protobuf:"bytes,3,rep,name=subjects,proto3" json:"subjects,omitempty"`
 	// begin_at_nanoseconds is the timestamp, after which the binding will be active
@@ -907,7 +909,7 @@ type IndexRuleBinding struct {
 func (x *IndexRuleBinding) Reset() {
 	*x = IndexRuleBinding{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_schema_proto_msgTypes[9]
+		mi := &file_banyandb_database_v1_schema_proto_msgTypes[9]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -920,7 +922,7 @@ func (x *IndexRuleBinding) String() string {
 func (*IndexRuleBinding) ProtoMessage() {}
 
 func (x *IndexRuleBinding) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_schema_proto_msgTypes[9]
+	mi := &file_banyandb_database_v1_schema_proto_msgTypes[9]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -933,17 +935,17 @@ func (x *IndexRuleBinding) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use IndexRuleBinding.ProtoReflect.Descriptor instead.
 func (*IndexRuleBinding) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_schema_proto_rawDescGZIP(), []int{9}
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{9}
 }
 
-func (x *IndexRuleBinding) GetMetadata() *Metadata {
+func (x *IndexRuleBinding) GetMetadata() *v1.Metadata {
 	if x != nil {
 		return x.Metadata
 	}
 	return nil
 }
 
-func (x *IndexRuleBinding) GetRuleRef() *Metadata {
+func (x *IndexRuleBinding) GetRuleRef() *v1.Metadata {
 	if x != nil {
 		return x.RuleRef
 	}
@@ -978,150 +980,26 @@ func (x *IndexRuleBinding) GetUpdatedAt() *timestamppb.Timestamp {
 	return nil
 }
 
-type IndexRuleEvent struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Series *Metadata                          `protobuf:"bytes,1,opt,name=series,proto3" json:"series,omitempty"`
-	Rules  []*IndexRuleEvent_ShardedIndexRule `protobuf:"bytes,2,rep,name=rules,proto3" json:"rules,omitempty"`
-	Action Action                             `protobuf:"varint,4,opt,name=action,proto3,enum=banyandb.v1.Action" json:"action,omitempty"`
-	Time   *timestamppb.Timestamp             `protobuf:"bytes,5,opt,name=time,proto3" json:"time,omitempty"`
-}
-
-func (x *IndexRuleEvent) Reset() {
-	*x = IndexRuleEvent{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_schema_proto_msgTypes[10]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *IndexRuleEvent) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*IndexRuleEvent) ProtoMessage() {}
-
-func (x *IndexRuleEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_schema_proto_msgTypes[10]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use IndexRuleEvent.ProtoReflect.Descriptor instead.
-func (*IndexRuleEvent) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_schema_proto_rawDescGZIP(), []int{10}
-}
-
-func (x *IndexRuleEvent) GetSeries() *Metadata {
-	if x != nil {
-		return x.Series
-	}
-	return nil
-}
-
-func (x *IndexRuleEvent) GetRules() []*IndexRuleEvent_ShardedIndexRule {
-	if x != nil {
-		return x.Rules
-	}
-	return nil
-}
-
-func (x *IndexRuleEvent) GetAction() Action {
-	if x != nil {
-		return x.Action
-	}
-	return Action_ACTION_UNSPECIFIED
-}
-
-func (x *IndexRuleEvent) GetTime() *timestamppb.Timestamp {
-	if x != nil {
-		return x.Time
-	}
-	return nil
-}
-
-type IndexRuleEvent_ShardedIndexRule struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	ShardId uint64       `protobuf:"varint,1,opt,name=shard_id,json=shardId,proto3" json:"shard_id,omitempty"`
-	Rules   []*IndexRule `protobuf:"bytes,2,rep,name=rules,proto3" json:"rules,omitempty"`
-}
-
-func (x *IndexRuleEvent_ShardedIndexRule) Reset() {
-	*x = IndexRuleEvent_ShardedIndexRule{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_schema_proto_msgTypes[11]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *IndexRuleEvent_ShardedIndexRule) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*IndexRuleEvent_ShardedIndexRule) ProtoMessage() {}
-
-func (x *IndexRuleEvent_ShardedIndexRule) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_schema_proto_msgTypes[11]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use IndexRuleEvent_ShardedIndexRule.ProtoReflect.Descriptor instead.
-func (*IndexRuleEvent_ShardedIndexRule) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_schema_proto_rawDescGZIP(), []int{10, 0}
-}
-
-func (x *IndexRuleEvent_ShardedIndexRule) GetShardId() uint64 {
-	if x != nil {
-		return x.ShardId
-	}
-	return 0
-}
-
-func (x *IndexRuleEvent_ShardedIndexRule) GetRules() []*IndexRule {
-	if x != nil {
-		return x.Rules
-	}
-	return nil
-}
-
-var File_banyandb_v1_schema_proto protoreflect.FileDescriptor
-
-var file_banyandb_v1_schema_proto_rawDesc = []byte{
-	0x0a, 0x18, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x63,
-	0x68, 0x65, 0x6d, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x62, 0x61, 0x6e, 0x79,
-	0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
-	0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
-	0x64, 0x62, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x22, 0x4a, 0x0a, 0x09, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66,
-	0x6f, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x0d, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x6f, 0x75,
-	0x74, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
-	0x09, 0x52, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73,
-	0x22, 0xe4, 0x01, 0x0a, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a,
-	0x03, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x76, 0x61, 0x6c, 0x12,
-	0x36, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e,
-	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x75, 0x72, 0x61,
+var File_banyandb_database_v1_schema_proto protoreflect.FileDescriptor
+
+var file_banyandb_database_v1_schema_proto_rawDesc = []byte{
+	0x0a, 0x21, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62,
+	0x61, 0x73, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x12, 0x14, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61,
+	0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73,
+	0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x62, 0x61, 0x6e, 0x79,
+	0x61, 0x6e, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x63,
+	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x4a, 0x0a, 0x09, 0x53,
+	0x68, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62,
+	0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72,
+	0x12, 0x25, 0x0a, 0x0e, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c,
+	0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e,
+	0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x08, 0x44, 0x75, 0x72, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0d, 0x52, 0x03, 0x76, 0x61, 0x6c, 0x12, 0x3f, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e,
+	0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x75, 0x72, 0x61,
 	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x69,
 	0x74, 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x0c, 0x44, 0x75, 0x72, 0x61,
 	0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x69, 0x74, 0x12, 0x1d, 0x0a, 0x19, 0x44, 0x55, 0x52, 0x41,
@@ -1132,227 +1010,207 @@ var file_banyandb_v1_schema_proto_rawDesc = []byte{
 	0x5f, 0x44, 0x41, 0x59, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49,
 	0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x49, 0x54, 0x5f, 0x57, 0x45, 0x45, 0x4b, 0x10, 0x03, 0x12, 0x17,
 	0x0a, 0x13, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x49, 0x54, 0x5f,
-	0x4d, 0x4f, 0x4e, 0x54, 0x48, 0x10, 0x04, 0x22, 0xe1, 0x01, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c,
+	0x4d, 0x4f, 0x4e, 0x54, 0x48, 0x10, 0x04, 0x22, 0xea, 0x01, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c,
 	0x64, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70,
-	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
-	0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x70, 0x65, 0x63, 0x2e,
-	0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22,
-	0x89, 0x01, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a,
-	0x16, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50,
-	0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x46, 0x49, 0x45,
-	0x4c, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01,
-	0x12, 0x12, 0x0a, 0x0e, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49,
-	0x4e, 0x54, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x54, 0x59,
-	0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x52, 0x52, 0x41, 0x59, 0x10,
-	0x03, 0x12, 0x18, 0x0a, 0x14, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f,
-	0x49, 0x4e, 0x54, 0x5f, 0x41, 0x52, 0x52, 0x41, 0x59, 0x10, 0x04, 0x22, 0x63, 0x0a, 0x0d, 0x54,
-	0x72, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x70, 0x12, 0x14, 0x0a, 0x05,
-	0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65,
-	0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73,
-	0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x53, 0x75, 0x63, 0x63,
-	0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72,
-	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72,
-	0x22, 0x79, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x63, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61,
-	0x70, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09,
-	0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52,
-	0x08, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61,
-	0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
-	0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74,
-	0x65, 0x4d, 0x61, 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xd8, 0x02, 0x0a, 0x0b,
-	0x54, 0x72, 0x61, 0x63, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x6d,
-	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e,
-	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61,
-	0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2e,
-	0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16,
-	0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x65,
-	0x6c, 0x64, 0x53, 0x70, 0x65, 0x63, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x4a,
-	0x0a, 0x13, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64,
-	0x73, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62, 0x61,
-	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x46,
-	0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x52, 0x11, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65,
-	0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x4d, 0x61, 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x73, 0x68,
-	0x61, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x62, 0x61, 0x6e, 0x79,
-	0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66,
-	0x6f, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x31, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x61, 0x6e,
-	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
-	0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x75,
-	0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
-	0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64,
-	0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xb8, 0x02, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78,
-	0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69,
-	0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c,
-	0x64, 0x73, 0x12, 0x36, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e,
-	0x32, 0x22, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x49,
-	0x6e, 0x64, 0x65, 0x78, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78,
-	0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xc4, 0x01, 0x0a, 0x09, 0x49,
-	0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x44, 0x45,
-	0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,
-	0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x5f, 0x54, 0x59,
-	0x50, 0x45, 0x5f, 0x54, 0x45, 0x58, 0x54, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x44,
-	0x45, 0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x55, 0x4d, 0x45, 0x52, 0x49, 0x43, 0x41,
-	0x4c, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x5f, 0x54, 0x59, 0x50,
-	0x45, 0x5f, 0x49, 0x44, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x5f,
-	0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x54, 0x45, 0x58, 0x54, 0x10,
-	0x04, 0x12, 0x1e, 0x0a, 0x1a, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f,
-	0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x4e, 0x55, 0x4d, 0x45, 0x52, 0x49, 0x43, 0x41, 0x4c, 0x10,
-	0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f,
-	0x53, 0x45, 0x52, 0x49, 0x45, 0x53, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10,
-	0x06, 0x22, 0xad, 0x01, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x12,
-	0x31, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x15, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e,
-	0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61,
-	0x74, 0x61, 0x12, 0x32, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20,
-	0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76,
-	0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f,
-	0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
-	0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,
-	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d,
-	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41,
-	0x74, 0x22, 0xca, 0x01, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x07,
-	0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e,
-	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x69,
-	0x65, 0x73, 0x2e, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x52, 0x07, 0x63, 0x61, 0x74, 0x61,
-	0x6c, 0x6f, 0x67, 0x12, 0x2d, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76,
-	0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x06, 0x73, 0x65, 0x72, 0x69,
-	0x65, 0x73, 0x22, 0x5a, 0x0a, 0x07, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x12, 0x17, 0x0a,
-	0x13, 0x43, 0x41, 0x54, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49,
-	0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x41, 0x54, 0x41, 0x4c, 0x4f,
-	0x47, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x54,
-	0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x4f, 0x47, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x41,
-	0x54, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x10, 0x03, 0x22, 0xd3,
-	0x02, 0x0a, 0x10, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64,
-	0x69, 0x6e, 0x67, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62,
-	0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65,
-	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x30, 0x0a, 0x08, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x72,
-	0x65, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
-	0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52,
-	0x07, 0x72, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x12, 0x2f, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x6a,
-	0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x62, 0x61, 0x6e,
-	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52,
-	0x08, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x62, 0x65, 0x67,
-	0x69, 0x6e, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
-	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69,
-	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x41, 0x74,
-	0x12, 0x37, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52,
-	0x08, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64,
+	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x74, 0x79, 0x70,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
+	0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46,
+	0x69, 0x65, 0x6c, 0x64, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79,
+	0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x89, 0x01, 0x0a, 0x09, 0x46, 0x69, 0x65,
+	0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f,
+	0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44,
+	0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45,
+	0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x46, 0x49, 0x45,
+	0x4c, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x10, 0x02, 0x12, 0x1b, 0x0a,
+	0x17, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49,
+	0x4e, 0x47, 0x5f, 0x41, 0x52, 0x52, 0x41, 0x59, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x46, 0x49,
+	0x45, 0x4c, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x5f, 0x41, 0x52, 0x52,
+	0x41, 0x59, 0x10, 0x04, 0x22, 0x63, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61,
+	0x74, 0x65, 0x4d, 0x61, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x76,
+	0x61, 0x6c, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0a, 0x76, 0x61, 0x6c, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09,
+	0x76, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x08, 0x76, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x82, 0x01, 0x0a, 0x0d, 0x54, 0x72,
+	0x61, 0x63, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x74,
+	0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74,
+	0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73,
+	0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x72, 0x69, 0x65,
+	0x73, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x23, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61,
+	0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x53,
+	0x74, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x83,
+	0x03, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x38,
+	0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
+	0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08,
+	0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x37, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c,
+	0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
+	0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+	0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x70, 0x65, 0x63, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64,
+	0x73, 0x12, 0x53, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x66, 0x69,
+	0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23,
+	0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61,
+	0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64,
+	0x4d, 0x61, 0x70, 0x52, 0x11, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x46, 0x69, 0x65,
+	0x6c, 0x64, 0x73, 0x4d, 0x61, 0x70, 0x12, 0x35, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62,
+	0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x61,
+	0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x3a, 0x0a,
+	0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1e, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62,
+	0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,
+	0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64,
 	0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
 	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
 	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74,
-	0x65, 0x64, 0x41, 0x74, 0x22, 0xbd, 0x02, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75,
-	0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x69, 0x65,
-	0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
-	0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x06,
-	0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18,
-	0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62,
-	0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x45, 0x76, 0x65,
-	0x6e, 0x74, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x65, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52,
-	0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x06, 0x61, 0x63,
-	0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x62, 0x61, 0x6e,
-	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52,
-	0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18,
-	0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
-	0x70, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0x5b, 0x0a, 0x10, 0x53, 0x68, 0x61, 0x72, 0x64,
-	0x65, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x73,
-	0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73,
-	0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18,
-	0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62,
-	0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72,
-	0x75, 0x6c, 0x65, 0x73, 0x42, 0x60, 0x0a, 0x1e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63,
-	0x68, 0x65, 0x2e, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x61,
-	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
-	0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c,
-	0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61, 0x70,
-	0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62,
-	0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x65, 0x64, 0x41, 0x74, 0x22, 0xc1, 0x02, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x62,
+	0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c,
+	0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73,
+	0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b,
+	0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61,
+	0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x62, 0x6a, 0x65, 0x63,
+	0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,
+	0x65, 0x22, 0xc4, 0x01, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12,
+	0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e,
+	0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x49,
+	0x4e, 0x44, 0x45, 0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x58, 0x54, 0x10, 0x01,
+	0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e,
+	0x55, 0x4d, 0x45, 0x52, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x4e,
+	0x44, 0x45, 0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x44, 0x10, 0x03, 0x12, 0x19, 0x0a,
+	0x15, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x55, 0x4c, 0x54,
+	0x49, 0x5f, 0x54, 0x45, 0x58, 0x54, 0x10, 0x04, 0x12, 0x1e, 0x0a, 0x1a, 0x49, 0x4e, 0x44, 0x45,
+	0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x4e, 0x55, 0x4d,
+	0x45, 0x52, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x49, 0x4e, 0x44, 0x45,
+	0x58, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x49, 0x45, 0x53, 0x5f, 0x49, 0x4e,
+	0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x06, 0x22, 0xbd, 0x01, 0x0a, 0x09, 0x49, 0x6e, 0x64,
+	0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61,
+	0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
+	0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65,
+	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
+	0x12, 0x3b, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x21, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74,
+	0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x62,
+	0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x39, 0x0a,
+	0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75,
+	0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xda, 0x01, 0x0a, 0x06, 0x53, 0x65, 0x72,
+	0x69, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x07, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e,
+	0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x69,
+	0x65, 0x73, 0x2e, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x52, 0x07, 0x63, 0x61, 0x74, 0x61,
+	0x6c, 0x6f, 0x67, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x63,
+	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+	0x61, 0x52, 0x06, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0x5a, 0x0a, 0x07, 0x43, 0x61, 0x74,
+	0x61, 0x6c, 0x6f, 0x67, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x54, 0x41, 0x4c, 0x4f, 0x47, 0x5f,
+	0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a,
+	0x0d, 0x43, 0x41, 0x54, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, 0x01,
+	0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x54, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x4f, 0x47, 0x10,
+	0x02, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x41, 0x54, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x4d, 0x45, 0x54,
+	0x52, 0x49, 0x43, 0x10, 0x03, 0x22, 0xea, 0x02, 0x0a, 0x10, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52,
+	0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65,
+	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62,
+	0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76,
+	0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61,
+	0x64, 0x61, 0x74, 0x61, 0x12, 0x37, 0x0a, 0x08, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x66,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
+	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61,
+	0x64, 0x61, 0x74, 0x61, 0x52, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x12, 0x38, 0x0a,
+	0x08, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62,
+	0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x08, 0x73,
+	0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x62, 0x65, 0x67, 0x69, 0x6e,
+	0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x41, 0x74, 0x12, 0x37,
+	0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x65,
+	0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
+	0x41, 0x74, 0x42, 0x72, 0x0a, 0x2a, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65,
+	0x2e, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79,
+	0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31,
+	0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61,
+	0x63, 0x68, 0x65, 0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62,
+	0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2f, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62,
+	0x61, 0x73, 0x65, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
-	file_banyandb_v1_schema_proto_rawDescOnce sync.Once
-	file_banyandb_v1_schema_proto_rawDescData = file_banyandb_v1_schema_proto_rawDesc
+	file_banyandb_database_v1_schema_proto_rawDescOnce sync.Once
+	file_banyandb_database_v1_schema_proto_rawDescData = file_banyandb_database_v1_schema_proto_rawDesc
 )
 
-func file_banyandb_v1_schema_proto_rawDescGZIP() []byte {
-	file_banyandb_v1_schema_proto_rawDescOnce.Do(func() {
-		file_banyandb_v1_schema_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_v1_schema_proto_rawDescData)
+func file_banyandb_database_v1_schema_proto_rawDescGZIP() []byte {
+	file_banyandb_database_v1_schema_proto_rawDescOnce.Do(func() {
+		file_banyandb_database_v1_schema_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_database_v1_schema_proto_rawDescData)
 	})
-	return file_banyandb_v1_schema_proto_rawDescData
-}
-
-var file_banyandb_v1_schema_proto_enumTypes = make([]protoimpl.EnumInfo, 4)
-var file_banyandb_v1_schema_proto_msgTypes = make([]protoimpl.MessageInfo, 12)
-var file_banyandb_v1_schema_proto_goTypes = []interface{}{
-	(Duration_DurationUnit)(0),              // 0: banyandb.v1.Duration.DurationUnit
-	(FieldSpec_FieldType)(0),                // 1: banyandb.v1.FieldSpec.FieldType
-	(IndexObject_IndexType)(0),              // 2: banyandb.v1.IndexObject.IndexType
-	(Series_Catalog)(0),                     // 3: banyandb.v1.Series.Catalog
-	(*ShardInfo)(nil),                       // 4: banyandb.v1.ShardInfo
-	(*Duration)(nil),                        // 5: banyandb.v1.Duration
-	(*FieldSpec)(nil),                       // 6: banyandb.v1.FieldSpec
-	(*TraceStateMap)(nil),                   // 7: banyandb.v1.TraceStateMap
-	(*TraceFieldMap)(nil),                   // 8: banyandb.v1.TraceFieldMap
-	(*TraceSeries)(nil),                     // 9: banyandb.v1.TraceSeries
-	(*IndexObject)(nil),                     // 10: banyandb.v1.IndexObject
-	(*IndexRule)(nil),                       // 11: banyandb.v1.IndexRule
-	(*Series)(nil),                          // 12: banyandb.v1.Series
-	(*IndexRuleBinding)(nil),                // 13: banyandb.v1.IndexRuleBinding
-	(*IndexRuleEvent)(nil),                  // 14: banyandb.v1.IndexRuleEvent
-	(*IndexRuleEvent_ShardedIndexRule)(nil), // 15: banyandb.v1.IndexRuleEvent.ShardedIndexRule
-	(*Metadata)(nil),                        // 16: banyandb.v1.Metadata
-	(*timestamppb.Timestamp)(nil),           // 17: google.protobuf.Timestamp
-	(Action)(0),                             // 18: banyandb.v1.Action
-}
-var file_banyandb_v1_schema_proto_depIdxs = []int32{
-	0,  // 0: banyandb.v1.Duration.unit:type_name -> banyandb.v1.Duration.DurationUnit
-	1,  // 1: banyandb.v1.FieldSpec.type:type_name -> banyandb.v1.FieldSpec.FieldType
-	7,  // 2: banyandb.v1.TraceFieldMap.state:type_name -> banyandb.v1.TraceStateMap
-	16, // 3: banyandb.v1.TraceSeries.metadata:type_name -> banyandb.v1.Metadata
-	6,  // 4: banyandb.v1.TraceSeries.fields:type_name -> banyandb.v1.FieldSpec
-	8,  // 5: banyandb.v1.TraceSeries.reserved_fields_map:type_name -> banyandb.v1.TraceFieldMap
-	4,  // 6: banyandb.v1.TraceSeries.shard:type_name -> banyandb.v1.ShardInfo
-	5,  // 7: banyandb.v1.TraceSeries.duration:type_name -> banyandb.v1.Duration
-	17, // 8: banyandb.v1.TraceSeries.updated_at:type_name -> google.protobuf.Timestamp
-	2,  // 9: banyandb.v1.IndexObject.type:type_name -> banyandb.v1.IndexObject.IndexType
-	16, // 10: banyandb.v1.IndexRule.metadata:type_name -> banyandb.v1.Metadata
-	10, // 11: banyandb.v1.IndexRule.objects:type_name -> banyandb.v1.IndexObject
-	17, // 12: banyandb.v1.IndexRule.updated_at:type_name -> google.protobuf.Timestamp
-	3,  // 13: banyandb.v1.Series.catalog:type_name -> banyandb.v1.Series.Catalog
-	16, // 14: banyandb.v1.Series.series:type_name -> banyandb.v1.Metadata
-	16, // 15: banyandb.v1.IndexRuleBinding.metadata:type_name -> banyandb.v1.Metadata
-	16, // 16: banyandb.v1.IndexRuleBinding.rule_ref:type_name -> banyandb.v1.Metadata
-	12, // 17: banyandb.v1.IndexRuleBinding.subjects:type_name -> banyandb.v1.Series
-	17, // 18: banyandb.v1.IndexRuleBinding.begin_at:type_name -> google.protobuf.Timestamp
-	17, // 19: banyandb.v1.IndexRuleBinding.expire_at:type_name -> google.protobuf.Timestamp
-	17, // 20: banyandb.v1.IndexRuleBinding.updated_at:type_name -> google.protobuf.Timestamp
-	16, // 21: banyandb.v1.IndexRuleEvent.series:type_name -> banyandb.v1.Metadata
-	15, // 22: banyandb.v1.IndexRuleEvent.rules:type_name -> banyandb.v1.IndexRuleEvent.ShardedIndexRule
-	18, // 23: banyandb.v1.IndexRuleEvent.action:type_name -> banyandb.v1.Action
-	17, // 24: banyandb.v1.IndexRuleEvent.time:type_name -> google.protobuf.Timestamp
-	11, // 25: banyandb.v1.IndexRuleEvent.ShardedIndexRule.rules:type_name -> banyandb.v1.IndexRule
-	26, // [26:26] is the sub-list for method output_type
-	26, // [26:26] is the sub-list for method input_type
-	26, // [26:26] is the sub-list for extension type_name
-	26, // [26:26] is the sub-list for extension extendee
-	0,  // [0:26] is the sub-list for field type_name
-}
-
-func init() { file_banyandb_v1_schema_proto_init() }
-func file_banyandb_v1_schema_proto_init() {
-	if File_banyandb_v1_schema_proto != nil {
+	return file_banyandb_database_v1_schema_proto_rawDescData
+}
+
+var file_banyandb_database_v1_schema_proto_enumTypes = make([]protoimpl.EnumInfo, 4)
+var file_banyandb_database_v1_schema_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
+var file_banyandb_database_v1_schema_proto_goTypes = []interface{}{
+	(Duration_DurationUnit)(0),    // 0: banyandb.database.v1.Duration.DurationUnit
+	(FieldSpec_FieldType)(0),      // 1: banyandb.database.v1.FieldSpec.FieldType
+	(IndexObject_IndexType)(0),    // 2: banyandb.database.v1.IndexObject.IndexType
+	(Series_Catalog)(0),           // 3: banyandb.database.v1.Series.Catalog
+	(*ShardInfo)(nil),             // 4: banyandb.database.v1.ShardInfo
+	(*Duration)(nil),              // 5: banyandb.database.v1.Duration
+	(*FieldSpec)(nil),             // 6: banyandb.database.v1.FieldSpec
+	(*TraceStateMap)(nil),         // 7: banyandb.database.v1.TraceStateMap
+	(*TraceFieldMap)(nil),         // 8: banyandb.database.v1.TraceFieldMap
+	(*TraceSeries)(nil),           // 9: banyandb.database.v1.TraceSeries
+	(*IndexObject)(nil),           // 10: banyandb.database.v1.IndexObject
+	(*IndexRule)(nil),             // 11: banyandb.database.v1.IndexRule
+	(*Series)(nil),                // 12: banyandb.database.v1.Series
+	(*IndexRuleBinding)(nil),      // 13: banyandb.database.v1.IndexRuleBinding
+	(*v1.Metadata)(nil),           // 14: banyandb.common.v1.Metadata
+	(*timestamppb.Timestamp)(nil), // 15: google.protobuf.Timestamp
+}
+var file_banyandb_database_v1_schema_proto_depIdxs = []int32{
+	0,  // 0: banyandb.database.v1.Duration.unit:type_name -> banyandb.database.v1.Duration.DurationUnit
+	1,  // 1: banyandb.database.v1.FieldSpec.type:type_name -> banyandb.database.v1.FieldSpec.FieldType
+	7,  // 2: banyandb.database.v1.TraceFieldMap.state:type_name -> banyandb.database.v1.TraceStateMap
+	14, // 3: banyandb.database.v1.TraceSeries.metadata:type_name -> banyandb.common.v1.Metadata
+	6,  // 4: banyandb.database.v1.TraceSeries.fields:type_name -> banyandb.database.v1.FieldSpec
+	8,  // 5: banyandb.database.v1.TraceSeries.reserved_fields_map:type_name -> banyandb.database.v1.TraceFieldMap
+	4,  // 6: banyandb.database.v1.TraceSeries.shard:type_name -> banyandb.database.v1.ShardInfo
+	5,  // 7: banyandb.database.v1.TraceSeries.duration:type_name -> banyandb.database.v1.Duration
+	15, // 8: banyandb.database.v1.TraceSeries.updated_at:type_name -> google.protobuf.Timestamp
+	2,  // 9: banyandb.database.v1.IndexObject.type:type_name -> banyandb.database.v1.IndexObject.IndexType
+	14, // 10: banyandb.database.v1.IndexRule.metadata:type_name -> banyandb.common.v1.Metadata
+	10, // 11: banyandb.database.v1.IndexRule.objects:type_name -> banyandb.database.v1.IndexObject
+	15, // 12: banyandb.database.v1.IndexRule.updated_at:type_name -> google.protobuf.Timestamp
+	3,  // 13: banyandb.database.v1.Series.catalog:type_name -> banyandb.database.v1.Series.Catalog
+	14, // 14: banyandb.database.v1.Series.series:type_name -> banyandb.common.v1.Metadata
+	14, // 15: banyandb.database.v1.IndexRuleBinding.metadata:type_name -> banyandb.common.v1.Metadata
+	14, // 16: banyandb.database.v1.IndexRuleBinding.rule_ref:type_name -> banyandb.common.v1.Metadata
+	12, // 17: banyandb.database.v1.IndexRuleBinding.subjects:type_name -> banyandb.database.v1.Series
+	15, // 18: banyandb.database.v1.IndexRuleBinding.begin_at:type_name -> google.protobuf.Timestamp
+	15, // 19: banyandb.database.v1.IndexRuleBinding.expire_at:type_name -> google.protobuf.Timestamp
+	15, // 20: banyandb.database.v1.IndexRuleBinding.updated_at:type_name -> google.protobuf.Timestamp
+	21, // [21:21] is the sub-list for method output_type
+	21, // [21:21] is the sub-list for method input_type
+	21, // [21:21] is the sub-list for extension type_name
+	21, // [21:21] is the sub-list for extension extendee
+	0,  // [0:21] is the sub-list for field type_name
+}
+
+func init() { file_banyandb_database_v1_schema_proto_init() }
+func file_banyandb_database_v1_schema_proto_init() {
+	if File_banyandb_database_v1_schema_proto != nil {
 		return
 	}
-	file_banyandb_v1_database_proto_init()
 	if !protoimpl.UnsafeEnabled {
-		file_banyandb_v1_schema_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+		file_banyandb_database_v1_schema_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ShardInfo); i {
 			case 0:
 				return &v.state
@@ -1364,7 +1222,7 @@ func file_banyandb_v1_schema_proto_init() {
 				return nil
 			}
 		}
-		file_banyandb_v1_schema_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+		file_banyandb_database_v1_schema_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Duration); i {
 			case 0:
 				return &v.state
@@ -1376,7 +1234,7 @@ func file_banyandb_v1_schema_proto_init() {
 				return nil
 			}
 		}
-		file_banyandb_v1_schema_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+		file_banyandb_database_v1_schema_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FieldSpec); i {
 			case 0:
 				return &v.state
@@ -1388,7 +1246,7 @@ func file_banyandb_v1_schema_proto_init() {
 				return nil
 			}
 		}
-		file_banyandb_v1_schema_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+		file_banyandb_database_v1_schema_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TraceStateMap); i {
 			case 0:
 				return &v.state
@@ -1400,7 +1258,7 @@ func file_banyandb_v1_schema_proto_init() {
 				return nil
 			}
 		}
-		file_banyandb_v1_schema_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+		file_banyandb_database_v1_schema_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TraceFieldMap); i {
 			case 0:
 				return &v.state
@@ -1412,7 +1270,7 @@ func file_banyandb_v1_schema_proto_init() {
 				return nil
 			}
 		}
-		file_banyandb_v1_schema_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+		file_banyandb_database_v1_schema_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TraceSeries); i {
 			case 0:
 				return &v.state
@@ -1424,7 +1282,7 @@ func file_banyandb_v1_schema_proto_init() {
 				return nil
 			}
 		}
-		file_banyandb_v1_schema_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+		file_banyandb_database_v1_schema_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*IndexObject); i {
 			case 0:
 				return &v.state
@@ -1436,7 +1294,7 @@ func file_banyandb_v1_schema_proto_init() {
 				return nil
 			}
 		}
-		file_banyandb_v1_schema_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+		file_banyandb_database_v1_schema_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*IndexRule); i {
 			case 0:
 				return &v.state
@@ -1448,7 +1306,7 @@ func file_banyandb_v1_schema_proto_init() {
 				return nil
 			}
 		}
-		file_banyandb_v1_schema_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+		file_banyandb_database_v1_schema_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Series); i {
 			case 0:
 				return &v.state
@@ -1460,7 +1318,7 @@ func file_banyandb_v1_schema_proto_init() {
 				return nil
 			}
 		}
-		file_banyandb_v1_schema_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+		file_banyandb_database_v1_schema_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*IndexRuleBinding); i {
 			case 0:
 				return &v.state
@@ -1472,48 +1330,24 @@ func file_banyandb_v1_schema_proto_init() {
 				return nil
 			}
 		}
-		file_banyandb_v1_schema_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*IndexRuleEvent); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_schema_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*IndexRuleEvent_ShardedIndexRule); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
-			RawDescriptor: file_banyandb_v1_schema_proto_rawDesc,
+			RawDescriptor: file_banyandb_database_v1_schema_proto_rawDesc,
 			NumEnums:      4,
-			NumMessages:   12,
+			NumMessages:   10,
 			NumExtensions: 0,
 			NumServices:   0,
 		},
-		GoTypes:           file_banyandb_v1_schema_proto_goTypes,
-		DependencyIndexes: file_banyandb_v1_schema_proto_depIdxs,
-		EnumInfos:         file_banyandb_v1_schema_proto_enumTypes,
-		MessageInfos:      file_banyandb_v1_schema_proto_msgTypes,
+		GoTypes:           file_banyandb_database_v1_schema_proto_goTypes,
+		DependencyIndexes: file_banyandb_database_v1_schema_proto_depIdxs,
+		EnumInfos:         file_banyandb_database_v1_schema_proto_enumTypes,
+		MessageInfos:      file_banyandb_database_v1_schema_proto_msgTypes,
 	}.Build()
-	File_banyandb_v1_schema_proto = out.File
-	file_banyandb_v1_schema_proto_rawDesc = nil
-	file_banyandb_v1_schema_proto_goTypes = nil
-	file_banyandb_v1_schema_proto_depIdxs = nil
+	File_banyandb_database_v1_schema_proto = out.File
+	file_banyandb_database_v1_schema_proto_rawDesc = nil
+	file_banyandb_database_v1_schema_proto_goTypes = nil
+	file_banyandb_database_v1_schema_proto_depIdxs = nil
 }
diff --git a/api/proto/banyandb/database/v1/schema.proto b/api/proto/banyandb/database/v1/schema.proto
new file mode 100644
index 0000000..11c53c0
--- /dev/null
+++ b/api/proto/banyandb/database/v1/schema.proto
@@ -0,0 +1,187 @@
+// 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.database.v1";
+option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1";
+
+package banyandb.database.v1;
+
+import "google/protobuf/timestamp.proto";
+import "banyandb/common/v1/common.proto";
+
+message ShardInfo {
+    uint32 number = 1;
+    repeated string routing_fields = 2;
+}
+
+// Duration represents the elapsed time between two instants
+message Duration {
+    uint32 val = 1;
+    enum DurationUnit {
+        DURATION_UNIT_UNSPECIFIED = 0;
+        DURATION_UNIT_HOUR = 1;
+        DURATION_UNIT_DAY = 2;
+        DURATION_UNIT_WEEK = 3;
+        DURATION_UNIT_MONTH = 4;
+    }
+    DurationUnit unit = 2;
+}
+
+message FieldSpec {
+    string name = 1;
+    enum FieldType {
+        FIELD_TYPE_UNSPECIFIED = 0;
+        FIELD_TYPE_STRING = 1;
+        FIELD_TYPE_INT = 2;
+        FIELD_TYPE_STRING_ARRAY = 3;
+        FIELD_TYPE_INT_ARRAY = 4;
+    }
+    FieldType type = 2;
+}
+
+message TraceStateMap {
+    string field = 1;
+    string val_success = 2;
+    string val_error = 3;
+}
+
+// The key in TraceFieldMap are reserved by trace series engine. Their corresponding value is the Fields or
+// the combination of Fields
+message TraceFieldMap {
+    // trace_id the unique identity of a single trace
+    string trace_id = 1;
+    // series_id groups entities into a storage bucket
+    repeated string series_id = 2;
+    // state indicates the trace is "success" or "error"
+    TraceStateMap state = 3;
+}
+
+// TraceSeries represents a trace storage object
+message TraceSeries {
+    // metadata is the identity of a trace series
+    common.v1.Metadata metadata = 1;
+    // fields defines accepted fields
+    repeated FieldSpec fields = 2;
+    // reserved_fields_map indicates how to index reserved fields to ingested fields
+    TraceFieldMap reserved_fields_map = 3;
+    // shard indicates how trace data distributes
+    ShardInfo shard = 4;
+    // duration determines how long a TraceSeries keeps its data
+    Duration duration = 5;
+    // updated_at_nanoseconds indicates when the TraceSeries is updated
+    google.protobuf.Timestamp updated_at = 6;
+}
+
+// IndexObject defines who should be indexed.
+message IndexObject {
+    // name is the identity of a IndexObject
+    string name = 1;
+    // fields are the combination that refers to an indexed object
+    // If the elements in fields are more than 1, the object will generate a multi-field index
+    // Caveat: All fields in a multi-field index MUST have an identical IndexType
+    repeated string fields = 2;
+    // IndexType determine the index structure under the hood
+    // Fields with SeriesInternal type is reserved by Series module, would not be indexed by Index module.
+    enum IndexType {
+        INDEX_TYPE_UNSPECIFIED = 0;
+        INDEX_TYPE_TEXT = 1;
+        INDEX_TYPE_NUMERICAL = 2;
+        INDEX_TYPE_ID = 3;
+        INDEX_TYPE_MULTI_TEXT = 4;
+        INDEX_TYPE_MULTI_NUMERICAL = 5;
+        INDEX_TYPE_SERIES_INTERNAL = 6;
+    }
+    // type is the IndexType of this IndexObject.
+    IndexType type = 3;
+}
+
+// IndexRule defines how to generate indices based on IndexObject
+// IndexRule should bind to an Series through an IndexRuleBinding to generate proper indices.
+// Example: A trace entity wants to index fields: trace_id, service_name, endpoint_name, and latency.
+//          and service_name and endpoint_name would combine a multi-field index.
+// The index rule could be:
+// IndexRule {
+//     metadata: {
+//         name: sw_trace
+//         group: production
+//     }
+//     objects: [
+//        {
+//            fields: [trace_id]
+//            type: ID
+//        },
+//        {
+//            fields: [service_name, endpoint_name]
+//            type: Text
+//        },
+//        {
+//            fields: [latency]
+//            type: Numerical
+//        },
+//    ]
+//    updated_at_nanoseconds: .......
+// }
+message IndexRule {
+    // metadata define the rule's identity
+    common.v1.Metadata metadata = 1;
+    // objects refer to which fields should be indexed
+    repeated IndexObject objects = 2;
+    // updated_at_nanoseconds indicates when the IndexRule is updated
+    google.protobuf.Timestamp updated_at = 6;
+}
+
+// Series defines which subject(series) would generate indices
+// For example, if a TraceSeries's metadata is {name: sw_trace, group: production},
+//                in consequence, the Series is
+//                series {
+//                    catalog: Trace
+//                    series: {name: sw_trace, group: production}
+//                }
+message Series {
+    // Catalog refers to a placement contains objects belonged to a particular data type
+    enum Catalog {
+        CATALOG_UNSPECIFIED = 0;
+        CATALOG_TRACE = 1;
+        CATALOG_LOG = 2;
+        CATALOG_METRIC = 3;
+    }
+    // catalog is where the subject/series belongs to
+    Catalog catalog = 1;
+    // series refers to a series in a particular catalog
+    common.v1.Metadata series = 2;
+}
+
+// IndexRuleBinding is a bridge to connect an IndexRule to several Series
+// This binding is valid between begin_at_nanoseconds and expire_at_nanoseconds, that provides flexible strategies
+// to control how to generate time series indices.
+message IndexRuleBinding {
+    // metadata is the identity of this binding
+    common.v1.Metadata metadata = 1;
+    // rule_ref refers to the IndexRule
+    common.v1.Metadata rule_ref = 2;
+    // subjects indicate the subjects of binding action
+    repeated Series subjects = 3;
+    // begin_at_nanoseconds is the timestamp, after which the binding will be active
+    google.protobuf.Timestamp begin_at = 4;
+    // expire_at_nanoseconds it the timestamp, after which the binding will be inactive
+    // expire_at_nanoseconds must be larger than begin_at_nanoseconds
+    google.protobuf.Timestamp expire_at = 5;
+    // updated_at_nanoseconds indicates when the IndexRuleBinding is updated
+    google.protobuf.Timestamp updated_at = 6;
+}
diff --git a/api/proto/banyandb/model/v1/query.pb.go b/api/proto/banyandb/model/v1/query.pb.go
new file mode 100644
index 0000000..ef72f62
--- /dev/null
+++ b/api/proto/banyandb/model/v1/query.pb.go
@@ -0,0 +1,807 @@
+// 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.
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.27.1
+// 	protoc        v3.17.3
+// source: banyandb/model/v1/query.proto
+
+package v1
+
+import (
+	reflect "reflect"
+	sync "sync"
+
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// BinaryOp specifies the operation imposed to the given query condition
+// For EQ, NE, LT, GT, LE and GE, only one operand should be given, i.e. one-to-one relationship.
+// HAVING and NOT_HAVING allow multi-value to be the operand such as array/vector, i.e. one-to-many relationship.
+// For example, "keyA" contains "valueA" **and** "valueB"
+type PairQuery_BinaryOp int32
+
+const (
+	PairQuery_BINARY_OP_UNSPECIFIED PairQuery_BinaryOp = 0
+	PairQuery_BINARY_OP_EQ          PairQuery_BinaryOp = 1
+	PairQuery_BINARY_OP_NE          PairQuery_BinaryOp = 2
+	PairQuery_BINARY_OP_LT          PairQuery_BinaryOp = 3
+	PairQuery_BINARY_OP_GT          PairQuery_BinaryOp = 4
+	PairQuery_BINARY_OP_LE          PairQuery_BinaryOp = 5
+	PairQuery_BINARY_OP_GE          PairQuery_BinaryOp = 6
+	PairQuery_BINARY_OP_HAVING      PairQuery_BinaryOp = 7
+	PairQuery_BINARY_OP_NOT_HAVING  PairQuery_BinaryOp = 8
+)
+
+// Enum value maps for PairQuery_BinaryOp.
+var (
+	PairQuery_BinaryOp_name = map[int32]string{
+		0: "BINARY_OP_UNSPECIFIED",
+		1: "BINARY_OP_EQ",
+		2: "BINARY_OP_NE",
+		3: "BINARY_OP_LT",
+		4: "BINARY_OP_GT",
+		5: "BINARY_OP_LE",
+		6: "BINARY_OP_GE",
+		7: "BINARY_OP_HAVING",
+		8: "BINARY_OP_NOT_HAVING",
+	}
+	PairQuery_BinaryOp_value = map[string]int32{
+		"BINARY_OP_UNSPECIFIED": 0,
+		"BINARY_OP_EQ":          1,
+		"BINARY_OP_NE":          2,
+		"BINARY_OP_LT":          3,
+		"BINARY_OP_GT":          4,
+		"BINARY_OP_LE":          5,
+		"BINARY_OP_GE":          6,
+		"BINARY_OP_HAVING":      7,
+		"BINARY_OP_NOT_HAVING":  8,
+	}
+)
+
+func (x PairQuery_BinaryOp) Enum() *PairQuery_BinaryOp {
+	p := new(PairQuery_BinaryOp)
+	*p = x
+	return p
+}
+
+func (x PairQuery_BinaryOp) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (PairQuery_BinaryOp) Descriptor() protoreflect.EnumDescriptor {
+	return file_banyandb_model_v1_query_proto_enumTypes[0].Descriptor()
+}
+
+func (PairQuery_BinaryOp) Type() protoreflect.EnumType {
+	return &file_banyandb_model_v1_query_proto_enumTypes[0]
+}
+
+func (x PairQuery_BinaryOp) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use PairQuery_BinaryOp.Descriptor instead.
+func (PairQuery_BinaryOp) EnumDescriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{3, 0}
+}
+
+type QueryOrder_Sort int32
+
+const (
+	QueryOrder_SORT_UNSPECIFIED QueryOrder_Sort = 0
+	QueryOrder_SORT_DESC        QueryOrder_Sort = 1
+	QueryOrder_SORT_ASC         QueryOrder_Sort = 2
+)
+
+// Enum value maps for QueryOrder_Sort.
+var (
+	QueryOrder_Sort_name = map[int32]string{
+		0: "SORT_UNSPECIFIED",
+		1: "SORT_DESC",
+		2: "SORT_ASC",
+	}
+	QueryOrder_Sort_value = map[string]int32{
+		"SORT_UNSPECIFIED": 0,
+		"SORT_DESC":        1,
+		"SORT_ASC":         2,
+	}
+)
+
+func (x QueryOrder_Sort) Enum() *QueryOrder_Sort {
+	p := new(QueryOrder_Sort)
+	*p = x
+	return p
+}
+
+func (x QueryOrder_Sort) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (QueryOrder_Sort) Descriptor() protoreflect.EnumDescriptor {
+	return file_banyandb_model_v1_query_proto_enumTypes[1].Descriptor()
+}
+
+func (QueryOrder_Sort) Type() protoreflect.EnumType {
+	return &file_banyandb_model_v1_query_proto_enumTypes[1]
+}
+
+func (x QueryOrder_Sort) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use QueryOrder_Sort.Descriptor instead.
+func (QueryOrder_Sort) EnumDescriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{4, 0}
+}
+
+// IntPair in a typed pair with an array of int64 as values
+type IntPair struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Key    string  `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
+	Values []int64 `protobuf:"varint,2,rep,packed,name=values,proto3" json:"values,omitempty"`
+}
+
+func (x *IntPair) Reset() {
+	*x = IntPair{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_model_v1_query_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IntPair) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IntPair) ProtoMessage() {}
+
+func (x *IntPair) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_model_v1_query_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IntPair.ProtoReflect.Descriptor instead.
+func (*IntPair) Descriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *IntPair) GetKey() string {
+	if x != nil {
+		return x.Key
+	}
+	return ""
+}
+
+func (x *IntPair) GetValues() []int64 {
+	if x != nil {
+		return x.Values
+	}
+	return nil
+}
+
+// StrPair in a typed pair with an array of string as values
+type StrPair struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Key    string   `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
+	Values []string `protobuf:"bytes,2,rep,name=values,proto3" json:"values,omitempty"`
+}
+
+func (x *StrPair) Reset() {
+	*x = StrPair{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_model_v1_query_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StrPair) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StrPair) ProtoMessage() {}
+
+func (x *StrPair) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_model_v1_query_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use StrPair.ProtoReflect.Descriptor instead.
+func (*StrPair) Descriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *StrPair) GetKey() string {
+	if x != nil {
+		return x.Key
+	}
+	return ""
+}
+
+func (x *StrPair) GetValues() []string {
+	if x != nil {
+		return x.Values
+	}
+	return nil
+}
+
+// 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 fields/tags are organized in key-value pair in the underlying storage layer.
+// One should notice that the values can be a multi-value.
+type TypedPair struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Types that are assignable to Typed:
+	//	*TypedPair_IntPair
+	//	*TypedPair_StrPair
+	Typed isTypedPair_Typed `protobuf_oneof:"typed"`
+}
+
+func (x *TypedPair) Reset() {
+	*x = TypedPair{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_model_v1_query_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *TypedPair) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TypedPair) ProtoMessage() {}
+
+func (x *TypedPair) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_model_v1_query_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use TypedPair.ProtoReflect.Descriptor instead.
+func (*TypedPair) Descriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{2}
+}
+
+func (m *TypedPair) GetTyped() isTypedPair_Typed {
+	if m != nil {
+		return m.Typed
+	}
+	return nil
+}
+
+func (x *TypedPair) GetIntPair() *IntPair {
+	if x, ok := x.GetTyped().(*TypedPair_IntPair); ok {
+		return x.IntPair
+	}
+	return nil
+}
+
+func (x *TypedPair) GetStrPair() *StrPair {
+	if x, ok := x.GetTyped().(*TypedPair_StrPair); ok {
+		return x.StrPair
+	}
+	return nil
+}
+
+type isTypedPair_Typed interface {
+	isTypedPair_Typed()
+}
+
+type TypedPair_IntPair struct {
+	IntPair *IntPair `protobuf:"bytes,1,opt,name=int_pair,json=intPair,proto3,oneof"`
+}
+
+type TypedPair_StrPair struct {
+	StrPair *StrPair `protobuf:"bytes,2,opt,name=str_pair,json=strPair,proto3,oneof"`
+}
+
+func (*TypedPair_IntPair) isTypedPair_Typed() {}
+
+func (*TypedPair_StrPair) isTypedPair_Typed() {}
+
+// PairQuery consists of the query condition with a single binary operator to be imposed
+// For 1:1 BinaryOp, values in condition must be an array with length = 1,
+// while for 1:N BinaryOp, values can be an array with length >= 1.
+type PairQuery struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Op        PairQuery_BinaryOp `protobuf:"varint,1,opt,name=op,proto3,enum=banyandb.model.v1.PairQuery_BinaryOp" json:"op,omitempty"`
+	Condition *TypedPair         `protobuf:"bytes,2,opt,name=condition,proto3" json:"condition,omitempty"`
+}
+
+func (x *PairQuery) Reset() {
+	*x = PairQuery{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_model_v1_query_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PairQuery) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PairQuery) ProtoMessage() {}
+
+func (x *PairQuery) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_model_v1_query_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PairQuery.ProtoReflect.Descriptor instead.
+func (*PairQuery) Descriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *PairQuery) GetOp() PairQuery_BinaryOp {
+	if x != nil {
+		return x.Op
+	}
+	return PairQuery_BINARY_OP_UNSPECIFIED
+}
+
+func (x *PairQuery) GetCondition() *TypedPair {
+	if x != nil {
+		return x.Condition
+	}
+	return nil
+}
+
+// QueryOrder means a Sort operation to be done for a given field.
+// The key_name refers to the key of a Pair.
+type QueryOrder struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	KeyName string          `protobuf:"bytes,1,opt,name=key_name,json=keyName,proto3" json:"key_name,omitempty"`
+	Sort    QueryOrder_Sort `protobuf:"varint,2,opt,name=sort,proto3,enum=banyandb.model.v1.QueryOrder_Sort" json:"sort,omitempty"`
+}
+
+func (x *QueryOrder) Reset() {
+	*x = QueryOrder{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_model_v1_query_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *QueryOrder) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*QueryOrder) ProtoMessage() {}
+
+func (x *QueryOrder) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_model_v1_query_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use QueryOrder.ProtoReflect.Descriptor instead.
+func (*QueryOrder) Descriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *QueryOrder) GetKeyName() string {
+	if x != nil {
+		return x.KeyName
+	}
+	return ""
+}
+
+func (x *QueryOrder) GetSort() QueryOrder_Sort {
+	if x != nil {
+		return x.Sort
+	}
+	return QueryOrder_SORT_UNSPECIFIED
+}
+
+// Projection is used to select the names of keys to be returned.
+type Projection struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The key_name refers to the key(s) of Pair(s).
+	KeyNames []string `protobuf:"bytes,1,rep,name=key_names,json=keyNames,proto3" json:"key_names,omitempty"`
+}
+
+func (x *Projection) Reset() {
+	*x = Projection{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_model_v1_query_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Projection) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Projection) ProtoMessage() {}
+
+func (x *Projection) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_model_v1_query_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Projection.ProtoReflect.Descriptor instead.
+func (*Projection) Descriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *Projection) GetKeyNames() []string {
+	if x != nil {
+		return x.KeyNames
+	}
+	return nil
+}
+
+// TimeRange is a range query for uint64,
+// the range here follows left-inclusive and right-exclusive rule, i.e. [begin, end) if both edges exist
+type TimeRange struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Begin *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=begin,proto3" json:"begin,omitempty"`
+	End   *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=end,proto3" json:"end,omitempty"`
+}
+
+func (x *TimeRange) Reset() {
+	*x = TimeRange{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_model_v1_query_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *TimeRange) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TimeRange) ProtoMessage() {}
+
+func (x *TimeRange) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_model_v1_query_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use TimeRange.ProtoReflect.Descriptor instead.
+func (*TimeRange) Descriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *TimeRange) GetBegin() *timestamppb.Timestamp {
+	if x != nil {
+		return x.Begin
+	}
+	return nil
+}
+
+func (x *TimeRange) GetEnd() *timestamppb.Timestamp {
+	if x != nil {
+		return x.End
+	}
+	return nil
+}
+
+var File_banyandb_model_v1_query_proto protoreflect.FileDescriptor
+
+var file_banyandb_model_v1_query_proto_rawDesc = []byte{
+	0x0a, 0x1d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c,
+	0x2f, 0x76, 0x31, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
+	0x11, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e,
+	0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x22, 0x33, 0x0a, 0x07, 0x49, 0x6e, 0x74, 0x50, 0x61, 0x69, 0x72, 0x12, 0x10,
+	0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,
+	0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x03,
+	0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x33, 0x0a, 0x07, 0x53, 0x74, 0x72, 0x50,
+	0x61, 0x69, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18,
+	0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x86, 0x01,
+	0x0a, 0x09, 0x54, 0x79, 0x70, 0x65, 0x64, 0x50, 0x61, 0x69, 0x72, 0x12, 0x37, 0x0a, 0x08, 0x69,
+	0x6e, 0x74, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76,
+	0x31, 0x2e, 0x49, 0x6e, 0x74, 0x50, 0x61, 0x69, 0x72, 0x48, 0x00, 0x52, 0x07, 0x69, 0x6e, 0x74,
+	0x50, 0x61, 0x69, 0x72, 0x12, 0x37, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x5f, 0x70, 0x61, 0x69, 0x72,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
+	0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x50, 0x61,
+	0x69, 0x72, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, 0x72, 0x50, 0x61, 0x69, 0x72, 0x42, 0x07, 0x0a,
+	0x05, 0x74, 0x79, 0x70, 0x65, 0x64, 0x22, 0xc2, 0x02, 0x0a, 0x09, 0x50, 0x61, 0x69, 0x72, 0x51,
+	0x75, 0x65, 0x72, 0x79, 0x12, 0x35, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e,
+	0x32, 0x25, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65,
+	0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x42,
+	0x69, 0x6e, 0x61, 0x72, 0x79, 0x4f, 0x70, 0x52, 0x02, 0x6f, 0x70, 0x12, 0x3a, 0x0a, 0x09, 0x63,
+	0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c,
+	0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e,
+	0x76, 0x31, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x50, 0x61, 0x69, 0x72, 0x52, 0x09, 0x63, 0x6f,
+	0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xc1, 0x01, 0x0a, 0x08, 0x42, 0x69, 0x6e, 0x61,
+	0x72, 0x79, 0x4f, 0x70, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x5f, 0x4f,
+	0x50, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,
+	0x10, 0x0a, 0x0c, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x5f, 0x4f, 0x50, 0x5f, 0x45, 0x51, 0x10,
+	0x01, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x5f, 0x4f, 0x50, 0x5f, 0x4e,
+	0x45, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x5f, 0x4f, 0x50,
+	0x5f, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x5f,
+	0x4f, 0x50, 0x5f, 0x47, 0x54, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x49, 0x4e, 0x41, 0x52,
+	0x59, 0x5f, 0x4f, 0x50, 0x5f, 0x4c, 0x45, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x49, 0x4e,
+	0x41, 0x52, 0x59, 0x5f, 0x4f, 0x50, 0x5f, 0x47, 0x45, 0x10, 0x06, 0x12, 0x14, 0x0a, 0x10, 0x42,
+	0x49, 0x4e, 0x41, 0x52, 0x59, 0x5f, 0x4f, 0x50, 0x5f, 0x48, 0x41, 0x56, 0x49, 0x4e, 0x47, 0x10,
+	0x07, 0x12, 0x18, 0x0a, 0x14, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x5f, 0x4f, 0x50, 0x5f, 0x4e,
+	0x4f, 0x54, 0x5f, 0x48, 0x41, 0x56, 0x49, 0x4e, 0x47, 0x10, 0x08, 0x22, 0x9a, 0x01, 0x0a, 0x0a,
+	0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6b, 0x65,
+	0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65,
+	0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d,
+	0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64,
+	0x65, 0x72, 0x2e, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x22, 0x39, 0x0a,
+	0x04, 0x53, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x55, 0x4e,
+	0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53,
+	0x4f, 0x52, 0x54, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x4f,
+	0x52, 0x54, 0x5f, 0x41, 0x53, 0x43, 0x10, 0x02, 0x22, 0x29, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x6a,
+	0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61,
+	0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x4e, 0x61,
+	0x6d, 0x65, 0x73, 0x22, 0x6b, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65,
+	0x12, 0x30, 0x0a, 0x05, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x62, 0x65, 0x67,
+	0x69, 0x6e, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64,
+	0x42, 0x6c, 0x0a, 0x27, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73,
+	0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
+	0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76, 0x31, 0x5a, 0x41, 0x67, 0x69, 0x74,
+	0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x73,
+	0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
+	0x64, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x61, 0x6e,
+	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2f, 0x76, 0x31, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_banyandb_model_v1_query_proto_rawDescOnce sync.Once
+	file_banyandb_model_v1_query_proto_rawDescData = file_banyandb_model_v1_query_proto_rawDesc
+)
+
+func file_banyandb_model_v1_query_proto_rawDescGZIP() []byte {
+	file_banyandb_model_v1_query_proto_rawDescOnce.Do(func() {
+		file_banyandb_model_v1_query_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_model_v1_query_proto_rawDescData)
+	})
+	return file_banyandb_model_v1_query_proto_rawDescData
+}
+
+var file_banyandb_model_v1_query_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
+var file_banyandb_model_v1_query_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
+var file_banyandb_model_v1_query_proto_goTypes = []interface{}{
+	(PairQuery_BinaryOp)(0),       // 0: banyandb.model.v1.PairQuery.BinaryOp
+	(QueryOrder_Sort)(0),          // 1: banyandb.model.v1.QueryOrder.Sort
+	(*IntPair)(nil),               // 2: banyandb.model.v1.IntPair
+	(*StrPair)(nil),               // 3: banyandb.model.v1.StrPair
+	(*TypedPair)(nil),             // 4: banyandb.model.v1.TypedPair
+	(*PairQuery)(nil),             // 5: banyandb.model.v1.PairQuery
+	(*QueryOrder)(nil),            // 6: banyandb.model.v1.QueryOrder
+	(*Projection)(nil),            // 7: banyandb.model.v1.Projection
+	(*TimeRange)(nil),             // 8: banyandb.model.v1.TimeRange
+	(*timestamppb.Timestamp)(nil), // 9: google.protobuf.Timestamp
+}
+var file_banyandb_model_v1_query_proto_depIdxs = []int32{
+	2, // 0: banyandb.model.v1.TypedPair.int_pair:type_name -> banyandb.model.v1.IntPair
+	3, // 1: banyandb.model.v1.TypedPair.str_pair:type_name -> banyandb.model.v1.StrPair
+	0, // 2: banyandb.model.v1.PairQuery.op:type_name -> banyandb.model.v1.PairQuery.BinaryOp
+	4, // 3: banyandb.model.v1.PairQuery.condition:type_name -> banyandb.model.v1.TypedPair
+	1, // 4: banyandb.model.v1.QueryOrder.sort:type_name -> banyandb.model.v1.QueryOrder.Sort
+	9, // 5: banyandb.model.v1.TimeRange.begin:type_name -> google.protobuf.Timestamp
+	9, // 6: banyandb.model.v1.TimeRange.end:type_name -> google.protobuf.Timestamp
+	7, // [7:7] is the sub-list for method output_type
+	7, // [7:7] is the sub-list for method input_type
+	7, // [7:7] is the sub-list for extension type_name
+	7, // [7:7] is the sub-list for extension extendee
+	0, // [0:7] is the sub-list for field type_name
+}
+
+func init() { file_banyandb_model_v1_query_proto_init() }
+func file_banyandb_model_v1_query_proto_init() {
+	if File_banyandb_model_v1_query_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_banyandb_model_v1_query_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IntPair); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_model_v1_query_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StrPair); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_model_v1_query_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TypedPair); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_model_v1_query_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PairQuery); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_model_v1_query_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*QueryOrder); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_model_v1_query_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Projection); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_model_v1_query_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TimeRange); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_banyandb_model_v1_query_proto_msgTypes[2].OneofWrappers = []interface{}{
+		(*TypedPair_IntPair)(nil),
+		(*TypedPair_StrPair)(nil),
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_banyandb_model_v1_query_proto_rawDesc,
+			NumEnums:      2,
+			NumMessages:   7,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_banyandb_model_v1_query_proto_goTypes,
+		DependencyIndexes: file_banyandb_model_v1_query_proto_depIdxs,
+		EnumInfos:         file_banyandb_model_v1_query_proto_enumTypes,
+		MessageInfos:      file_banyandb_model_v1_query_proto_msgTypes,
+	}.Build()
+	File_banyandb_model_v1_query_proto = out.File
+	file_banyandb_model_v1_query_proto_rawDesc = nil
+	file_banyandb_model_v1_query_proto_goTypes = nil
+	file_banyandb_model_v1_query_proto_depIdxs = nil
+}
diff --git a/api/proto/banyandb/model/v1/query.proto b/api/proto/banyandb/model/v1/query.proto
new file mode 100644
index 0000000..3e7f19a
--- /dev/null
+++ b/api/proto/banyandb/model/v1/query.proto
@@ -0,0 +1,97 @@
+// 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.model.v1";
+option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1";
+
+package banyandb.model.v1;
+
+import "google/protobuf/timestamp.proto";
+
+// IntPair in a typed pair with an array of int64 as values
+message IntPair {
+    string key = 1;
+    repeated int64 values = 2;
+}
+
+// StrPair in a typed pair with an array of string as values
+message StrPair {
+    string key = 1;
+    repeated string values = 2;
+}
+
+// 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 fields/tags are organized in key-value pair in the underlying storage layer.
+// One should notice that the values can be a multi-value.
+message TypedPair {
+    oneof typed {
+        IntPair int_pair = 1;
+        StrPair str_pair = 2;
+    }
+}
+
+// PairQuery consists of the query condition with a single binary operator to be imposed
+// For 1:1 BinaryOp, values in condition must be an array with length = 1,
+// while for 1:N BinaryOp, values can be an array with length >= 1.
+message PairQuery {
+    // BinaryOp specifies the operation imposed to the given query condition
+    // For EQ, NE, LT, GT, LE and GE, only one operand should be given, i.e. one-to-one relationship.
+    // HAVING and NOT_HAVING allow multi-value to be the operand such as array/vector, i.e. one-to-many relationship.
+    // For example, "keyA" contains "valueA" **and** "valueB"
+    enum BinaryOp {
+        BINARY_OP_UNSPECIFIED = 0;
+        BINARY_OP_EQ = 1;
+        BINARY_OP_NE = 2;
+        BINARY_OP_LT = 3;
+        BINARY_OP_GT = 4;
+        BINARY_OP_LE = 5;
+        BINARY_OP_GE = 6;
+        BINARY_OP_HAVING = 7;
+        BINARY_OP_NOT_HAVING = 8;
+    }
+    BinaryOp op = 1;
+    TypedPair condition = 2;
+}
+
+// QueryOrder means a Sort operation to be done for a given field.
+// The key_name refers to the key of a Pair.
+message QueryOrder {
+    string key_name = 1;
+    enum Sort {
+        SORT_UNSPECIFIED = 0;
+        SORT_DESC = 1;
+        SORT_ASC = 2;
+    }
+    Sort sort = 2;
+}
+
+
+// Projection is used to select the names of keys to be returned.
+message Projection {
+    // The key_name refers to the key(s) of Pair(s).
+    repeated string key_names = 1;
+}
+
+// TimeRange is a range query for uint64,
+// the range here follows left-inclusive and right-exclusive rule, i.e. [begin, end) if both edges exist
+message TimeRange {
+    google.protobuf.Timestamp begin = 1;
+    google.protobuf.Timestamp end = 2;
+}
diff --git a/api/proto/banyandb/model/v1/write.pb.go b/api/proto/banyandb/model/v1/write.pb.go
new file mode 100644
index 0000000..845d159
--- /dev/null
+++ b/api/proto/banyandb/model/v1/write.pb.go
@@ -0,0 +1,521 @@
+// 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.
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.27.1
+// 	protoc        v3.17.3
+// source: banyandb/model/v1/write.proto
+
+package v1
+
+import (
+	reflect "reflect"
+	sync "sync"
+
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	structpb "google.golang.org/protobuf/types/known/structpb"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type Str struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *Str) Reset() {
+	*x = Str{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_model_v1_write_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Str) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Str) ProtoMessage() {}
+
+func (x *Str) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_model_v1_write_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Str.ProtoReflect.Descriptor instead.
+func (*Str) Descriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_write_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Str) GetValue() string {
+	if x != nil {
+		return x.Value
+	}
+	return ""
+}
+
+type Int struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *Int) Reset() {
+	*x = Int{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_model_v1_write_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Int) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Int) ProtoMessage() {}
+
+func (x *Int) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_model_v1_write_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Int.ProtoReflect.Descriptor instead.
+func (*Int) Descriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_write_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *Int) GetValue() int64 {
+	if x != nil {
+		return x.Value
+	}
+	return 0
+}
+
+type StrArray struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Value []string `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *StrArray) Reset() {
+	*x = StrArray{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_model_v1_write_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StrArray) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StrArray) ProtoMessage() {}
+
+func (x *StrArray) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_model_v1_write_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use StrArray.ProtoReflect.Descriptor instead.
+func (*StrArray) Descriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_write_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *StrArray) GetValue() []string {
+	if x != nil {
+		return x.Value
+	}
+	return nil
+}
+
+type IntArray struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Value []int64 `protobuf:"varint,1,rep,packed,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *IntArray) Reset() {
+	*x = IntArray{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_model_v1_write_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IntArray) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IntArray) ProtoMessage() {}
+
+func (x *IntArray) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_model_v1_write_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IntArray.ProtoReflect.Descriptor instead.
+func (*IntArray) Descriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_write_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *IntArray) GetValue() []int64 {
+	if x != nil {
+		return x.Value
+	}
+	return nil
+}
+
+type Field struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Types that are assignable to ValueType:
+	//	*Field_Null
+	//	*Field_Str
+	//	*Field_StrArray
+	//	*Field_Int
+	//	*Field_IntArray
+	ValueType isField_ValueType `protobuf_oneof:"value_type"`
+}
+
+func (x *Field) Reset() {
+	*x = Field{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_model_v1_write_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Field) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Field) ProtoMessage() {}
+
+func (x *Field) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_model_v1_write_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Field.ProtoReflect.Descriptor instead.
+func (*Field) Descriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_write_proto_rawDescGZIP(), []int{4}
+}
+
+func (m *Field) GetValueType() isField_ValueType {
+	if m != nil {
+		return m.ValueType
+	}
+	return nil
+}
+
+func (x *Field) GetNull() structpb.NullValue {
+	if x, ok := x.GetValueType().(*Field_Null); ok {
+		return x.Null
+	}
+	return structpb.NullValue(0)
+}
+
+func (x *Field) GetStr() *Str {
+	if x, ok := x.GetValueType().(*Field_Str); ok {
+		return x.Str
+	}
+	return nil
+}
+
+func (x *Field) GetStrArray() *StrArray {
+	if x, ok := x.GetValueType().(*Field_StrArray); ok {
+		return x.StrArray
+	}
+	return nil
+}
+
+func (x *Field) GetInt() *Int {
+	if x, ok := x.GetValueType().(*Field_Int); ok {
+		return x.Int
+	}
+	return nil
+}
+
+func (x *Field) GetIntArray() *IntArray {
+	if x, ok := x.GetValueType().(*Field_IntArray); ok {
+		return x.IntArray
+	}
+	return nil
+}
+
+type isField_ValueType interface {
+	isField_ValueType()
+}
+
+type Field_Null struct {
+	Null structpb.NullValue `protobuf:"varint,1,opt,name=null,proto3,enum=google.protobuf.NullValue,oneof"`
+}
+
+type Field_Str struct {
+	Str *Str `protobuf:"bytes,2,opt,name=str,proto3,oneof"`
+}
+
+type Field_StrArray struct {
+	StrArray *StrArray `protobuf:"bytes,3,opt,name=str_array,json=strArray,proto3,oneof"`
+}
+
+type Field_Int struct {
+	Int *Int `protobuf:"bytes,4,opt,name=int,proto3,oneof"`
+}
+
+type Field_IntArray struct {
+	IntArray *IntArray `protobuf:"bytes,5,opt,name=int_array,json=intArray,proto3,oneof"`
+}
+
+func (*Field_Null) isField_ValueType() {}
+
+func (*Field_Str) isField_ValueType() {}
+
+func (*Field_StrArray) isField_ValueType() {}
+
+func (*Field_Int) isField_ValueType() {}
+
+func (*Field_IntArray) isField_ValueType() {}
+
+var File_banyandb_model_v1_write_proto protoreflect.FileDescriptor
+
+var file_banyandb_model_v1_write_proto_rawDesc = []byte{
+	0x0a, 0x1d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c,
+	0x2f, 0x76, 0x31, 0x2f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
+	0x11, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e,
+	0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x22, 0x1b, 0x0a, 0x03, 0x53, 0x74, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x1b, 0x0a,
+	0x03, 0x49, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x20, 0x0a, 0x08, 0x53, 0x74,
+	0x72, 0x41, 0x72, 0x72, 0x61, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
+	0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x20, 0x0a, 0x08,
+	0x49, 0x6e, 0x74, 0x41, 0x72, 0x72, 0x61, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x97,
+	0x02, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c,
+	0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x2a, 0x0a, 0x03, 0x73, 0x74,
+	0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
+	0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x48,
+	0x00, 0x52, 0x03, 0x73, 0x74, 0x72, 0x12, 0x3a, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x5f, 0x61, 0x72,
+	0x72, 0x61, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x61, 0x6e, 0x79,
+	0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74,
+	0x72, 0x41, 0x72, 0x72, 0x61, 0x79, 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x72, 0x41, 0x72, 0x72,
+	0x61, 0x79, 0x12, 0x2a, 0x0a, 0x03, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x16, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c,
+	0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x03, 0x69, 0x6e, 0x74, 0x12, 0x3a,
+	0x0a, 0x09, 0x69, 0x6e, 0x74, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64,
+	0x65, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x74, 0x41, 0x72, 0x72, 0x61, 0x79, 0x48, 0x00,
+	0x52, 0x08, 0x69, 0x6e, 0x74, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x76, 0x61,
+	0x6c, 0x75, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x6c, 0x0a, 0x27, 0x6f, 0x72, 0x67, 0x2e,
+	0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e,
+	0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c,
+	0x2e, 0x76, 0x31, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
+	0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e,
+	0x67, 0x2d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x6d, 0x6f,
+	0x64, 0x65, 0x6c, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_banyandb_model_v1_write_proto_rawDescOnce sync.Once
+	file_banyandb_model_v1_write_proto_rawDescData = file_banyandb_model_v1_write_proto_rawDesc
+)
+
+func file_banyandb_model_v1_write_proto_rawDescGZIP() []byte {
+	file_banyandb_model_v1_write_proto_rawDescOnce.Do(func() {
+		file_banyandb_model_v1_write_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_model_v1_write_proto_rawDescData)
+	})
+	return file_banyandb_model_v1_write_proto_rawDescData
+}
+
+var file_banyandb_model_v1_write_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
+var file_banyandb_model_v1_write_proto_goTypes = []interface{}{
+	(*Str)(nil),             // 0: banyandb.model.v1.Str
+	(*Int)(nil),             // 1: banyandb.model.v1.Int
+	(*StrArray)(nil),        // 2: banyandb.model.v1.StrArray
+	(*IntArray)(nil),        // 3: banyandb.model.v1.IntArray
+	(*Field)(nil),           // 4: banyandb.model.v1.Field
+	(structpb.NullValue)(0), // 5: google.protobuf.NullValue
+}
+var file_banyandb_model_v1_write_proto_depIdxs = []int32{
+	5, // 0: banyandb.model.v1.Field.null:type_name -> google.protobuf.NullValue
+	0, // 1: banyandb.model.v1.Field.str:type_name -> banyandb.model.v1.Str
+	2, // 2: banyandb.model.v1.Field.str_array:type_name -> banyandb.model.v1.StrArray
+	1, // 3: banyandb.model.v1.Field.int:type_name -> banyandb.model.v1.Int
+	3, // 4: banyandb.model.v1.Field.int_array:type_name -> banyandb.model.v1.IntArray
+	5, // [5:5] is the sub-list for method output_type
+	5, // [5:5] is the sub-list for method input_type
+	5, // [5:5] is the sub-list for extension type_name
+	5, // [5:5] is the sub-list for extension extendee
+	0, // [0:5] is the sub-list for field type_name
+}
+
+func init() { file_banyandb_model_v1_write_proto_init() }
+func file_banyandb_model_v1_write_proto_init() {
+	if File_banyandb_model_v1_write_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_banyandb_model_v1_write_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Str); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_model_v1_write_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Int); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_model_v1_write_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StrArray); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_model_v1_write_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IntArray); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_model_v1_write_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Field); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_banyandb_model_v1_write_proto_msgTypes[4].OneofWrappers = []interface{}{
+		(*Field_Null)(nil),
+		(*Field_Str)(nil),
+		(*Field_StrArray)(nil),
+		(*Field_Int)(nil),
+		(*Field_IntArray)(nil),
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_banyandb_model_v1_write_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   5,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_banyandb_model_v1_write_proto_goTypes,
+		DependencyIndexes: file_banyandb_model_v1_write_proto_depIdxs,
+		MessageInfos:      file_banyandb_model_v1_write_proto_msgTypes,
+	}.Build()
+	File_banyandb_model_v1_write_proto = out.File
+	file_banyandb_model_v1_write_proto_rawDesc = nil
+	file_banyandb_model_v1_write_proto_goTypes = nil
+	file_banyandb_model_v1_write_proto_depIdxs = nil
+}
diff --git a/api/proto/banyandb/v1/rpc.proto b/api/proto/banyandb/model/v1/write.proto
similarity index 62%
copy from api/proto/banyandb/v1/rpc.proto
copy to api/proto/banyandb/model/v1/write.proto
index 85fafd8..0e10848 100644
--- a/api/proto/banyandb/v1/rpc.proto
+++ b/api/proto/banyandb/model/v1/write.proto
@@ -17,15 +17,35 @@
 
 syntax = "proto3";
 
-option java_package = "org.apache.skywalking.banyandb";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1;v1";
+option java_package = "org.apache.skywalking.banyandb.model.v1";
+option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1";
 
-package banyandb.v1;
+package banyandb.model.v1;
 
-import "banyandb/v1/query.proto";
-import "banyandb/v1/write.proto";
+import "google/protobuf/struct.proto";
 
-service TraceService {
-  rpc Query(banyandb.v1.QueryRequest) returns (banyandb.v1.QueryResponse);
-  rpc Write(stream banyandb.v1.WriteRequest) returns (stream banyandb.v1.WriteResponse);
-}
\ No newline at end of file
+message Str {
+    string value = 1;
+}
+
+message Int {
+    int64 value = 1;
+}
+
+message StrArray {
+    repeated string value = 1;
+}
+
+message IntArray {
+    repeated int64 value = 1;
+}
+
+message Field {
+    oneof value_type {
+        google.protobuf.NullValue null = 1;
+        Str str = 2;
+        StrArray str_array = 3;
+        Int int = 4;
+        IntArray int_array = 5;
+    }
+}
diff --git a/api/proto/banyandb/trace/v1/query.pb.go b/api/proto/banyandb/trace/v1/query.pb.go
new file mode 100644
index 0000000..2a637e8
--- /dev/null
+++ b/api/proto/banyandb/trace/v1/query.pb.go
@@ -0,0 +1,449 @@
+// 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.
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.27.1
+// 	protoc        v3.17.3
+// source: banyandb/trace/v1/query.proto
+
+package v1
+
+import (
+	reflect "reflect"
+	sync "sync"
+
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
+
+	v11 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// Entity represents
+// (Trace context) a Span defined in Google Dapper paper or equivalently a Segment in Skywalking.
+// (Log context) a log
+type Entity struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// entity_id could be span_id of a Span or segment_id of a Segment in the context of Trace
+	EntityId string `protobuf:"bytes,1,opt,name=entity_id,json=entityId,proto3" json:"entity_id,omitempty"`
+	// timestamp represents
+	// 1) either the start time of a Span/Segment,
+	// 2) or the timestamp of a log
+	Timestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
+	// data_binary contains all un-indexed Tags and other key-value pairs
+	DataBinary []byte `protobuf:"bytes,3,opt,name=data_binary,json=dataBinary,proto3" json:"data_binary,omitempty"`
+	// fields contains all indexed Field. Some typical names,
+	// - trace_id
+	// - duration
+	// - service_name
+	// - service_instance_id
+	// - end_time_nanoseconds
+	Fields []*v1.TypedPair `protobuf:"bytes,4,rep,name=fields,proto3" json:"fields,omitempty"`
+}
+
+func (x *Entity) Reset() {
+	*x = Entity{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_trace_v1_query_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Entity) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Entity) ProtoMessage() {}
+
+func (x *Entity) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_trace_v1_query_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Entity.ProtoReflect.Descriptor instead.
+func (*Entity) Descriptor() ([]byte, []int) {
+	return file_banyandb_trace_v1_query_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Entity) GetEntityId() string {
+	if x != nil {
+		return x.EntityId
+	}
+	return ""
+}
+
+func (x *Entity) GetTimestamp() *timestamppb.Timestamp {
+	if x != nil {
+		return x.Timestamp
+	}
+	return nil
+}
+
+func (x *Entity) GetDataBinary() []byte {
+	if x != nil {
+		return x.DataBinary
+	}
+	return nil
+}
+
+func (x *Entity) GetFields() []*v1.TypedPair {
+	if x != nil {
+		return x.Fields
+	}
+	return nil
+}
+
+// QueryResponse is the response for a query to the Query module.
+type QueryResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// entities are the actual data returned
+	Entities []*Entity `protobuf:"bytes,1,rep,name=entities,proto3" json:"entities,omitempty"`
+}
+
+func (x *QueryResponse) Reset() {
+	*x = QueryResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_trace_v1_query_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *QueryResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*QueryResponse) ProtoMessage() {}
+
+func (x *QueryResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_trace_v1_query_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use QueryResponse.ProtoReflect.Descriptor instead.
+func (*QueryResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_trace_v1_query_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *QueryResponse) GetEntities() []*Entity {
+	if x != nil {
+		return x.Entities
+	}
+	return nil
+}
+
+// QueryRequest is the request contract for query.
+type QueryRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// metadata is required
+	Metadata *v11.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
+	// time_range is a range query with begin/end time of entities in the timeunit of nanoseconds.
+	// In the context of Trace, it represents the range of the `startTime` for spans/segments,
+	// while in the context of Log, it means the range of the timestamp(s) for logs.
+	// it is always recommended to specify time range for performance reason
+	TimeRange *v1.TimeRange `protobuf:"bytes,2,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"`
+	// offset is used to support pagination, together with the following limit
+	Offset uint32 `protobuf:"varint,3,opt,name=offset,proto3" json:"offset,omitempty"`
+	// limit is used to impose a boundary on the number of records being returned
+	Limit uint32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"`
+	// order_by is given to specify the sort for a field. So far, only fields in the type of Integer are supported
+	OrderBy *v1.QueryOrder `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
+	// fields are indexed. Some typical fields are listed below,
+	// - trace_id: if given, it takes precedence over other fields and will be used to retrieve entities before other conditions are imposed
+	// - duration: typical for trace context
+	Fields []*v1.PairQuery `protobuf:"bytes,6,rep,name=fields,proto3" json:"fields,omitempty"`
+	// projection can be used to select the key names of the entities in the response
+	Projection *v1.Projection `protobuf:"bytes,7,opt,name=projection,proto3" json:"projection,omitempty"`
+}
+
+func (x *QueryRequest) Reset() {
+	*x = QueryRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_trace_v1_query_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *QueryRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*QueryRequest) ProtoMessage() {}
+
+func (x *QueryRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_trace_v1_query_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use QueryRequest.ProtoReflect.Descriptor instead.
+func (*QueryRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_trace_v1_query_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *QueryRequest) GetMetadata() *v11.Metadata {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+func (x *QueryRequest) GetTimeRange() *v1.TimeRange {
+	if x != nil {
+		return x.TimeRange
+	}
+	return nil
+}
+
+func (x *QueryRequest) GetOffset() uint32 {
+	if x != nil {
+		return x.Offset
+	}
+	return 0
+}
+
+func (x *QueryRequest) GetLimit() uint32 {
+	if x != nil {
+		return x.Limit
+	}
+	return 0
+}
+
+func (x *QueryRequest) GetOrderBy() *v1.QueryOrder {
+	if x != nil {
+		return x.OrderBy
+	}
+	return nil
+}
+
+func (x *QueryRequest) GetFields() []*v1.PairQuery {
+	if x != nil {
+		return x.Fields
+	}
+	return nil
+}
+
+func (x *QueryRequest) GetProjection() *v1.Projection {
+	if x != nil {
+		return x.Projection
+	}
+	return nil
+}
+
+var File_banyandb_trace_v1_query_proto protoreflect.FileDescriptor
+
+var file_banyandb_trace_v1_query_proto_rawDesc = []byte{
+	0x0a, 0x1d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65,
+	0x2f, 0x76, 0x31, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
+	0x11, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e,
+	0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x63, 0x6f,
+	0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x6d,
+	0x6f, 0x64, 0x65, 0x6c, 0x2f, 0x76, 0x31, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x22, 0xb6, 0x01, 0x0a, 0x06, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1b,
+	0x0a, 0x09, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
+	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
+	0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x62, 0x69,
+	0x6e, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61,
+	0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x34, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73,
+	0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
+	0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64,
+	0x50, 0x61, 0x69, 0x72, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x46, 0x0a, 0x0d,
+	0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a,
+	0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x19, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65,
+	0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69,
+	0x74, 0x69, 0x65, 0x73, 0x22, 0xe2, 0x02, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+	0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
+	0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12,
+	0x3b, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d,
+	0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67,
+	0x65, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06,
+	0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6f, 0x66,
+	0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x6f, 0x72,
+	0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x62,
+	0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76, 0x31,
+	0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x07, 0x6f, 0x72, 0x64,
+	0x65, 0x72, 0x42, 0x79, 0x12, 0x34, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x06,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e,
+	0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x51, 0x75, 0x65,
+	0x72, 0x79, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x72,
+	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d,
+	0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e,
+	0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70,
+	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x0a, 0x27, 0x6f, 0x72, 0x67,
+	0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69,
+	0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x74, 0x72, 0x61, 0x63,
+	0x65, 0x2e, 0x76, 0x31, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
+	0x2f, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69,
+	0x6e, 0x67, 0x2d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x74,
+	0x72, 0x61, 0x63, 0x65, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_banyandb_trace_v1_query_proto_rawDescOnce sync.Once
+	file_banyandb_trace_v1_query_proto_rawDescData = file_banyandb_trace_v1_query_proto_rawDesc
+)
+
+func file_banyandb_trace_v1_query_proto_rawDescGZIP() []byte {
+	file_banyandb_trace_v1_query_proto_rawDescOnce.Do(func() {
+		file_banyandb_trace_v1_query_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_trace_v1_query_proto_rawDescData)
+	})
+	return file_banyandb_trace_v1_query_proto_rawDescData
+}
+
+var file_banyandb_trace_v1_query_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_banyandb_trace_v1_query_proto_goTypes = []interface{}{
+	(*Entity)(nil),                // 0: banyandb.trace.v1.Entity
+	(*QueryResponse)(nil),         // 1: banyandb.trace.v1.QueryResponse
+	(*QueryRequest)(nil),          // 2: banyandb.trace.v1.QueryRequest
+	(*timestamppb.Timestamp)(nil), // 3: google.protobuf.Timestamp
+	(*v1.TypedPair)(nil),          // 4: banyandb.model.v1.TypedPair
+	(*v11.Metadata)(nil),          // 5: banyandb.common.v1.Metadata
+	(*v1.TimeRange)(nil),          // 6: banyandb.model.v1.TimeRange
+	(*v1.QueryOrder)(nil),         // 7: banyandb.model.v1.QueryOrder
+	(*v1.PairQuery)(nil),          // 8: banyandb.model.v1.PairQuery
+	(*v1.Projection)(nil),         // 9: banyandb.model.v1.Projection
+}
+var file_banyandb_trace_v1_query_proto_depIdxs = []int32{
+	3, // 0: banyandb.trace.v1.Entity.timestamp:type_name -> google.protobuf.Timestamp
+	4, // 1: banyandb.trace.v1.Entity.fields:type_name -> banyandb.model.v1.TypedPair
+	0, // 2: banyandb.trace.v1.QueryResponse.entities:type_name -> banyandb.trace.v1.Entity
+	5, // 3: banyandb.trace.v1.QueryRequest.metadata:type_name -> banyandb.common.v1.Metadata
+	6, // 4: banyandb.trace.v1.QueryRequest.time_range:type_name -> banyandb.model.v1.TimeRange
+	7, // 5: banyandb.trace.v1.QueryRequest.order_by:type_name -> banyandb.model.v1.QueryOrder
+	8, // 6: banyandb.trace.v1.QueryRequest.fields:type_name -> banyandb.model.v1.PairQuery
+	9, // 7: banyandb.trace.v1.QueryRequest.projection:type_name -> banyandb.model.v1.Projection
+	8, // [8:8] is the sub-list for method output_type
+	8, // [8:8] is the sub-list for method input_type
+	8, // [8:8] is the sub-list for extension type_name
+	8, // [8:8] is the sub-list for extension extendee
+	0, // [0:8] is the sub-list for field type_name
+}
+
+func init() { file_banyandb_trace_v1_query_proto_init() }
+func file_banyandb_trace_v1_query_proto_init() {
+	if File_banyandb_trace_v1_query_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_banyandb_trace_v1_query_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Entity); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_trace_v1_query_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*QueryResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_trace_v1_query_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*QueryRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_banyandb_trace_v1_query_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   3,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_banyandb_trace_v1_query_proto_goTypes,
+		DependencyIndexes: file_banyandb_trace_v1_query_proto_depIdxs,
+		MessageInfos:      file_banyandb_trace_v1_query_proto_msgTypes,
+	}.Build()
+	File_banyandb_trace_v1_query_proto = out.File
+	file_banyandb_trace_v1_query_proto_rawDesc = nil
+	file_banyandb_trace_v1_query_proto_goTypes = nil
+	file_banyandb_trace_v1_query_proto_depIdxs = nil
+}
diff --git a/api/proto/banyandb/v1/query.proto b/api/proto/banyandb/trace/v1/query.proto
similarity index 53%
rename from api/proto/banyandb/v1/query.proto
rename to api/proto/banyandb/trace/v1/query.proto
index 6a64fb6..2587b8c 100644
--- a/api/proto/banyandb/v1/query.proto
+++ b/api/proto/banyandb/trace/v1/query.proto
@@ -17,71 +17,14 @@
 
 syntax = "proto3";
 
-option java_package = "org.apache.skywalking.banyandb";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1;v1";
+option java_package = "org.apache.skywalking.banyandb.trace.v1";
+option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/trace/v1";
 
-package banyandb.v1;
+package banyandb.trace.v1;
 
 import "google/protobuf/timestamp.proto";
-import "banyandb/v1/database.proto";
-
-// IntPair in a typed pair with an array of int64 as values
-message IntPair {
-  string key = 1;
-  repeated int64 values = 2;
-}
-
-// StrPair in a typed pair with an array of string as values
-message StrPair {
-  string key = 1;
-  repeated string values = 2;
-}
-
-// 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 fields/tags are organized in key-value pair in the underlying storage layer.
-// One should notice that the values can be a multi-value.
-message TypedPair {
-  oneof typed {
-    IntPair int_pair = 1;
-    StrPair str_pair = 2;
-  }
-}
-
-// PairQuery consists of the query condition with a single binary operator to be imposed
-// For 1:1 BinaryOp, values in condition must be an array with length = 1,
-// while for 1:N BinaryOp, values can be an array with length >= 1.
-message PairQuery {
-  // BinaryOp specifies the operation imposed to the given query condition
-  // For EQ, NE, LT, GT, LE and GE, only one operand should be given, i.e. one-to-one relationship.
-  // HAVING and NOT_HAVING allow multi-value to be the operand such as array/vector, i.e. one-to-many relationship.
-  // For example, "keyA" contains "valueA" **and** "valueB"
-  enum BinaryOp {
-    BINARY_OP_UNSPECIFIED = 0;
-    BINARY_OP_EQ = 1;
-    BINARY_OP_NE = 2;
-    BINARY_OP_LT = 3;
-    BINARY_OP_GT = 4;
-    BINARY_OP_LE = 5;
-    BINARY_OP_GE = 6;
-    BINARY_OP_HAVING = 7;
-    BINARY_OP_NOT_HAVING = 8;
-  }
-  BinaryOp op = 1;
-  TypedPair condition = 2;
-}
-
-// QueryOrder means a Sort operation to be done for a given field.
-// The key_name refers to the key of a Pair.
-message QueryOrder {
-  string key_name = 1;
-  enum Sort {
-    SORT_UNSPECIFIED = 0;
-    SORT_DESC = 1;
-    SORT_ASC = 2;
-  }
-  Sort sort = 2;
-}
+import "banyandb/common/v1/common.proto";
+import "banyandb/model/v1/query.proto";
 
 // Entity represents
 // (Trace context) a Span defined in Google Dapper paper or equivalently a Segment in Skywalking.
@@ -101,7 +44,7 @@ message Entity {
   // - service_name
   // - service_instance_id
   // - end_time_nanoseconds
-  repeated TypedPair fields = 4;
+  repeated model.v1.TypedPair fields = 4;
 }
 
 // QueryResponse is the response for a query to the Query module.
@@ -110,38 +53,25 @@ message QueryResponse {
   repeated Entity entities = 1;
 }
 
-// Projection is used to select the names of keys to be returned.
-message Projection {
-  // The key_name refers to the key(s) of Pair(s).
-  repeated string key_names = 1;
-}
-
-// TimeRange is a range query for uint64,
-// the range here follows left-inclusive and right-exclusive rule, i.e. [begin, end) if both edges exist
-message TimeRange {
-  google.protobuf.Timestamp begin = 1;
-  google.protobuf.Timestamp end = 2;
-}
-
 // QueryRequest is the request contract for query.
 message QueryRequest {
   // metadata is required
-  Metadata metadata = 1;
+  common.v1.Metadata metadata = 1;
   // time_range is a range query with begin/end time of entities in the timeunit of nanoseconds.
   // In the context of Trace, it represents the range of the `startTime` for spans/segments,
   // while in the context of Log, it means the range of the timestamp(s) for logs.
   // it is always recommended to specify time range for performance reason
-  TimeRange time_range = 2;
+  model.v1.TimeRange time_range = 2;
   // offset is used to support pagination, together with the following limit
   uint32 offset = 3;
   // limit is used to impose a boundary on the number of records being returned
   uint32 limit = 4;
   // order_by is given to specify the sort for a field. So far, only fields in the type of Integer are supported
-  QueryOrder order_by = 5;
+  model.v1.QueryOrder order_by = 5;
   // fields are indexed. Some typical fields are listed below,
   // - trace_id: if given, it takes precedence over other fields and will be used to retrieve entities before other conditions are imposed
   // - duration: typical for trace context
-  repeated PairQuery fields = 6;
+  repeated model.v1.PairQuery fields = 6;
   // projection can be used to select the key names of the entities in the response
-  Projection projection = 7;
+  model.v1.Projection projection = 7;
 }
diff --git a/api/proto/banyandb/trace/v1/rpc.pb.go b/api/proto/banyandb/trace/v1/rpc.pb.go
new file mode 100644
index 0000000..c188019
--- /dev/null
+++ b/api/proto/banyandb/trace/v1/rpc.pb.go
@@ -0,0 +1,113 @@
+// 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.
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.27.1
+// 	protoc        v3.17.3
+// source: banyandb/trace/v1/rpc.proto
+
+package v1
+
+import (
+	reflect "reflect"
+
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+var File_banyandb_trace_v1_rpc_proto protoreflect.FileDescriptor
+
+var file_banyandb_trace_v1_rpc_proto_rawDesc = []byte{
+	0x0a, 0x1b, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65,
+	0x2f, 0x76, 0x31, 0x2f, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x62,
+	0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31,
+	0x1a, 0x1d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65,
+	0x2f, 0x76, 0x31, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
+	0x1d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2f,
+	0x76, 0x31, 0x2f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0xaa,
+	0x01, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,
+	0x4a, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
+	0x6e, 0x64, 0x62, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65,
+	0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, 0x61, 0x6e, 0x79,
+	0x61, 0x6e, 0x64, 0x62, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75,
+	0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x05, 0x57,
+	0x72, 0x69, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e,
+	0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62,
+	0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x6c, 0x0a, 0x27, 0x6f,
+	0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c,
+	0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x74, 0x72,
+	0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
+	0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c,
+	0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61, 0x70,
+	0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62,
+	0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x33,
+}
+
+var file_banyandb_trace_v1_rpc_proto_goTypes = []interface{}{
+	(*QueryRequest)(nil),  // 0: banyandb.trace.v1.QueryRequest
+	(*WriteRequest)(nil),  // 1: banyandb.trace.v1.WriteRequest
+	(*QueryResponse)(nil), // 2: banyandb.trace.v1.QueryResponse
+	(*WriteResponse)(nil), // 3: banyandb.trace.v1.WriteResponse
+}
+var file_banyandb_trace_v1_rpc_proto_depIdxs = []int32{
+	0, // 0: banyandb.trace.v1.TraceService.Query:input_type -> banyandb.trace.v1.QueryRequest
+	1, // 1: banyandb.trace.v1.TraceService.Write:input_type -> banyandb.trace.v1.WriteRequest
+	2, // 2: banyandb.trace.v1.TraceService.Query:output_type -> banyandb.trace.v1.QueryResponse
+	3, // 3: banyandb.trace.v1.TraceService.Write:output_type -> banyandb.trace.v1.WriteResponse
+	2, // [2:4] is the sub-list for method output_type
+	0, // [0:2] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_banyandb_trace_v1_rpc_proto_init() }
+func file_banyandb_trace_v1_rpc_proto_init() {
+	if File_banyandb_trace_v1_rpc_proto != nil {
+		return
+	}
+	file_banyandb_trace_v1_query_proto_init()
+	file_banyandb_trace_v1_write_proto_init()
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_banyandb_trace_v1_rpc_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   0,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_banyandb_trace_v1_rpc_proto_goTypes,
+		DependencyIndexes: file_banyandb_trace_v1_rpc_proto_depIdxs,
+	}.Build()
+	File_banyandb_trace_v1_rpc_proto = out.File
+	file_banyandb_trace_v1_rpc_proto_rawDesc = nil
+	file_banyandb_trace_v1_rpc_proto_goTypes = nil
+	file_banyandb_trace_v1_rpc_proto_depIdxs = nil
+}
diff --git a/api/proto/banyandb/v1/rpc.proto b/api/proto/banyandb/trace/v1/rpc.proto
similarity index 70%
rename from api/proto/banyandb/v1/rpc.proto
rename to api/proto/banyandb/trace/v1/rpc.proto
index 85fafd8..14d9e85 100644
--- a/api/proto/banyandb/v1/rpc.proto
+++ b/api/proto/banyandb/trace/v1/rpc.proto
@@ -17,15 +17,15 @@
 
 syntax = "proto3";
 
-option java_package = "org.apache.skywalking.banyandb";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1;v1";
+option java_package = "org.apache.skywalking.banyandb.trace.v1";
+option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/trace/v1";
 
-package banyandb.v1;
+package banyandb.trace.v1;
 
-import "banyandb/v1/query.proto";
-import "banyandb/v1/write.proto";
+import "banyandb/trace/v1/query.proto";
+import "banyandb/trace/v1/write.proto";
 
 service TraceService {
-  rpc Query(banyandb.v1.QueryRequest) returns (banyandb.v1.QueryResponse);
-  rpc Write(stream banyandb.v1.WriteRequest) returns (stream banyandb.v1.WriteResponse);
+  rpc Query(banyandb.trace.v1.QueryRequest) returns (banyandb.trace.v1.QueryResponse);
+  rpc Write(stream banyandb.trace.v1.WriteRequest) returns (stream banyandb.trace.v1.WriteResponse);
 }
\ No newline at end of file
diff --git a/api/proto/banyandb/v1/rpc_grpc.pb.go b/api/proto/banyandb/trace/v1/rpc_grpc.pb.go
similarity index 94%
rename from api/proto/banyandb/v1/rpc_grpc.pb.go
rename to api/proto/banyandb/trace/v1/rpc_grpc.pb.go
index 9fb2551..5e3c16b 100644
--- a/api/proto/banyandb/v1/rpc_grpc.pb.go
+++ b/api/proto/banyandb/trace/v1/rpc_grpc.pb.go
@@ -33,7 +33,7 @@ func NewTraceServiceClient(cc grpc.ClientConnInterface) TraceServiceClient {
 
 func (c *traceServiceClient) Query(ctx context.Context, in *QueryRequest, opts ...grpc.CallOption) (*QueryResponse, error) {
 	out := new(QueryResponse)
-	err := c.cc.Invoke(ctx, "/banyandb.v1.TraceService/Query", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/banyandb.trace.v1.TraceService/Query", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -41,7 +41,7 @@ func (c *traceServiceClient) Query(ctx context.Context, in *QueryRequest, opts .
 }
 
 func (c *traceServiceClient) Write(ctx context.Context, opts ...grpc.CallOption) (TraceService_WriteClient, error) {
-	stream, err := c.cc.NewStream(ctx, &TraceService_ServiceDesc.Streams[0], "/banyandb.v1.TraceService/Write", opts...)
+	stream, err := c.cc.NewStream(ctx, &TraceService_ServiceDesc.Streams[0], "/banyandb.trace.v1.TraceService/Write", opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -113,7 +113,7 @@ func _TraceService_Query_Handler(srv interface{}, ctx context.Context, dec func(
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/banyandb.v1.TraceService/Query",
+		FullMethod: "/banyandb.trace.v1.TraceService/Query",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(TraceServiceServer).Query(ctx, req.(*QueryRequest))
@@ -151,7 +151,7 @@ func (x *traceServiceWriteServer) Recv() (*WriteRequest, error) {
 // It's only intended for direct use with grpc.RegisterService,
 // and not to be introspected or modified (even as a copy)
 var TraceService_ServiceDesc = grpc.ServiceDesc{
-	ServiceName: "banyandb.v1.TraceService",
+	ServiceName: "banyandb.trace.v1.TraceService",
 	HandlerType: (*TraceServiceServer)(nil),
 	Methods: []grpc.MethodDesc{
 		{
@@ -167,5 +167,5 @@ var TraceService_ServiceDesc = grpc.ServiceDesc{
 			ClientStreams: true,
 		},
 	},
-	Metadata: "banyandb/v1/rpc.proto",
+	Metadata: "banyandb/trace/v1/rpc.proto",
 }
diff --git a/api/proto/banyandb/trace/v1/write.pb.go b/api/proto/banyandb/trace/v1/write.pb.go
new file mode 100644
index 0000000..cf92680
--- /dev/null
+++ b/api/proto/banyandb/trace/v1/write.pb.go
@@ -0,0 +1,357 @@
+// 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.
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.27.1
+// 	protoc        v3.17.3
+// source: banyandb/trace/v1/write.proto
+
+package v1
+
+import (
+	reflect "reflect"
+	sync "sync"
+
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
+
+	v11 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type EntityValue struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// entity_id could be span_id of a Span or segment_id of a Segment in the context of Trace
+	EntityId string `protobuf:"bytes,1,opt,name=entity_id,json=entityId,proto3" json:"entity_id,omitempty"`
+	// timestamp_nanoseconds is in the timeunit of nanoseconds. It represents
+	// 1) either the start time of a Span/Segment,
+	// 2) or the timestamp of a log
+	Timestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
+	// binary representation of segments, including tags, spans...
+	DataBinary []byte `protobuf:"bytes,3,opt,name=data_binary,json=dataBinary,proto3" json:"data_binary,omitempty"`
+	// support all of indexed fields in the fields.
+	// Field only has value, as the value of value_type match with the key
+	// by the index rules and index rule bindings of Metadata group.
+	// indexed fields of multiple entities are compression in the fields.
+	Fields []*v1.Field `protobuf:"bytes,4,rep,name=fields,proto3" json:"fields,omitempty"`
+}
+
+func (x *EntityValue) Reset() {
+	*x = EntityValue{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_trace_v1_write_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EntityValue) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EntityValue) ProtoMessage() {}
+
+func (x *EntityValue) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_trace_v1_write_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use EntityValue.ProtoReflect.Descriptor instead.
+func (*EntityValue) Descriptor() ([]byte, []int) {
+	return file_banyandb_trace_v1_write_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *EntityValue) GetEntityId() string {
+	if x != nil {
+		return x.EntityId
+	}
+	return ""
+}
+
+func (x *EntityValue) GetTimestamp() *timestamppb.Timestamp {
+	if x != nil {
+		return x.Timestamp
+	}
+	return nil
+}
+
+func (x *EntityValue) GetDataBinary() []byte {
+	if x != nil {
+		return x.DataBinary
+	}
+	return nil
+}
+
+func (x *EntityValue) GetFields() []*v1.Field {
+	if x != nil {
+		return x.Fields
+	}
+	return nil
+}
+
+type WriteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the metadata is only required in the first write.
+	Metadata *v11.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
+	// the entity is required.
+	Entity *EntityValue `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"`
+}
+
+func (x *WriteRequest) Reset() {
+	*x = WriteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_trace_v1_write_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *WriteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*WriteRequest) ProtoMessage() {}
+
+func (x *WriteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_trace_v1_write_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use WriteRequest.ProtoReflect.Descriptor instead.
+func (*WriteRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_trace_v1_write_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *WriteRequest) GetMetadata() *v11.Metadata {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+func (x *WriteRequest) GetEntity() *EntityValue {
+	if x != nil {
+		return x.Entity
+	}
+	return nil
+}
+
+type WriteResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *WriteResponse) Reset() {
+	*x = WriteResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_trace_v1_write_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *WriteResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*WriteResponse) ProtoMessage() {}
+
+func (x *WriteResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_trace_v1_write_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use WriteResponse.ProtoReflect.Descriptor instead.
+func (*WriteResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_trace_v1_write_proto_rawDescGZIP(), []int{2}
+}
+
+var File_banyandb_trace_v1_write_proto protoreflect.FileDescriptor
+
+var file_banyandb_trace_v1_write_proto_rawDesc = []byte{
+	0x0a, 0x1d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65,
+	0x2f, 0x76, 0x31, 0x2f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
+	0x11, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e,
+	0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x63, 0x6f,
+	0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x6d,
+	0x6f, 0x64, 0x65, 0x6c, 0x2f, 0x76, 0x31, 0x2f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x22, 0xb7, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64,
+	0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52,
+	0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61,
+	0x74, 0x61, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52,
+	0x0a, 0x64, 0x61, 0x74, 0x61, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x30, 0x0a, 0x06, 0x66,
+	0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x61,
+	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76, 0x31, 0x2e,
+	0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x80, 0x01,
+	0x0a, 0x0c, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38,
+	0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
+	0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08,
+	0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x36, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69,
+	0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
+	0x6e, 0x64, 0x62, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74,
+	0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+	0x22, 0x0f, 0x0a, 0x0d, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x42, 0x6c, 0x0a, 0x27, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e,
+	0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
+	0x6e, 0x64, 0x62, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x5a, 0x41, 0x67, 0x69,
+	0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2f,
+	0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x61, 0x6e, 0x79, 0x61,
+	0x6e, 0x64, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x61,
+	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2f, 0x76, 0x31, 0x62,
+	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_banyandb_trace_v1_write_proto_rawDescOnce sync.Once
+	file_banyandb_trace_v1_write_proto_rawDescData = file_banyandb_trace_v1_write_proto_rawDesc
+)
+
+func file_banyandb_trace_v1_write_proto_rawDescGZIP() []byte {
+	file_banyandb_trace_v1_write_proto_rawDescOnce.Do(func() {
+		file_banyandb_trace_v1_write_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_trace_v1_write_proto_rawDescData)
+	})
+	return file_banyandb_trace_v1_write_proto_rawDescData
+}
+
+var file_banyandb_trace_v1_write_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_banyandb_trace_v1_write_proto_goTypes = []interface{}{
+	(*EntityValue)(nil),           // 0: banyandb.trace.v1.EntityValue
+	(*WriteRequest)(nil),          // 1: banyandb.trace.v1.WriteRequest
+	(*WriteResponse)(nil),         // 2: banyandb.trace.v1.WriteResponse
+	(*timestamppb.Timestamp)(nil), // 3: google.protobuf.Timestamp
+	(*v1.Field)(nil),              // 4: banyandb.model.v1.Field
+	(*v11.Metadata)(nil),          // 5: banyandb.common.v1.Metadata
+}
+var file_banyandb_trace_v1_write_proto_depIdxs = []int32{
+	3, // 0: banyandb.trace.v1.EntityValue.timestamp:type_name -> google.protobuf.Timestamp
+	4, // 1: banyandb.trace.v1.EntityValue.fields:type_name -> banyandb.model.v1.Field
+	5, // 2: banyandb.trace.v1.WriteRequest.metadata:type_name -> banyandb.common.v1.Metadata
+	0, // 3: banyandb.trace.v1.WriteRequest.entity:type_name -> banyandb.trace.v1.EntityValue
+	4, // [4:4] is the sub-list for method output_type
+	4, // [4:4] is the sub-list for method input_type
+	4, // [4:4] is the sub-list for extension type_name
+	4, // [4:4] is the sub-list for extension extendee
+	0, // [0:4] is the sub-list for field type_name
+}
+
+func init() { file_banyandb_trace_v1_write_proto_init() }
+func file_banyandb_trace_v1_write_proto_init() {
+	if File_banyandb_trace_v1_write_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_banyandb_trace_v1_write_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EntityValue); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_trace_v1_write_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*WriteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_trace_v1_write_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*WriteResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_banyandb_trace_v1_write_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   3,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_banyandb_trace_v1_write_proto_goTypes,
+		DependencyIndexes: file_banyandb_trace_v1_write_proto_depIdxs,
+		MessageInfos:      file_banyandb_trace_v1_write_proto_msgTypes,
+	}.Build()
+	File_banyandb_trace_v1_write_proto = out.File
+	file_banyandb_trace_v1_write_proto_rawDesc = nil
+	file_banyandb_trace_v1_write_proto_goTypes = nil
+	file_banyandb_trace_v1_write_proto_depIdxs = nil
+}
diff --git a/api/proto/banyandb/v1/write.proto b/api/proto/banyandb/trace/v1/write.proto
similarity index 74%
rename from api/proto/banyandb/v1/write.proto
rename to api/proto/banyandb/trace/v1/write.proto
index 02e2d1a..b0ed668 100644
--- a/api/proto/banyandb/v1/write.proto
+++ b/api/proto/banyandb/trace/v1/write.proto
@@ -17,40 +17,14 @@
 
 syntax = "proto3";
 
-option java_package = "org.apache.skywalking.banyandb";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1;v1";
+option java_package = "org.apache.skywalking.banyandb.trace.v1";
+option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/trace/v1";
 
-package banyandb.v1;
+package banyandb.trace.v1;
 
 import "google/protobuf/timestamp.proto";
-import "google/protobuf/struct.proto";
-import "banyandb/v1/database.proto";
-
-message Str {
-  string value = 1;
-}
-
-message Int {
-  int64 value = 1;
-}
-
-message StrArray {
-  repeated string value = 1;
-}
-
-message IntArray {
-  repeated int64 value = 1;
-}
-
-message Field {
-  oneof value_type {
-    google.protobuf.NullValue null = 1;
-    Str str = 2;
-    StrArray str_array = 3;
-    Int int = 4;
-    IntArray int_array = 5;
-  }
-}
+import "banyandb/common/v1/common.proto";
+import "banyandb/model/v1/write.proto";
 
 message EntityValue {
   // entity_id could be span_id of a Span or segment_id of a Segment in the context of Trace
@@ -65,14 +39,14 @@ message EntityValue {
   // Field only has value, as the value of value_type match with the key
   // by the index rules and index rule bindings of Metadata group.
   // indexed fields of multiple entities are compression in the fields.
-  repeated Field fields = 4;
+  repeated model.v1.Field fields = 4;
 }
 
 message WriteRequest {
   // the metadata is only required in the first write.
-  Metadata metadata = 1;
+  common.v1.Metadata metadata = 1;
   // the entity is required.
   EntityValue entity = 2;
 }
 
-message WriteResponse {}
\ No newline at end of file
+message WriteResponse {}
diff --git a/api/proto/banyandb/v1/database.pb.go b/api/proto/banyandb/v1/database.pb.go
deleted file mode 100644
index e20e29c..0000000
--- a/api/proto/banyandb/v1/database.pb.go
+++ /dev/null
@@ -1,644 +0,0 @@
-// 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.
-
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
-// source: banyandb/v1/database.proto
-
-package v1
-
-import (
-	reflect "reflect"
-	sync "sync"
-
-	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
-	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
-)
-
-const (
-	// Verify that this generated code is sufficiently up-to-date.
-	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
-	// Verify that runtime/protoimpl is sufficiently up-to-date.
-	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
-)
-
-type Action int32
-
-const (
-	Action_ACTION_UNSPECIFIED Action = 0
-	Action_ACTION_PUT         Action = 1
-	Action_ACTION_DELETE      Action = 2
-)
-
-// Enum value maps for Action.
-var (
-	Action_name = map[int32]string{
-		0: "ACTION_UNSPECIFIED",
-		1: "ACTION_PUT",
-		2: "ACTION_DELETE",
-	}
-	Action_value = map[string]int32{
-		"ACTION_UNSPECIFIED": 0,
-		"ACTION_PUT":         1,
-		"ACTION_DELETE":      2,
-	}
-)
-
-func (x Action) Enum() *Action {
-	p := new(Action)
-	*p = x
-	return p
-}
-
-func (x Action) String() string {
-	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
-}
-
-func (Action) Descriptor() protoreflect.EnumDescriptor {
-	return file_banyandb_v1_database_proto_enumTypes[0].Descriptor()
-}
-
-func (Action) Type() protoreflect.EnumType {
-	return &file_banyandb_v1_database_proto_enumTypes[0]
-}
-
-func (x Action) Number() protoreflect.EnumNumber {
-	return protoreflect.EnumNumber(x)
-}
-
-// Deprecated: Use Action.Descriptor instead.
-func (Action) EnumDescriptor() ([]byte, []int) {
-	return file_banyandb_v1_database_proto_rawDescGZIP(), []int{0}
-}
-
-type Node struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Id        string                 `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
-	Addr      string                 `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"`
-	UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`
-	CreatedAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
-}
-
-func (x *Node) Reset() {
-	*x = Node{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_database_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *Node) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*Node) ProtoMessage() {}
-
-func (x *Node) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_database_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use Node.ProtoReflect.Descriptor instead.
-func (*Node) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_database_proto_rawDescGZIP(), []int{0}
-}
-
-func (x *Node) GetId() string {
-	if x != nil {
-		return x.Id
-	}
-	return ""
-}
-
-func (x *Node) GetAddr() string {
-	if x != nil {
-		return x.Addr
-	}
-	return ""
-}
-
-func (x *Node) GetUpdatedAt() *timestamppb.Timestamp {
-	if x != nil {
-		return x.UpdatedAt
-	}
-	return nil
-}
-
-func (x *Node) GetCreatedAt() *timestamppb.Timestamp {
-	if x != nil {
-		return x.CreatedAt
-	}
-	return nil
-}
-
-type Shard struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Id        uint64                 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
-	Series    *Metadata              `protobuf:"bytes,2,opt,name=series,proto3" json:"series,omitempty"`
-	Node      *Node                  `protobuf:"bytes,3,opt,name=node,proto3" json:"node,omitempty"`
-	Total     uint32                 `protobuf:"varint,4,opt,name=total,proto3" json:"total,omitempty"`
-	UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`
-	CreatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
-}
-
-func (x *Shard) Reset() {
-	*x = Shard{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_database_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *Shard) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*Shard) ProtoMessage() {}
-
-func (x *Shard) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_database_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use Shard.ProtoReflect.Descriptor instead.
-func (*Shard) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_database_proto_rawDescGZIP(), []int{1}
-}
-
-func (x *Shard) GetId() uint64 {
-	if x != nil {
-		return x.Id
-	}
-	return 0
-}
-
-func (x *Shard) GetSeries() *Metadata {
-	if x != nil {
-		return x.Series
-	}
-	return nil
-}
-
-func (x *Shard) GetNode() *Node {
-	if x != nil {
-		return x.Node
-	}
-	return nil
-}
-
-func (x *Shard) GetTotal() uint32 {
-	if x != nil {
-		return x.Total
-	}
-	return 0
-}
-
-func (x *Shard) GetUpdatedAt() *timestamppb.Timestamp {
-	if x != nil {
-		return x.UpdatedAt
-	}
-	return nil
-}
-
-func (x *Shard) GetCreatedAt() *timestamppb.Timestamp {
-	if x != nil {
-		return x.CreatedAt
-	}
-	return nil
-}
-
-type ShardEvent struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Shard  *Shard                 `protobuf:"bytes,1,opt,name=shard,proto3" json:"shard,omitempty"`
-	Action Action                 `protobuf:"varint,2,opt,name=action,proto3,enum=banyandb.v1.Action" json:"action,omitempty"`
-	Time   *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=time,proto3" json:"time,omitempty"`
-}
-
-func (x *ShardEvent) Reset() {
-	*x = ShardEvent{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_database_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *ShardEvent) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*ShardEvent) ProtoMessage() {}
-
-func (x *ShardEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_database_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use ShardEvent.ProtoReflect.Descriptor instead.
-func (*ShardEvent) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_database_proto_rawDescGZIP(), []int{2}
-}
-
-func (x *ShardEvent) GetShard() *Shard {
-	if x != nil {
-		return x.Shard
-	}
-	return nil
-}
-
-func (x *ShardEvent) GetAction() Action {
-	if x != nil {
-		return x.Action
-	}
-	return Action_ACTION_UNSPECIFIED
-}
-
-func (x *ShardEvent) GetTime() *timestamppb.Timestamp {
-	if x != nil {
-		return x.Time
-	}
-	return nil
-}
-
-type SeriesEvent struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Series                      *Metadata              `protobuf:"bytes,1,opt,name=series,proto3" json:"series,omitempty"`
-	FieldNamesCompositeSeriesId []string               `protobuf:"bytes,2,rep,name=field_names_composite_series_id,json=fieldNamesCompositeSeriesId,proto3" json:"field_names_composite_series_id,omitempty"`
-	Action                      Action                 `protobuf:"varint,3,opt,name=action,proto3,enum=banyandb.v1.Action" json:"action,omitempty"`
-	Time                        *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=time,proto3" json:"time,omitempty"`
-}
-
-func (x *SeriesEvent) Reset() {
-	*x = SeriesEvent{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_database_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *SeriesEvent) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*SeriesEvent) ProtoMessage() {}
-
-func (x *SeriesEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_database_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use SeriesEvent.ProtoReflect.Descriptor instead.
-func (*SeriesEvent) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_database_proto_rawDescGZIP(), []int{3}
-}
-
-func (x *SeriesEvent) GetSeries() *Metadata {
-	if x != nil {
-		return x.Series
-	}
-	return nil
-}
-
-func (x *SeriesEvent) GetFieldNamesCompositeSeriesId() []string {
-	if x != nil {
-		return x.FieldNamesCompositeSeriesId
-	}
-	return nil
-}
-
-func (x *SeriesEvent) GetAction() Action {
-	if x != nil {
-		return x.Action
-	}
-	return Action_ACTION_UNSPECIFIED
-}
-
-func (x *SeriesEvent) GetTime() *timestamppb.Timestamp {
-	if x != nil {
-		return x.Time
-	}
-	return nil
-}
-
-// Metadata is for multi-tenant, multi-model use
-type Metadata struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// group contains a set of options, like retention policy, max
-	Group string `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"`
-	// name of the entity
-	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
-}
-
-func (x *Metadata) Reset() {
-	*x = Metadata{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_database_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *Metadata) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*Metadata) ProtoMessage() {}
-
-func (x *Metadata) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_database_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use Metadata.ProtoReflect.Descriptor instead.
-func (*Metadata) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_database_proto_rawDescGZIP(), []int{4}
-}
-
-func (x *Metadata) GetGroup() string {
-	if x != nil {
-		return x.Group
-	}
-	return ""
-}
-
-func (x *Metadata) GetName() string {
-	if x != nil {
-		return x.Name
-	}
-	return ""
-}
-
-var File_banyandb_v1_database_proto protoreflect.FileDescriptor
-
-var file_banyandb_v1_database_proto_rawDesc = []byte{
-	0x0a, 0x1a, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x61,
-	0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x62, 0x61,
-	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73,
-	0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa0, 0x01, 0x0a, 0x04, 0x4e,
-	0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74,
-	0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
-	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69,
-	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
-	0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74,
-	0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
-	0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xf9, 0x01,
-	0x0a, 0x05, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x69, 0x65,
-	0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
-	0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x06,
-	0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x03,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e,
-	0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a,
-	0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x74, 0x6f,
-	0x74, 0x61, 0x6c, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61,
-	0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74,
-	0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39,
-	0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09,
-	0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x93, 0x01, 0x0a, 0x0a, 0x53, 0x68,
-	0x61, 0x72, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72,
-	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
-	0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61,
-	0x72, 0x64, 0x12, 0x2b, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x0e, 0x32, 0x13, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31,
-	0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12,
-	0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
-	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x22,
-	0xdf, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
-	0x2d, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x15, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65,
-	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x06, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x44,
-	0x0a, 0x1f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x63, 0x6f,
-	0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x69,
-	0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61,
-	0x6d, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x53, 0x65, 0x72, 0x69,
-	0x65, 0x73, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03,
-	0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e,
-	0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f,
-	0x6e, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
-	0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x74, 0x69, 0x6d,
-	0x65, 0x22, 0x34, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a,
-	0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72,
-	0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x43, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f,
-	0x6e, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50,
-	0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x43, 0x54,
-	0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x54, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x43, 0x54,
-	0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x02, 0x42, 0x60, 0x0a, 0x1e,
-	0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x6b, 0x79, 0x77, 0x61,
-	0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x5a, 0x3e,
-	0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63, 0x68,
-	0x65, 0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x61, 0x6e,
-	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
-	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
-}
-
-var (
-	file_banyandb_v1_database_proto_rawDescOnce sync.Once
-	file_banyandb_v1_database_proto_rawDescData = file_banyandb_v1_database_proto_rawDesc
-)
-
-func file_banyandb_v1_database_proto_rawDescGZIP() []byte {
-	file_banyandb_v1_database_proto_rawDescOnce.Do(func() {
-		file_banyandb_v1_database_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_v1_database_proto_rawDescData)
-	})
-	return file_banyandb_v1_database_proto_rawDescData
-}
-
-var file_banyandb_v1_database_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_banyandb_v1_database_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
-var file_banyandb_v1_database_proto_goTypes = []interface{}{
-	(Action)(0),                   // 0: banyandb.v1.Action
-	(*Node)(nil),                  // 1: banyandb.v1.Node
-	(*Shard)(nil),                 // 2: banyandb.v1.Shard
-	(*ShardEvent)(nil),            // 3: banyandb.v1.ShardEvent
-	(*SeriesEvent)(nil),           // 4: banyandb.v1.SeriesEvent
-	(*Metadata)(nil),              // 5: banyandb.v1.Metadata
-	(*timestamppb.Timestamp)(nil), // 6: google.protobuf.Timestamp
-}
-var file_banyandb_v1_database_proto_depIdxs = []int32{
-	6,  // 0: banyandb.v1.Node.updated_at:type_name -> google.protobuf.Timestamp
-	6,  // 1: banyandb.v1.Node.created_at:type_name -> google.protobuf.Timestamp
-	5,  // 2: banyandb.v1.Shard.series:type_name -> banyandb.v1.Metadata
-	1,  // 3: banyandb.v1.Shard.node:type_name -> banyandb.v1.Node
-	6,  // 4: banyandb.v1.Shard.updated_at:type_name -> google.protobuf.Timestamp
-	6,  // 5: banyandb.v1.Shard.created_at:type_name -> google.protobuf.Timestamp
-	2,  // 6: banyandb.v1.ShardEvent.shard:type_name -> banyandb.v1.Shard
-	0,  // 7: banyandb.v1.ShardEvent.action:type_name -> banyandb.v1.Action
-	6,  // 8: banyandb.v1.ShardEvent.time:type_name -> google.protobuf.Timestamp
-	5,  // 9: banyandb.v1.SeriesEvent.series:type_name -> banyandb.v1.Metadata
-	0,  // 10: banyandb.v1.SeriesEvent.action:type_name -> banyandb.v1.Action
-	6,  // 11: banyandb.v1.SeriesEvent.time:type_name -> google.protobuf.Timestamp
-	12, // [12:12] is the sub-list for method output_type
-	12, // [12:12] is the sub-list for method input_type
-	12, // [12:12] is the sub-list for extension type_name
-	12, // [12:12] is the sub-list for extension extendee
-	0,  // [0:12] is the sub-list for field type_name
-}
-
-func init() { file_banyandb_v1_database_proto_init() }
-func file_banyandb_v1_database_proto_init() {
-	if File_banyandb_v1_database_proto != nil {
-		return
-	}
-	if !protoimpl.UnsafeEnabled {
-		file_banyandb_v1_database_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Node); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_database_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Shard); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_database_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ShardEvent); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_database_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SeriesEvent); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_database_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Metadata); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
-	type x struct{}
-	out := protoimpl.TypeBuilder{
-		File: protoimpl.DescBuilder{
-			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
-			RawDescriptor: file_banyandb_v1_database_proto_rawDesc,
-			NumEnums:      1,
-			NumMessages:   5,
-			NumExtensions: 0,
-			NumServices:   0,
-		},
-		GoTypes:           file_banyandb_v1_database_proto_goTypes,
-		DependencyIndexes: file_banyandb_v1_database_proto_depIdxs,
-		EnumInfos:         file_banyandb_v1_database_proto_enumTypes,
-		MessageInfos:      file_banyandb_v1_database_proto_msgTypes,
-	}.Build()
-	File_banyandb_v1_database_proto = out.File
-	file_banyandb_v1_database_proto_rawDesc = nil
-	file_banyandb_v1_database_proto_goTypes = nil
-	file_banyandb_v1_database_proto_depIdxs = nil
-}
diff --git a/api/proto/banyandb/v1/query.pb.go b/api/proto/banyandb/v1/query.pb.go
deleted file mode 100644
index 4fd3288..0000000
--- a/api/proto/banyandb/v1/query.pb.go
+++ /dev/null
@@ -1,1132 +0,0 @@
-// 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.
-
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
-// source: banyandb/v1/query.proto
-
-package v1
-
-import (
-	reflect "reflect"
-	sync "sync"
-
-	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
-	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
-)
-
-const (
-	// Verify that this generated code is sufficiently up-to-date.
-	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
-	// Verify that runtime/protoimpl is sufficiently up-to-date.
-	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
-)
-
-// BinaryOp specifies the operation imposed to the given query condition
-// For EQ, NE, LT, GT, LE and GE, only one operand should be given, i.e. one-to-one relationship.
-// HAVING and NOT_HAVING allow multi-value to be the operand such as array/vector, i.e. one-to-many relationship.
-// For example, "keyA" contains "valueA" **and** "valueB"
-type PairQuery_BinaryOp int32
-
-const (
-	PairQuery_BINARY_OP_UNSPECIFIED PairQuery_BinaryOp = 0
-	PairQuery_BINARY_OP_EQ          PairQuery_BinaryOp = 1
-	PairQuery_BINARY_OP_NE          PairQuery_BinaryOp = 2
-	PairQuery_BINARY_OP_LT          PairQuery_BinaryOp = 3
-	PairQuery_BINARY_OP_GT          PairQuery_BinaryOp = 4
-	PairQuery_BINARY_OP_LE          PairQuery_BinaryOp = 5
-	PairQuery_BINARY_OP_GE          PairQuery_BinaryOp = 6
-	PairQuery_BINARY_OP_HAVING      PairQuery_BinaryOp = 7
-	PairQuery_BINARY_OP_NOT_HAVING  PairQuery_BinaryOp = 8
-)
-
-// Enum value maps for PairQuery_BinaryOp.
-var (
-	PairQuery_BinaryOp_name = map[int32]string{
-		0: "BINARY_OP_UNSPECIFIED",
-		1: "BINARY_OP_EQ",
-		2: "BINARY_OP_NE",
-		3: "BINARY_OP_LT",
-		4: "BINARY_OP_GT",
-		5: "BINARY_OP_LE",
-		6: "BINARY_OP_GE",
-		7: "BINARY_OP_HAVING",
-		8: "BINARY_OP_NOT_HAVING",
-	}
-	PairQuery_BinaryOp_value = map[string]int32{
-		"BINARY_OP_UNSPECIFIED": 0,
-		"BINARY_OP_EQ":          1,
-		"BINARY_OP_NE":          2,
-		"BINARY_OP_LT":          3,
-		"BINARY_OP_GT":          4,
-		"BINARY_OP_LE":          5,
-		"BINARY_OP_GE":          6,
-		"BINARY_OP_HAVING":      7,
-		"BINARY_OP_NOT_HAVING":  8,
-	}
-)
-
-func (x PairQuery_BinaryOp) Enum() *PairQuery_BinaryOp {
-	p := new(PairQuery_BinaryOp)
-	*p = x
-	return p
-}
-
-func (x PairQuery_BinaryOp) String() string {
-	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
-}
-
-func (PairQuery_BinaryOp) Descriptor() protoreflect.EnumDescriptor {
-	return file_banyandb_v1_query_proto_enumTypes[0].Descriptor()
-}
-
-func (PairQuery_BinaryOp) Type() protoreflect.EnumType {
-	return &file_banyandb_v1_query_proto_enumTypes[0]
-}
-
-func (x PairQuery_BinaryOp) Number() protoreflect.EnumNumber {
-	return protoreflect.EnumNumber(x)
-}
-
-// Deprecated: Use PairQuery_BinaryOp.Descriptor instead.
-func (PairQuery_BinaryOp) EnumDescriptor() ([]byte, []int) {
-	return file_banyandb_v1_query_proto_rawDescGZIP(), []int{3, 0}
-}
-
-type QueryOrder_Sort int32
-
-const (
-	QueryOrder_SORT_UNSPECIFIED QueryOrder_Sort = 0
-	QueryOrder_SORT_DESC        QueryOrder_Sort = 1
-	QueryOrder_SORT_ASC         QueryOrder_Sort = 2
-)
-
-// Enum value maps for QueryOrder_Sort.
-var (
-	QueryOrder_Sort_name = map[int32]string{
-		0: "SORT_UNSPECIFIED",
-		1: "SORT_DESC",
-		2: "SORT_ASC",
-	}
-	QueryOrder_Sort_value = map[string]int32{
-		"SORT_UNSPECIFIED": 0,
-		"SORT_DESC":        1,
-		"SORT_ASC":         2,
-	}
-)
-
-func (x QueryOrder_Sort) Enum() *QueryOrder_Sort {
-	p := new(QueryOrder_Sort)
-	*p = x
-	return p
-}
-
-func (x QueryOrder_Sort) String() string {
-	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
-}
-
-func (QueryOrder_Sort) Descriptor() protoreflect.EnumDescriptor {
-	return file_banyandb_v1_query_proto_enumTypes[1].Descriptor()
-}
-
-func (QueryOrder_Sort) Type() protoreflect.EnumType {
-	return &file_banyandb_v1_query_proto_enumTypes[1]
-}
-
-func (x QueryOrder_Sort) Number() protoreflect.EnumNumber {
-	return protoreflect.EnumNumber(x)
-}
-
-// Deprecated: Use QueryOrder_Sort.Descriptor instead.
-func (QueryOrder_Sort) EnumDescriptor() ([]byte, []int) {
-	return file_banyandb_v1_query_proto_rawDescGZIP(), []int{4, 0}
-}
-
-// IntPair in a typed pair with an array of int64 as values
-type IntPair struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Key    string  `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
-	Values []int64 `protobuf:"varint,2,rep,packed,name=values,proto3" json:"values,omitempty"`
-}
-
-func (x *IntPair) Reset() {
-	*x = IntPair{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_query_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *IntPair) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*IntPair) ProtoMessage() {}
-
-func (x *IntPair) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_query_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use IntPair.ProtoReflect.Descriptor instead.
-func (*IntPair) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_query_proto_rawDescGZIP(), []int{0}
-}
-
-func (x *IntPair) GetKey() string {
-	if x != nil {
-		return x.Key
-	}
-	return ""
-}
-
-func (x *IntPair) GetValues() []int64 {
-	if x != nil {
-		return x.Values
-	}
-	return nil
-}
-
-// StrPair in a typed pair with an array of string as values
-type StrPair struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Key    string   `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
-	Values []string `protobuf:"bytes,2,rep,name=values,proto3" json:"values,omitempty"`
-}
-
-func (x *StrPair) Reset() {
-	*x = StrPair{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_query_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *StrPair) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*StrPair) ProtoMessage() {}
-
-func (x *StrPair) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_query_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use StrPair.ProtoReflect.Descriptor instead.
-func (*StrPair) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_query_proto_rawDescGZIP(), []int{1}
-}
-
-func (x *StrPair) GetKey() string {
-	if x != nil {
-		return x.Key
-	}
-	return ""
-}
-
-func (x *StrPair) GetValues() []string {
-	if x != nil {
-		return x.Values
-	}
-	return nil
-}
-
-// 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 fields/tags are organized in key-value pair in the underlying storage layer.
-// One should notice that the values can be a multi-value.
-type TypedPair struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// Types that are assignable to Typed:
-	//	*TypedPair_IntPair
-	//	*TypedPair_StrPair
-	Typed isTypedPair_Typed `protobuf_oneof:"typed"`
-}
-
-func (x *TypedPair) Reset() {
-	*x = TypedPair{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_query_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *TypedPair) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*TypedPair) ProtoMessage() {}
-
-func (x *TypedPair) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_query_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use TypedPair.ProtoReflect.Descriptor instead.
-func (*TypedPair) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_query_proto_rawDescGZIP(), []int{2}
-}
-
-func (m *TypedPair) GetTyped() isTypedPair_Typed {
-	if m != nil {
-		return m.Typed
-	}
-	return nil
-}
-
-func (x *TypedPair) GetIntPair() *IntPair {
-	if x, ok := x.GetTyped().(*TypedPair_IntPair); ok {
-		return x.IntPair
-	}
-	return nil
-}
-
-func (x *TypedPair) GetStrPair() *StrPair {
-	if x, ok := x.GetTyped().(*TypedPair_StrPair); ok {
-		return x.StrPair
-	}
-	return nil
-}
-
-type isTypedPair_Typed interface {
-	isTypedPair_Typed()
-}
-
-type TypedPair_IntPair struct {
-	IntPair *IntPair `protobuf:"bytes,1,opt,name=int_pair,json=intPair,proto3,oneof"`
-}
-
-type TypedPair_StrPair struct {
-	StrPair *StrPair `protobuf:"bytes,2,opt,name=str_pair,json=strPair,proto3,oneof"`
-}
-
-func (*TypedPair_IntPair) isTypedPair_Typed() {}
-
-func (*TypedPair_StrPair) isTypedPair_Typed() {}
-
-// PairQuery consists of the query condition with a single binary operator to be imposed
-// For 1:1 BinaryOp, values in condition must be an array with length = 1,
-// while for 1:N BinaryOp, values can be an array with length >= 1.
-type PairQuery struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Op        PairQuery_BinaryOp `protobuf:"varint,1,opt,name=op,proto3,enum=banyandb.v1.PairQuery_BinaryOp" json:"op,omitempty"`
-	Condition *TypedPair         `protobuf:"bytes,2,opt,name=condition,proto3" json:"condition,omitempty"`
-}
-
-func (x *PairQuery) Reset() {
-	*x = PairQuery{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_query_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *PairQuery) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*PairQuery) ProtoMessage() {}
-
-func (x *PairQuery) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_query_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use PairQuery.ProtoReflect.Descriptor instead.
-func (*PairQuery) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_query_proto_rawDescGZIP(), []int{3}
-}
-
-func (x *PairQuery) GetOp() PairQuery_BinaryOp {
-	if x != nil {
-		return x.Op
-	}
-	return PairQuery_BINARY_OP_UNSPECIFIED
-}
-
-func (x *PairQuery) GetCondition() *TypedPair {
-	if x != nil {
-		return x.Condition
-	}
-	return nil
-}
-
-// QueryOrder means a Sort operation to be done for a given field.
-// The key_name refers to the key of a Pair.
-type QueryOrder struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	KeyName string          `protobuf:"bytes,1,opt,name=key_name,json=keyName,proto3" json:"key_name,omitempty"`
-	Sort    QueryOrder_Sort `protobuf:"varint,2,opt,name=sort,proto3,enum=banyandb.v1.QueryOrder_Sort" json:"sort,omitempty"`
-}
-
-func (x *QueryOrder) Reset() {
-	*x = QueryOrder{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_query_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *QueryOrder) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*QueryOrder) ProtoMessage() {}
-
-func (x *QueryOrder) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_query_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use QueryOrder.ProtoReflect.Descriptor instead.
-func (*QueryOrder) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_query_proto_rawDescGZIP(), []int{4}
-}
-
-func (x *QueryOrder) GetKeyName() string {
-	if x != nil {
-		return x.KeyName
-	}
-	return ""
-}
-
-func (x *QueryOrder) GetSort() QueryOrder_Sort {
-	if x != nil {
-		return x.Sort
-	}
-	return QueryOrder_SORT_UNSPECIFIED
-}
-
-// Entity represents
-// (Trace context) a Span defined in Google Dapper paper or equivalently a Segment in Skywalking.
-// (Log context) a log
-type Entity struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// entity_id could be span_id of a Span or segment_id of a Segment in the context of Trace
-	EntityId string `protobuf:"bytes,1,opt,name=entity_id,json=entityId,proto3" json:"entity_id,omitempty"`
-	// timestamp represents
-	// 1) either the start time of a Span/Segment,
-	// 2) or the timestamp of a log
-	Timestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
-	// data_binary contains all un-indexed Tags and other key-value pairs
-	DataBinary []byte `protobuf:"bytes,3,opt,name=data_binary,json=dataBinary,proto3" json:"data_binary,omitempty"`
-	// fields contains all indexed Field. Some typical names,
-	// - trace_id
-	// - duration
-	// - service_name
-	// - service_instance_id
-	// - end_time_nanoseconds
-	Fields []*TypedPair `protobuf:"bytes,4,rep,name=fields,proto3" json:"fields,omitempty"`
-}
-
-func (x *Entity) Reset() {
-	*x = Entity{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_query_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *Entity) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*Entity) ProtoMessage() {}
-
-func (x *Entity) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_query_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use Entity.ProtoReflect.Descriptor instead.
-func (*Entity) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_query_proto_rawDescGZIP(), []int{5}
-}
-
-func (x *Entity) GetEntityId() string {
-	if x != nil {
-		return x.EntityId
-	}
-	return ""
-}
-
-func (x *Entity) GetTimestamp() *timestamppb.Timestamp {
-	if x != nil {
-		return x.Timestamp
-	}
-	return nil
-}
-
-func (x *Entity) GetDataBinary() []byte {
-	if x != nil {
-		return x.DataBinary
-	}
-	return nil
-}
-
-func (x *Entity) GetFields() []*TypedPair {
-	if x != nil {
-		return x.Fields
-	}
-	return nil
-}
-
-// QueryResponse is the response for a query to the Query module.
-type QueryResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// entities are the actual data returned
-	Entities []*Entity `protobuf:"bytes,1,rep,name=entities,proto3" json:"entities,omitempty"`
-}
-
-func (x *QueryResponse) Reset() {
-	*x = QueryResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_query_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *QueryResponse) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*QueryResponse) ProtoMessage() {}
-
-func (x *QueryResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_query_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use QueryResponse.ProtoReflect.Descriptor instead.
-func (*QueryResponse) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_query_proto_rawDescGZIP(), []int{6}
-}
-
-func (x *QueryResponse) GetEntities() []*Entity {
-	if x != nil {
-		return x.Entities
-	}
-	return nil
-}
-
-// Projection is used to select the names of keys to be returned.
-type Projection struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// The key_name refers to the key(s) of Pair(s).
-	KeyNames []string `protobuf:"bytes,1,rep,name=key_names,json=keyNames,proto3" json:"key_names,omitempty"`
-}
-
-func (x *Projection) Reset() {
-	*x = Projection{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_query_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *Projection) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*Projection) ProtoMessage() {}
-
-func (x *Projection) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_query_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use Projection.ProtoReflect.Descriptor instead.
-func (*Projection) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_query_proto_rawDescGZIP(), []int{7}
-}
-
-func (x *Projection) GetKeyNames() []string {
-	if x != nil {
-		return x.KeyNames
-	}
-	return nil
-}
-
-// TimeRange is a range query for uint64,
-// the range here follows left-inclusive and right-exclusive rule, i.e. [begin, end) if both edges exist
-type TimeRange struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Begin *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=begin,proto3" json:"begin,omitempty"`
-	End   *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=end,proto3" json:"end,omitempty"`
-}
-
-func (x *TimeRange) Reset() {
-	*x = TimeRange{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_query_proto_msgTypes[8]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *TimeRange) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*TimeRange) ProtoMessage() {}
-
-func (x *TimeRange) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_query_proto_msgTypes[8]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use TimeRange.ProtoReflect.Descriptor instead.
-func (*TimeRange) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_query_proto_rawDescGZIP(), []int{8}
-}
-
-func (x *TimeRange) GetBegin() *timestamppb.Timestamp {
-	if x != nil {
-		return x.Begin
-	}
-	return nil
-}
-
-func (x *TimeRange) GetEnd() *timestamppb.Timestamp {
-	if x != nil {
-		return x.End
-	}
-	return nil
-}
-
-// QueryRequest is the request contract for query.
-type QueryRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// metadata is required
-	Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
-	// time_range is a range query with begin/end time of entities in the timeunit of nanoseconds.
-	// In the context of Trace, it represents the range of the `startTime` for spans/segments,
-	// while in the context of Log, it means the range of the timestamp(s) for logs.
-	// it is always recommended to specify time range for performance reason
-	TimeRange *TimeRange `protobuf:"bytes,2,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"`
-	// offset is used to support pagination, together with the following limit
-	Offset uint32 `protobuf:"varint,3,opt,name=offset,proto3" json:"offset,omitempty"`
-	// limit is used to impose a boundary on the number of records being returned
-	Limit uint32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"`
-	// order_by is given to specify the sort for a field. So far, only fields in the type of Integer are supported
-	OrderBy *QueryOrder `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
-	// fields are indexed. Some typical fields are listed below,
-	// - trace_id: if given, it takes precedence over other fields and will be used to retrieve entities before other conditions are imposed
-	// - duration: typical for trace context
-	Fields []*PairQuery `protobuf:"bytes,6,rep,name=fields,proto3" json:"fields,omitempty"`
-	// projection can be used to select the key names of the entities in the response
-	Projection *Projection `protobuf:"bytes,7,opt,name=projection,proto3" json:"projection,omitempty"`
-}
-
-func (x *QueryRequest) Reset() {
-	*x = QueryRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_query_proto_msgTypes[9]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *QueryRequest) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*QueryRequest) ProtoMessage() {}
-
-func (x *QueryRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_query_proto_msgTypes[9]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use QueryRequest.ProtoReflect.Descriptor instead.
-func (*QueryRequest) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_query_proto_rawDescGZIP(), []int{9}
-}
-
-func (x *QueryRequest) GetMetadata() *Metadata {
-	if x != nil {
-		return x.Metadata
-	}
-	return nil
-}
-
-func (x *QueryRequest) GetTimeRange() *TimeRange {
-	if x != nil {
-		return x.TimeRange
-	}
-	return nil
-}
-
-func (x *QueryRequest) GetOffset() uint32 {
-	if x != nil {
-		return x.Offset
-	}
-	return 0
-}
-
-func (x *QueryRequest) GetLimit() uint32 {
-	if x != nil {
-		return x.Limit
-	}
-	return 0
-}
-
-func (x *QueryRequest) GetOrderBy() *QueryOrder {
-	if x != nil {
-		return x.OrderBy
-	}
-	return nil
-}
-
-func (x *QueryRequest) GetFields() []*PairQuery {
-	if x != nil {
-		return x.Fields
-	}
-	return nil
-}
-
-func (x *QueryRequest) GetProjection() *Projection {
-	if x != nil {
-		return x.Projection
-	}
-	return nil
-}
-
-var File_banyandb_v1_query_proto protoreflect.FileDescriptor
-
-var file_banyandb_v1_query_proto_rawDesc = []byte{
-	0x0a, 0x17, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x2f, 0x71, 0x75,
-	0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x62, 0x61, 0x6e, 0x79, 0x61,
-	0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
-	0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
-	0x62, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x22, 0x33, 0x0a, 0x07, 0x49, 0x6e, 0x74, 0x50, 0x61, 0x69, 0x72, 0x12, 0x10,
-	0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,
-	0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x03,
-	0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x33, 0x0a, 0x07, 0x53, 0x74, 0x72, 0x50,
-	0x61, 0x69, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18,
-	0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x7a, 0x0a,
-	0x09, 0x54, 0x79, 0x70, 0x65, 0x64, 0x50, 0x61, 0x69, 0x72, 0x12, 0x31, 0x0a, 0x08, 0x69, 0x6e,
-	0x74, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62,
-	0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x74, 0x50, 0x61,
-	0x69, 0x72, 0x48, 0x00, 0x52, 0x07, 0x69, 0x6e, 0x74, 0x50, 0x61, 0x69, 0x72, 0x12, 0x31, 0x0a,
-	0x08, 0x73, 0x74, 0x72, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x14, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74,
-	0x72, 0x50, 0x61, 0x69, 0x72, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, 0x72, 0x50, 0x61, 0x69, 0x72,
-	0x42, 0x07, 0x0a, 0x05, 0x74, 0x79, 0x70, 0x65, 0x64, 0x22, 0xb6, 0x02, 0x0a, 0x09, 0x50, 0x61,
-	0x69, 0x72, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2f, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76,
-	0x31, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x42, 0x69, 0x6e, 0x61,
-	0x72, 0x79, 0x4f, 0x70, 0x52, 0x02, 0x6f, 0x70, 0x12, 0x34, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64,
-	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x62, 0x61,
-	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x50,
-	0x61, 0x69, 0x72, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xc1,
-	0x01, 0x0a, 0x08, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x4f, 0x70, 0x12, 0x19, 0x0a, 0x15, 0x42,
-	0x49, 0x4e, 0x41, 0x52, 0x59, 0x5f, 0x4f, 0x50, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49,
-	0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59,
-	0x5f, 0x4f, 0x50, 0x5f, 0x45, 0x51, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x49, 0x4e, 0x41,
-	0x52, 0x59, 0x5f, 0x4f, 0x50, 0x5f, 0x4e, 0x45, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x49,
-	0x4e, 0x41, 0x52, 0x59, 0x5f, 0x4f, 0x50, 0x5f, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c,
-	0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x5f, 0x4f, 0x50, 0x5f, 0x47, 0x54, 0x10, 0x04, 0x12, 0x10,
-	0x0a, 0x0c, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x5f, 0x4f, 0x50, 0x5f, 0x4c, 0x45, 0x10, 0x05,
-	0x12, 0x10, 0x0a, 0x0c, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x5f, 0x4f, 0x50, 0x5f, 0x47, 0x45,
-	0x10, 0x06, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x5f, 0x4f, 0x50, 0x5f,
-	0x48, 0x41, 0x56, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x42, 0x49, 0x4e, 0x41,
-	0x52, 0x59, 0x5f, 0x4f, 0x50, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x48, 0x41, 0x56, 0x49, 0x4e, 0x47,
-	0x10, 0x08, 0x22, 0x94, 0x01, 0x0a, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65,
-	0x72, 0x12, 0x19, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x04,
-	0x73, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e,
-	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72,
-	0x64, 0x65, 0x72, 0x2e, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x22, 0x39,
-	0x0a, 0x04, 0x53, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x55,
-	0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09,
-	0x53, 0x4f, 0x52, 0x54, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x53,
-	0x4f, 0x52, 0x54, 0x5f, 0x41, 0x53, 0x43, 0x10, 0x02, 0x22, 0xb0, 0x01, 0x0a, 0x06, 0x45, 0x6e,
-	0x74, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x69,
-	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49,
-	0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
-	0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1f, 0x0a, 0x0b, 0x64,
-	0x61, 0x74, 0x61, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c,
-	0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x2e, 0x0a, 0x06,
-	0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x62,
-	0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64,
-	0x50, 0x61, 0x69, 0x72, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x40, 0x0a, 0x0d,
-	0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a,
-	0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
-	0x13, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e,
-	0x74, 0x69, 0x74, 0x79, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x29,
-	0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09,
-	0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52,
-	0x08, 0x6b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x6b, 0x0a, 0x09, 0x54, 0x69, 0x6d,
-	0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
-	0x70, 0x52, 0x05, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
-	0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0xc3, 0x02, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64,
-	0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x61, 0x6e, 0x79,
-	0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
-	0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x35, 0x0a, 0x0a, 0x74, 0x69,
-	0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16,
-	0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d,
-	0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67,
-	0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,
-	0x0d, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d,
-	0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12,
-	0x32, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x17, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e,
-	0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65,
-	0x72, 0x42, 0x79, 0x12, 0x2e, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x06, 0x20,
-	0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76,
-	0x31, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x06, 0x66, 0x69, 0x65,
-	0x6c, 0x64, 0x73, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f,
-	0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
-	0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
-	0x52, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x60, 0x0a, 0x1e,
-	0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x6b, 0x79, 0x77, 0x61,
-	0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x5a, 0x3e,
-	0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63, 0x68,
-	0x65, 0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x61, 0x6e,
-	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
-	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
-}
-
-var (
-	file_banyandb_v1_query_proto_rawDescOnce sync.Once
-	file_banyandb_v1_query_proto_rawDescData = file_banyandb_v1_query_proto_rawDesc
-)
-
-func file_banyandb_v1_query_proto_rawDescGZIP() []byte {
-	file_banyandb_v1_query_proto_rawDescOnce.Do(func() {
-		file_banyandb_v1_query_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_v1_query_proto_rawDescData)
-	})
-	return file_banyandb_v1_query_proto_rawDescData
-}
-
-var file_banyandb_v1_query_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
-var file_banyandb_v1_query_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
-var file_banyandb_v1_query_proto_goTypes = []interface{}{
-	(PairQuery_BinaryOp)(0),       // 0: banyandb.v1.PairQuery.BinaryOp
-	(QueryOrder_Sort)(0),          // 1: banyandb.v1.QueryOrder.Sort
-	(*IntPair)(nil),               // 2: banyandb.v1.IntPair
-	(*StrPair)(nil),               // 3: banyandb.v1.StrPair
-	(*TypedPair)(nil),             // 4: banyandb.v1.TypedPair
-	(*PairQuery)(nil),             // 5: banyandb.v1.PairQuery
-	(*QueryOrder)(nil),            // 6: banyandb.v1.QueryOrder
-	(*Entity)(nil),                // 7: banyandb.v1.Entity
-	(*QueryResponse)(nil),         // 8: banyandb.v1.QueryResponse
-	(*Projection)(nil),            // 9: banyandb.v1.Projection
-	(*TimeRange)(nil),             // 10: banyandb.v1.TimeRange
-	(*QueryRequest)(nil),          // 11: banyandb.v1.QueryRequest
-	(*timestamppb.Timestamp)(nil), // 12: google.protobuf.Timestamp
-	(*Metadata)(nil),              // 13: banyandb.v1.Metadata
-}
-var file_banyandb_v1_query_proto_depIdxs = []int32{
-	2,  // 0: banyandb.v1.TypedPair.int_pair:type_name -> banyandb.v1.IntPair
-	3,  // 1: banyandb.v1.TypedPair.str_pair:type_name -> banyandb.v1.StrPair
-	0,  // 2: banyandb.v1.PairQuery.op:type_name -> banyandb.v1.PairQuery.BinaryOp
-	4,  // 3: banyandb.v1.PairQuery.condition:type_name -> banyandb.v1.TypedPair
-	1,  // 4: banyandb.v1.QueryOrder.sort:type_name -> banyandb.v1.QueryOrder.Sort
-	12, // 5: banyandb.v1.Entity.timestamp:type_name -> google.protobuf.Timestamp
-	4,  // 6: banyandb.v1.Entity.fields:type_name -> banyandb.v1.TypedPair
-	7,  // 7: banyandb.v1.QueryResponse.entities:type_name -> banyandb.v1.Entity
-	12, // 8: banyandb.v1.TimeRange.begin:type_name -> google.protobuf.Timestamp
-	12, // 9: banyandb.v1.TimeRange.end:type_name -> google.protobuf.Timestamp
-	13, // 10: banyandb.v1.QueryRequest.metadata:type_name -> banyandb.v1.Metadata
-	10, // 11: banyandb.v1.QueryRequest.time_range:type_name -> banyandb.v1.TimeRange
-	6,  // 12: banyandb.v1.QueryRequest.order_by:type_name -> banyandb.v1.QueryOrder
-	5,  // 13: banyandb.v1.QueryRequest.fields:type_name -> banyandb.v1.PairQuery
-	9,  // 14: banyandb.v1.QueryRequest.projection:type_name -> banyandb.v1.Projection
-	15, // [15:15] is the sub-list for method output_type
-	15, // [15:15] is the sub-list for method input_type
-	15, // [15:15] is the sub-list for extension type_name
-	15, // [15:15] is the sub-list for extension extendee
-	0,  // [0:15] is the sub-list for field type_name
-}
-
-func init() { file_banyandb_v1_query_proto_init() }
-func file_banyandb_v1_query_proto_init() {
-	if File_banyandb_v1_query_proto != nil {
-		return
-	}
-	file_banyandb_v1_database_proto_init()
-	if !protoimpl.UnsafeEnabled {
-		file_banyandb_v1_query_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*IntPair); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_query_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*StrPair); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_query_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TypedPair); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_query_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*PairQuery); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_query_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*QueryOrder); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_query_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Entity); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_query_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*QueryResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_query_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Projection); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_query_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TimeRange); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_query_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*QueryRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
-	file_banyandb_v1_query_proto_msgTypes[2].OneofWrappers = []interface{}{
-		(*TypedPair_IntPair)(nil),
-		(*TypedPair_StrPair)(nil),
-	}
-	type x struct{}
-	out := protoimpl.TypeBuilder{
-		File: protoimpl.DescBuilder{
-			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
-			RawDescriptor: file_banyandb_v1_query_proto_rawDesc,
-			NumEnums:      2,
-			NumMessages:   10,
-			NumExtensions: 0,
-			NumServices:   0,
-		},
-		GoTypes:           file_banyandb_v1_query_proto_goTypes,
-		DependencyIndexes: file_banyandb_v1_query_proto_depIdxs,
-		EnumInfos:         file_banyandb_v1_query_proto_enumTypes,
-		MessageInfos:      file_banyandb_v1_query_proto_msgTypes,
-	}.Build()
-	File_banyandb_v1_query_proto = out.File
-	file_banyandb_v1_query_proto_rawDesc = nil
-	file_banyandb_v1_query_proto_goTypes = nil
-	file_banyandb_v1_query_proto_depIdxs = nil
-}
diff --git a/api/proto/banyandb/v1/rpc.pb.go b/api/proto/banyandb/v1/rpc.pb.go
deleted file mode 100644
index 6f7e175..0000000
--- a/api/proto/banyandb/v1/rpc.pb.go
+++ /dev/null
@@ -1,109 +0,0 @@
-// 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.
-
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
-// source: banyandb/v1/rpc.proto
-
-package v1
-
-import (
-	reflect "reflect"
-
-	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
-)
-
-const (
-	// Verify that this generated code is sufficiently up-to-date.
-	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
-	// Verify that runtime/protoimpl is sufficiently up-to-date.
-	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
-)
-
-var File_banyandb_v1_rpc_proto protoreflect.FileDescriptor
-
-var file_banyandb_v1_rpc_proto_rawDesc = []byte{
-	0x0a, 0x15, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x70,
-	0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
-	0x62, 0x2e, 0x76, 0x31, 0x1a, 0x17, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76,
-	0x31, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x62,
-	0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x2f, 0x77, 0x72, 0x69, 0x74, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x92, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x63, 0x65,
-	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3e, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79,
-	0x12, 0x19, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x51,
-	0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x62, 0x61,
-	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x05, 0x57, 0x72, 0x69, 0x74, 0x65,
-	0x12, 0x19, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x57,
-	0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x62, 0x61,
-	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x60, 0x0a, 0x1e, 0x6f,
-	0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c,
-	0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x5a, 0x3e, 0x67,
-	0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65,
-	0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x61, 0x6e, 0x79,
-	0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62,
-	0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x33,
-}
-
-var file_banyandb_v1_rpc_proto_goTypes = []interface{}{
-	(*QueryRequest)(nil),  // 0: banyandb.v1.QueryRequest
-	(*WriteRequest)(nil),  // 1: banyandb.v1.WriteRequest
-	(*QueryResponse)(nil), // 2: banyandb.v1.QueryResponse
-	(*WriteResponse)(nil), // 3: banyandb.v1.WriteResponse
-}
-var file_banyandb_v1_rpc_proto_depIdxs = []int32{
-	0, // 0: banyandb.v1.TraceService.Query:input_type -> banyandb.v1.QueryRequest
-	1, // 1: banyandb.v1.TraceService.Write:input_type -> banyandb.v1.WriteRequest
-	2, // 2: banyandb.v1.TraceService.Query:output_type -> banyandb.v1.QueryResponse
-	3, // 3: banyandb.v1.TraceService.Write:output_type -> banyandb.v1.WriteResponse
-	2, // [2:4] is the sub-list for method output_type
-	0, // [0:2] is the sub-list for method input_type
-	0, // [0:0] is the sub-list for extension type_name
-	0, // [0:0] is the sub-list for extension extendee
-	0, // [0:0] is the sub-list for field type_name
-}
-
-func init() { file_banyandb_v1_rpc_proto_init() }
-func file_banyandb_v1_rpc_proto_init() {
-	if File_banyandb_v1_rpc_proto != nil {
-		return
-	}
-	file_banyandb_v1_query_proto_init()
-	file_banyandb_v1_write_proto_init()
-	type x struct{}
-	out := protoimpl.TypeBuilder{
-		File: protoimpl.DescBuilder{
-			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
-			RawDescriptor: file_banyandb_v1_rpc_proto_rawDesc,
-			NumEnums:      0,
-			NumMessages:   0,
-			NumExtensions: 0,
-			NumServices:   1,
-		},
-		GoTypes:           file_banyandb_v1_rpc_proto_goTypes,
-		DependencyIndexes: file_banyandb_v1_rpc_proto_depIdxs,
-	}.Build()
-	File_banyandb_v1_rpc_proto = out.File
-	file_banyandb_v1_rpc_proto_rawDesc = nil
-	file_banyandb_v1_rpc_proto_goTypes = nil
-	file_banyandb_v1_rpc_proto_depIdxs = nil
-}
diff --git a/api/proto/banyandb/v1/schema.proto b/api/proto/banyandb/v1/schema.proto
deleted file mode 100644
index b262c2f..0000000
--- a/api/proto/banyandb/v1/schema.proto
+++ /dev/null
@@ -1,198 +0,0 @@
-// 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";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1;v1";
-
-package banyandb.v1;
-
-import "google/protobuf/timestamp.proto";
-import "banyandb/v1/database.proto";
-
-message ShardInfo {
-  uint32 number = 1;
-  repeated string routing_fields = 2;
-}
-
-// Duration represents the elapsed time between two instants
-message Duration {
-  uint32 val = 1;
-  enum DurationUnit {
-    DURATION_UNIT_UNSPECIFIED = 0;
-    DURATION_UNIT_HOUR = 1;
-    DURATION_UNIT_DAY = 2;
-    DURATION_UNIT_WEEK = 3;
-    DURATION_UNIT_MONTH = 4;
-  }
-  DurationUnit unit = 2;
-}
-
-message FieldSpec {
-  string name = 1;
-  enum FieldType {
-    FIELD_TYPE_UNSPECIFIED = 0;
-    FIELD_TYPE_STRING = 1;
-    FIELD_TYPE_INT = 2;
-    FIELD_TYPE_STRING_ARRAY = 3;
-    FIELD_TYPE_INT_ARRAY = 4;
-  }
-  FieldType type = 2;
-}
-
-message TraceStateMap {
-  string field = 1;
-  string val_success = 2;
-  string val_error = 3;
-}
-
-// The key in TraceFieldMap are reserved by trace series engine. Their corresponding value is the Fields or
-// the combination of Fields
-message TraceFieldMap {
-  // trace_id the unique identity of a single trace
-  string trace_id = 1;
-  // series_id groups entities into a storage bucket
-  repeated string series_id = 2;
-  // state indicates the trace is "success" or "error"
-  TraceStateMap state = 3;
-}
-
-// TraceSeries represents a trace storage object
-message TraceSeries {
-  // metadata is the identity of a trace series
-  Metadata metadata = 1;
-  // fields defines accepted fields
-  repeated FieldSpec fields = 2;
-  // reserved_fields_map indicates how to index reserved fields to ingested fields
-  TraceFieldMap reserved_fields_map = 3;
-  // shard indicates how trace data distributes
-  ShardInfo shard = 4;
-  // duration determines how long a TraceSeries keeps its data
-  Duration duration = 5;
-  // updated_at_nanoseconds indicates when the TraceSeries is updated
-  google.protobuf.Timestamp updated_at = 6;
-}
-
-// IndexObject defines who should be indexed.
-message IndexObject {
-  // name is the identity of a IndexObject
-  string name = 1;
-  // fields are the combination that refers to an indexed object
-  // If the elements in fields are more than 1, the object will generate a multi-field index
-  // Caveat: All fields in a multi-field index MUST have an identical IndexType
-  repeated string fields = 2;
-  // IndexType determine the index structure under the hood
-  // Fields with SeriesInternal type is reserved by Series module, would not be indexed by Index module.
-  enum IndexType {
-    INDEX_TYPE_UNSPECIFIED = 0;
-    INDEX_TYPE_TEXT = 1;
-    INDEX_TYPE_NUMERICAL = 2;
-    INDEX_TYPE_ID = 3;
-    INDEX_TYPE_MULTI_TEXT = 4;
-    INDEX_TYPE_MULTI_NUMERICAL = 5;
-    INDEX_TYPE_SERIES_INTERNAL = 6;
-  }
-  // type is the IndexType of this IndexObject.
-  IndexType type = 3;
-}
-
-// IndexRule defines how to generate indices based on IndexObject
-// IndexRule should bind to an Series through an IndexRuleBinding to generate proper indices.
-// Example: A trace entity wants to index fields: trace_id, service_name, endpoint_name, and latency.
-//          and service_name and endpoint_name would combine a multi-field index.
-// The index rule could be:
-// IndexRule {
-//     metadata: {
-//         name: sw_trace
-//         group: production
-//     }
-//     objects: [
-//        {
-//            fields: [trace_id]
-//            type: ID
-//        },
-//        {
-//            fields: [service_name, endpoint_name]
-//            type: Text
-//        },
-//        {
-//            fields: [latency]
-//            type: Numerical
-//        },
-//    ]
-//    updated_at_nanoseconds: .......
-// }
-message IndexRule {
-  // metadata define the rule's identity
-  Metadata metadata = 1;
-  // objects refer to which fields should be indexed
-  repeated IndexObject objects = 2;
-  // updated_at_nanoseconds indicates when the IndexRule is updated
-  google.protobuf.Timestamp updated_at = 6;
-}
-
-// Series defines which subject(series) would generate indices
-// For example, if a TraceSeries's metadata is {name: sw_trace, group: production},
-//                in consequence, the Series is
-//                series {
-//                    catalog: Trace
-//                    series: {name: sw_trace, group: production}
-//                }
-message Series {
-  // Catalog refers to a placement contains objects belonged to a particular data type
-  enum Catalog {
-    CATALOG_UNSPECIFIED = 0;
-    CATALOG_TRACE = 1;
-    CATALOG_LOG = 2;
-    CATALOG_METRIC = 3;
-  }
-  // catalog is where the subject/series belongs to
-  Catalog catalog = 1;
-  // series refers to a series in a particular catalog
-  Metadata series = 2;
-}
-
-// IndexRuleBinding is a bridge to connect an IndexRule to several Series
-// This binding is valid between begin_at_nanoseconds and expire_at_nanoseconds, that provides flexible strategies
-// to control how to generate time series indices.
-message IndexRuleBinding {
-  // metadata is the identity of this binding
-  Metadata metadata = 1;
-  // rule_ref refers to the IndexRule
-  Metadata rule_ref = 2;
-  // subjects indicate the subjects of binding action
-  repeated Series subjects = 3;
-  // begin_at_nanoseconds is the timestamp, after which the binding will be active
-  google.protobuf.Timestamp begin_at = 4;
-  // expire_at_nanoseconds it the timestamp, after which the binding will be inactive
-  // expire_at_nanoseconds must be larger than begin_at_nanoseconds
-  google.protobuf.Timestamp expire_at = 5;
-  // updated_at_nanoseconds indicates when the IndexRuleBinding is updated
-  google.protobuf.Timestamp updated_at = 6;
-}
-
-message IndexRuleEvent {
-  Metadata series = 1;
-  message ShardedIndexRule {
-    uint64 shard_id = 1;
-    repeated IndexRule rules  = 2;
-  }
-  repeated ShardedIndexRule rules = 2;
-  Action action = 4;
-  google.protobuf.Timestamp time = 5;
-}
diff --git a/api/proto/banyandb/v1/write.pb.go b/api/proto/banyandb/v1/write.pb.go
deleted file mode 100644
index c2c1026..0000000
--- a/api/proto/banyandb/v1/write.pb.go
+++ /dev/null
@@ -1,764 +0,0 @@
-// 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.
-
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
-// source: banyandb/v1/write.proto
-
-package v1
-
-import (
-	reflect "reflect"
-	sync "sync"
-
-	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
-	structpb "google.golang.org/protobuf/types/known/structpb"
-	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
-)
-
-const (
-	// Verify that this generated code is sufficiently up-to-date.
-	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
-	// Verify that runtime/protoimpl is sufficiently up-to-date.
-	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
-)
-
-type Str struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
-}
-
-func (x *Str) Reset() {
-	*x = Str{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_write_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *Str) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*Str) ProtoMessage() {}
-
-func (x *Str) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_write_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use Str.ProtoReflect.Descriptor instead.
-func (*Str) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_write_proto_rawDescGZIP(), []int{0}
-}
-
-func (x *Str) GetValue() string {
-	if x != nil {
-		return x.Value
-	}
-	return ""
-}
-
-type Int struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
-}
-
-func (x *Int) Reset() {
-	*x = Int{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_write_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *Int) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*Int) ProtoMessage() {}
-
-func (x *Int) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_write_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use Int.ProtoReflect.Descriptor instead.
-func (*Int) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_write_proto_rawDescGZIP(), []int{1}
-}
-
-func (x *Int) GetValue() int64 {
-	if x != nil {
-		return x.Value
-	}
-	return 0
-}
-
-type StrArray struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Value []string `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
-}
-
-func (x *StrArray) Reset() {
-	*x = StrArray{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_write_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *StrArray) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*StrArray) ProtoMessage() {}
-
-func (x *StrArray) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_write_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use StrArray.ProtoReflect.Descriptor instead.
-func (*StrArray) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_write_proto_rawDescGZIP(), []int{2}
-}
-
-func (x *StrArray) GetValue() []string {
-	if x != nil {
-		return x.Value
-	}
-	return nil
-}
-
-type IntArray struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Value []int64 `protobuf:"varint,1,rep,packed,name=value,proto3" json:"value,omitempty"`
-}
-
-func (x *IntArray) Reset() {
-	*x = IntArray{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_write_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *IntArray) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*IntArray) ProtoMessage() {}
-
-func (x *IntArray) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_write_proto_msgTypes[3]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use IntArray.ProtoReflect.Descriptor instead.
-func (*IntArray) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_write_proto_rawDescGZIP(), []int{3}
-}
-
-func (x *IntArray) GetValue() []int64 {
-	if x != nil {
-		return x.Value
-	}
-	return nil
-}
-
-type Field struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// Types that are assignable to ValueType:
-	//	*Field_Null
-	//	*Field_Str
-	//	*Field_StrArray
-	//	*Field_Int
-	//	*Field_IntArray
-	ValueType isField_ValueType `protobuf_oneof:"value_type"`
-}
-
-func (x *Field) Reset() {
-	*x = Field{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_write_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *Field) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*Field) ProtoMessage() {}
-
-func (x *Field) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_write_proto_msgTypes[4]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use Field.ProtoReflect.Descriptor instead.
-func (*Field) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_write_proto_rawDescGZIP(), []int{4}
-}
-
-func (m *Field) GetValueType() isField_ValueType {
-	if m != nil {
-		return m.ValueType
-	}
-	return nil
-}
-
-func (x *Field) GetNull() structpb.NullValue {
-	if x, ok := x.GetValueType().(*Field_Null); ok {
-		return x.Null
-	}
-	return structpb.NullValue(0)
-}
-
-func (x *Field) GetStr() *Str {
-	if x, ok := x.GetValueType().(*Field_Str); ok {
-		return x.Str
-	}
-	return nil
-}
-
-func (x *Field) GetStrArray() *StrArray {
-	if x, ok := x.GetValueType().(*Field_StrArray); ok {
-		return x.StrArray
-	}
-	return nil
-}
-
-func (x *Field) GetInt() *Int {
-	if x, ok := x.GetValueType().(*Field_Int); ok {
-		return x.Int
-	}
-	return nil
-}
-
-func (x *Field) GetIntArray() *IntArray {
-	if x, ok := x.GetValueType().(*Field_IntArray); ok {
-		return x.IntArray
-	}
-	return nil
-}
-
-type isField_ValueType interface {
-	isField_ValueType()
-}
-
-type Field_Null struct {
-	Null structpb.NullValue `protobuf:"varint,1,opt,name=null,proto3,enum=google.protobuf.NullValue,oneof"`
-}
-
-type Field_Str struct {
-	Str *Str `protobuf:"bytes,2,opt,name=str,proto3,oneof"`
-}
-
-type Field_StrArray struct {
-	StrArray *StrArray `protobuf:"bytes,3,opt,name=str_array,json=strArray,proto3,oneof"`
-}
-
-type Field_Int struct {
-	Int *Int `protobuf:"bytes,4,opt,name=int,proto3,oneof"`
-}
-
-type Field_IntArray struct {
-	IntArray *IntArray `protobuf:"bytes,5,opt,name=int_array,json=intArray,proto3,oneof"`
-}
-
-func (*Field_Null) isField_ValueType() {}
-
-func (*Field_Str) isField_ValueType() {}
-
-func (*Field_StrArray) isField_ValueType() {}
-
-func (*Field_Int) isField_ValueType() {}
-
-func (*Field_IntArray) isField_ValueType() {}
-
-type EntityValue struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// entity_id could be span_id of a Span or segment_id of a Segment in the context of Trace
-	EntityId string `protobuf:"bytes,1,opt,name=entity_id,json=entityId,proto3" json:"entity_id,omitempty"`
-	// timestamp_nanoseconds is in the timeunit of nanoseconds. It represents
-	// 1) either the start time of a Span/Segment,
-	// 2) or the timestamp of a log
-	Timestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
-	// binary representation of segments, including tags, spans...
-	DataBinary []byte `protobuf:"bytes,3,opt,name=data_binary,json=dataBinary,proto3" json:"data_binary,omitempty"`
-	// support all of indexed fields in the fields.
-	// Field only has value, as the value of value_type match with the key
-	// by the index rules and index rule bindings of Metadata group.
-	// indexed fields of multiple entities are compression in the fields.
-	Fields []*Field `protobuf:"bytes,4,rep,name=fields,proto3" json:"fields,omitempty"`
-}
-
-func (x *EntityValue) Reset() {
-	*x = EntityValue{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_write_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *EntityValue) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*EntityValue) ProtoMessage() {}
-
-func (x *EntityValue) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_write_proto_msgTypes[5]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use EntityValue.ProtoReflect.Descriptor instead.
-func (*EntityValue) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_write_proto_rawDescGZIP(), []int{5}
-}
-
-func (x *EntityValue) GetEntityId() string {
-	if x != nil {
-		return x.EntityId
-	}
-	return ""
-}
-
-func (x *EntityValue) GetTimestamp() *timestamppb.Timestamp {
-	if x != nil {
-		return x.Timestamp
-	}
-	return nil
-}
-
-func (x *EntityValue) GetDataBinary() []byte {
-	if x != nil {
-		return x.DataBinary
-	}
-	return nil
-}
-
-func (x *EntityValue) GetFields() []*Field {
-	if x != nil {
-		return x.Fields
-	}
-	return nil
-}
-
-type WriteRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// the metadata is only required in the first write.
-	Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
-	// the entity is required.
-	Entity *EntityValue `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"`
-}
-
-func (x *WriteRequest) Reset() {
-	*x = WriteRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_write_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *WriteRequest) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*WriteRequest) ProtoMessage() {}
-
-func (x *WriteRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_write_proto_msgTypes[6]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use WriteRequest.ProtoReflect.Descriptor instead.
-func (*WriteRequest) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_write_proto_rawDescGZIP(), []int{6}
-}
-
-func (x *WriteRequest) GetMetadata() *Metadata {
-	if x != nil {
-		return x.Metadata
-	}
-	return nil
-}
-
-func (x *WriteRequest) GetEntity() *EntityValue {
-	if x != nil {
-		return x.Entity
-	}
-	return nil
-}
-
-type WriteResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-}
-
-func (x *WriteResponse) Reset() {
-	*x = WriteResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_v1_write_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *WriteResponse) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*WriteResponse) ProtoMessage() {}
-
-func (x *WriteResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_v1_write_proto_msgTypes[7]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use WriteResponse.ProtoReflect.Descriptor instead.
-func (*WriteResponse) Descriptor() ([]byte, []int) {
-	return file_banyandb_v1_write_proto_rawDescGZIP(), []int{7}
-}
-
-var File_banyandb_v1_write_proto protoreflect.FileDescriptor
-
-var file_banyandb_v1_write_proto_rawDesc = []byte{
-	0x0a, 0x17, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x2f, 0x77, 0x72,
-	0x69, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x62, 0x61, 0x6e, 0x79, 0x61,
-	0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
-	0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f,
-	0x76, 0x31, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x22, 0x1b, 0x0a, 0x03, 0x53, 0x74, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
-	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x1b,
-	0x0a, 0x03, 0x49, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x20, 0x0a, 0x08, 0x53,
-	0x74, 0x72, 0x41, 0x72, 0x72, 0x61, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
-	0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x20, 0x0a,
-	0x08, 0x49, 0x6e, 0x74, 0x41, 0x72, 0x72, 0x61, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c,
-	0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22,
-	0xff, 0x01, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c,
-	0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61,
-	0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x24, 0x0a, 0x03, 0x73,
-	0x74, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
-	0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x48, 0x00, 0x52, 0x03, 0x73, 0x74,
-	0x72, 0x12, 0x34, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x18, 0x03,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e,
-	0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x41, 0x72, 0x72, 0x61, 0x79, 0x48, 0x00, 0x52, 0x08, 0x73,
-	0x74, 0x72, 0x41, 0x72, 0x72, 0x61, 0x79, 0x12, 0x24, 0x0a, 0x03, 0x69, 0x6e, 0x74, 0x18, 0x04,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e,
-	0x76, 0x31, 0x2e, 0x49, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x03, 0x69, 0x6e, 0x74, 0x12, 0x34, 0x0a,
-	0x09, 0x69, 0x6e, 0x74, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x15, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x49,
-	0x6e, 0x74, 0x41, 0x72, 0x72, 0x61, 0x79, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x41, 0x72,
-	0x72, 0x61, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x74, 0x79, 0x70,
-	0x65, 0x22, 0xb1, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75,
-	0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x38,
-	0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74,
-	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61,
-	0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x64,
-	0x61, 0x74, 0x61, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x06, 0x66, 0x69, 0x65,
-	0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x62, 0x61, 0x6e, 0x79,
-	0x61, 0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66,
-	0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x73, 0x0a, 0x0c, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
-	0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
-	0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08,
-	0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x30, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69,
-	0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
-	0x6e, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c,
-	0x75, 0x65, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x0f, 0x0a, 0x0d, 0x57, 0x72,
-	0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x60, 0x0a, 0x1e, 0x6f,
-	0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c,
-	0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x5a, 0x3e, 0x67,
-	0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65,
-	0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x61, 0x6e, 0x79,
-	0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62,
-	0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x31, 0x62, 0x06, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x33,
-}
-
-var (
-	file_banyandb_v1_write_proto_rawDescOnce sync.Once
-	file_banyandb_v1_write_proto_rawDescData = file_banyandb_v1_write_proto_rawDesc
-)
-
-func file_banyandb_v1_write_proto_rawDescGZIP() []byte {
-	file_banyandb_v1_write_proto_rawDescOnce.Do(func() {
-		file_banyandb_v1_write_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_v1_write_proto_rawDescData)
-	})
-	return file_banyandb_v1_write_proto_rawDescData
-}
-
-var file_banyandb_v1_write_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
-var file_banyandb_v1_write_proto_goTypes = []interface{}{
-	(*Str)(nil),                   // 0: banyandb.v1.Str
-	(*Int)(nil),                   // 1: banyandb.v1.Int
-	(*StrArray)(nil),              // 2: banyandb.v1.StrArray
-	(*IntArray)(nil),              // 3: banyandb.v1.IntArray
-	(*Field)(nil),                 // 4: banyandb.v1.Field
-	(*EntityValue)(nil),           // 5: banyandb.v1.EntityValue
-	(*WriteRequest)(nil),          // 6: banyandb.v1.WriteRequest
-	(*WriteResponse)(nil),         // 7: banyandb.v1.WriteResponse
-	(structpb.NullValue)(0),       // 8: google.protobuf.NullValue
-	(*timestamppb.Timestamp)(nil), // 9: google.protobuf.Timestamp
-	(*Metadata)(nil),              // 10: banyandb.v1.Metadata
-}
-var file_banyandb_v1_write_proto_depIdxs = []int32{
-	8,  // 0: banyandb.v1.Field.null:type_name -> google.protobuf.NullValue
-	0,  // 1: banyandb.v1.Field.str:type_name -> banyandb.v1.Str
-	2,  // 2: banyandb.v1.Field.str_array:type_name -> banyandb.v1.StrArray
-	1,  // 3: banyandb.v1.Field.int:type_name -> banyandb.v1.Int
-	3,  // 4: banyandb.v1.Field.int_array:type_name -> banyandb.v1.IntArray
-	9,  // 5: banyandb.v1.EntityValue.timestamp:type_name -> google.protobuf.Timestamp
-	4,  // 6: banyandb.v1.EntityValue.fields:type_name -> banyandb.v1.Field
-	10, // 7: banyandb.v1.WriteRequest.metadata:type_name -> banyandb.v1.Metadata
-	5,  // 8: banyandb.v1.WriteRequest.entity:type_name -> banyandb.v1.EntityValue
-	9,  // [9:9] is the sub-list for method output_type
-	9,  // [9:9] is the sub-list for method input_type
-	9,  // [9:9] is the sub-list for extension type_name
-	9,  // [9:9] is the sub-list for extension extendee
-	0,  // [0:9] is the sub-list for field type_name
-}
-
-func init() { file_banyandb_v1_write_proto_init() }
-func file_banyandb_v1_write_proto_init() {
-	if File_banyandb_v1_write_proto != nil {
-		return
-	}
-	file_banyandb_v1_database_proto_init()
-	if !protoimpl.UnsafeEnabled {
-		file_banyandb_v1_write_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Str); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_write_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Int); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_write_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*StrArray); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_write_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*IntArray); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_write_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Field); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_write_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*EntityValue); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_write_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*WriteRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_v1_write_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*WriteResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
-	file_banyandb_v1_write_proto_msgTypes[4].OneofWrappers = []interface{}{
-		(*Field_Null)(nil),
-		(*Field_Str)(nil),
-		(*Field_StrArray)(nil),
-		(*Field_Int)(nil),
-		(*Field_IntArray)(nil),
-	}
-	type x struct{}
-	out := protoimpl.TypeBuilder{
-		File: protoimpl.DescBuilder{
-			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
-			RawDescriptor: file_banyandb_v1_write_proto_rawDesc,
-			NumEnums:      0,
-			NumMessages:   8,
-			NumExtensions: 0,
-			NumServices:   0,
-		},
-		GoTypes:           file_banyandb_v1_write_proto_goTypes,
-		DependencyIndexes: file_banyandb_v1_write_proto_depIdxs,
-		MessageInfos:      file_banyandb_v1_write_proto_msgTypes,
-	}.Build()
-	File_banyandb_v1_write_proto = out.File
-	file_banyandb_v1_write_proto_rawDesc = nil
-	file_banyandb_v1_write_proto_goTypes = nil
-	file_banyandb_v1_write_proto_depIdxs = nil
-}
diff --git a/api/schema/index.go b/api/schema/index.go
index b3ef8a3..adaa8ca 100644
--- a/api/schema/index.go
+++ b/api/schema/index.go
@@ -19,7 +19,7 @@ package schema
 
 import (
 	"github.com/apache/skywalking-banyandb/api/common"
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
 )
 
 var IndexRuleKindVersion = common.KindVersion{Version: "v1", Kind: "schema-index-rule"}
diff --git a/api/schema/series.go b/api/schema/series.go
index 6151c28..e75a4cf 100644
--- a/api/schema/series.go
+++ b/api/schema/series.go
@@ -19,7 +19,7 @@ package schema
 
 import (
 	"github.com/apache/skywalking-banyandb/api/common"
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
 )
 
 var SeriesKindVersion = common.KindVersion{Version: "v1", Kind: "schema-series"}
diff --git a/banyand/index/index.go b/banyand/index/index.go
index 98a049a..262c665 100644
--- a/banyand/index/index.go
+++ b/banyand/index/index.go
@@ -26,7 +26,9 @@ import (
 
 	"github.com/apache/skywalking-banyandb/api/common"
 	"github.com/apache/skywalking-banyandb/api/event"
-	apiv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	commonv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+	databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
+	modelv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
 	"github.com/apache/skywalking-banyandb/banyand/discovery"
 	"github.com/apache/skywalking-banyandb/banyand/index/tsdb"
 	"github.com/apache/skywalking-banyandb/pkg/bus"
@@ -43,7 +45,7 @@ var (
 type Condition struct {
 	Key    string
 	Values [][]byte
-	Op     apiv1.PairQuery_BinaryOp
+	Op     modelv1.PairQuery_BinaryOp
 }
 
 type Field struct {
@@ -66,7 +68,7 @@ type Builder interface {
 type ReadyOption func(map[string]*series) bool
 
 func MetaExists(group, name string) ReadyOption {
-	seriesID := &apiv1.Metadata{
+	seriesID := &commonv1.Metadata{
 		Name:  "sw",
 		Group: "default",
 	}
@@ -89,7 +91,7 @@ type series struct {
 }
 
 type shard struct {
-	meta  map[string][]*apiv1.IndexObject
+	meta  map[string][]*databasev1.IndexObject
 	store tsdb.GlobalStore
 }
 
@@ -199,7 +201,7 @@ type indexMeta struct {
 	sync.RWMutex
 }
 
-func (i *indexMeta) get(series *apiv1.Metadata) *series {
+func (i *indexMeta) get(series *commonv1.Metadata) *series {
 	i.RWMutex.RLock()
 	defer i.RWMutex.RUnlock()
 	s, ok := i.meta[compositeSeriesID(series)]
@@ -216,20 +218,20 @@ type indexRuleListener struct {
 }
 
 func (i *indexRuleListener) Rev(message bus.Message) (resp bus.Message) {
-	indexRuleEvent, ok := message.Data().(*apiv1.IndexRuleEvent)
+	indexRuleEvent, ok := message.Data().(*databasev1.IndexRuleEvent)
 	if !ok {
 		i.log.Warn().Msg("invalid event data type")
 		return
 	}
 	i.log.Info().
-		Str("action", apiv1.Action_name[int32(indexRuleEvent.Action)]).
+		Str("action", databasev1.Action_name[int32(indexRuleEvent.Action)]).
 		Str("series-name", indexRuleEvent.Series.Name).
 		Str("series-group", indexRuleEvent.Series.Group).
 		Msg("received an index rule")
 	i.indexMeta.Lock()
 	defer i.indexMeta.Unlock()
 	switch indexRuleEvent.Action {
-	case apiv1.Action_ACTION_PUT:
+	case databasev1.Action_ACTION_PUT:
 		seriesID := compositeSeriesID(indexRuleEvent.Series)
 		newSeries := &series{
 			repo: make(map[uint]*shard),
@@ -237,7 +239,7 @@ func (i *indexRuleListener) Rev(message bus.Message) (resp bus.Message) {
 		for _, rule := range indexRuleEvent.Rules {
 			store := tsdb.NewStore(indexRuleEvent.Series.Name, indexRuleEvent.Series.Group, uint(rule.ShardId))
 			fields := make([]tsdb.FieldSpec, 0, len(rule.Rules))
-			meta := make(map[string][]*apiv1.IndexObject)
+			meta := make(map[string][]*databasev1.IndexObject)
 			for _, indexRule := range rule.GetRules() {
 				for _, object := range indexRule.Objects {
 					fieldsSize := len(object.Fields)
@@ -256,7 +258,7 @@ func (i *indexRuleListener) Rev(message bus.Message) (resp bus.Message) {
 					fields = append(fields, fieldSpec)
 					objects, existed := meta[field]
 					if !existed {
-						objects = make([]*apiv1.IndexObject, 0, 1)
+						objects = make([]*databasev1.IndexObject, 0, 1)
 					}
 					objects = append(objects, object)
 					meta[field] = objects
@@ -282,6 +284,6 @@ func compositeFieldID(indexObjectName, field string) string {
 	return indexObjectName + ":" + field
 }
 
-func compositeSeriesID(series *apiv1.Metadata) string {
+func compositeSeriesID(series *commonv1.Metadata) string {
 	return series.Name + "-" + series.Group
 }
diff --git a/banyand/index/index_test.go b/banyand/index/index_test.go
index cd09710..fde4e9f 100644
--- a/banyand/index/index_test.go
+++ b/banyand/index/index_test.go
@@ -28,7 +28,8 @@ import (
 
 	"github.com/apache/skywalking-banyandb/api/common"
 	"github.com/apache/skywalking-banyandb/api/event"
-	apiv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	commonv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+	databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
 	"github.com/apache/skywalking-banyandb/banyand/discovery"
 	"github.com/apache/skywalking-banyandb/pkg/bus"
 	"github.com/apache/skywalking-banyandb/pkg/convert"
@@ -136,9 +137,9 @@ func setUpModules(tester *assert.Assertions) *service {
 	tester.NoError(err)
 	tester.NoError(svc.PreRun())
 
-	rules := []*apiv1.IndexRule{
+	rules := []*databasev1.IndexRule{
 		{
-			Objects: []*apiv1.IndexObject{
+			Objects: []*databasev1.IndexObject{
 				{
 					Name:   "endpoint",
 					Fields: []string{"endpoint"},
@@ -150,13 +151,13 @@ func setUpModules(tester *assert.Assertions) *service {
 			},
 		},
 	}
-	seriesID := &apiv1.Metadata{
+	seriesID := &commonv1.Metadata{
 		Name:  "sw",
 		Group: "default",
 	}
-	_, err = repo.Publish(event.TopicIndexRule, bus.NewMessage(bus.MessageID(time.Now().UnixNano()), &apiv1.IndexRuleEvent{
+	_, err = repo.Publish(event.TopicIndexRule, bus.NewMessage(bus.MessageID(time.Now().UnixNano()), &databasev1.IndexRuleEvent{
 		Series: seriesID,
-		Rules: []*apiv1.IndexRuleEvent_ShardedIndexRule{
+		Rules: []*databasev1.IndexRuleEvent_ShardedIndexRule{
 			{
 				ShardId: 0,
 				Rules:   rules,
@@ -166,7 +167,7 @@ func setUpModules(tester *assert.Assertions) *service {
 				Rules:   rules,
 			},
 		},
-		Action: apiv1.Action_ACTION_PUT,
+		Action: databasev1.Action_ACTION_PUT,
 		Time:   timestamppb.Now(),
 	}))
 	tester.NoError(err)
diff --git a/banyand/index/search.go b/banyand/index/search.go
index 97da458..d25ad88 100644
--- a/banyand/index/search.go
+++ b/banyand/index/search.go
@@ -25,7 +25,7 @@ import (
 	"github.com/pkg/errors"
 
 	"github.com/apache/skywalking-banyandb/api/common"
-	apiv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	modelv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
 	"github.com/apache/skywalking-banyandb/banyand/index/tsdb"
 	"github.com/apache/skywalking-banyandb/pkg/bytes"
 	"github.com/apache/skywalking-banyandb/pkg/posting"
@@ -85,30 +85,30 @@ func buildSearchTree(searcher tsdb.Searcher, indexObject string, conditions []Co
 				}
 				opts := rangeLeaf.Opts
 				switch cond.Op {
-				case apiv1.PairQuery_BINARY_OP_GT:
+				case modelv1.PairQuery_BINARY_OP_GT:
 					opts.Lower = bytes.Join(cond.Values...)
-				case apiv1.PairQuery_BINARY_OP_GE:
+				case modelv1.PairQuery_BINARY_OP_GE:
 					opts.Lower = bytes.Join(cond.Values...)
 					opts.IncludesLower = true
-				case apiv1.PairQuery_BINARY_OP_LT:
+				case modelv1.PairQuery_BINARY_OP_LT:
 					opts.Upper = bytes.Join(cond.Values...)
-				case apiv1.PairQuery_BINARY_OP_LE:
+				case modelv1.PairQuery_BINARY_OP_LE:
 					opts.Upper = bytes.Join(cond.Values...)
 					opts.IncludesUpper = true
 				}
 				continue
 			}
 			switch cond.Op {
-			case apiv1.PairQuery_BINARY_OP_EQ:
+			case modelv1.PairQuery_BINARY_OP_EQ:
 				root.addEq(key, cond.Values)
-			case apiv1.PairQuery_BINARY_OP_NE:
+			case modelv1.PairQuery_BINARY_OP_NE:
 				root.addNot(key, root.newEq(key, cond.Values))
-			case apiv1.PairQuery_BINARY_OP_HAVING:
+			case modelv1.PairQuery_BINARY_OP_HAVING:
 				n := root.addOrNode(len(cond.Values))
 				for _, v := range cond.Values {
 					n.addEq(key, [][]byte{v})
 				}
-			case apiv1.PairQuery_BINARY_OP_NOT_HAVING:
+			case modelv1.PairQuery_BINARY_OP_NOT_HAVING:
 				n := root.newOrNode(len(cond.Values))
 				for _, v := range cond.Values {
 					n.addEq(key, [][]byte{v})
@@ -120,12 +120,12 @@ func buildSearchTree(searcher tsdb.Searcher, indexObject string, conditions []Co
 	return root, nil
 }
 
-func rangeOP(op apiv1.PairQuery_BinaryOp) bool {
+func rangeOP(op modelv1.PairQuery_BinaryOp) bool {
 	switch op {
-	case apiv1.PairQuery_BINARY_OP_GT,
-		apiv1.PairQuery_BINARY_OP_GE,
-		apiv1.PairQuery_BINARY_OP_LT,
-		apiv1.PairQuery_BINARY_OP_LE:
+	case modelv1.PairQuery_BINARY_OP_GT,
+		modelv1.PairQuery_BINARY_OP_GE,
+		modelv1.PairQuery_BINARY_OP_LT,
+		modelv1.PairQuery_BINARY_OP_LE:
 		return true
 	}
 	return false
diff --git a/banyand/index/search_test.go b/banyand/index/search_test.go
index d9eb8d9..8423cec 100644
--- a/banyand/index/search_test.go
+++ b/banyand/index/search_test.go
@@ -24,7 +24,7 @@ import (
 	"github.com/stretchr/testify/assert"
 
 	"github.com/apache/skywalking-banyandb/api/common"
-	apiv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	modelv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
 	"github.com/apache/skywalking-banyandb/pkg/convert"
 	"github.com/apache/skywalking-banyandb/pkg/posting"
 	"github.com/apache/skywalking-banyandb/pkg/posting/roaring"
@@ -49,7 +49,7 @@ func Test_service_Search(t *testing.T) {
 				conditions: []Condition{
 					{
 						Key:    "endpoint",
-						Op:     apiv1.PairQuery_BINARY_OP_EQ,
+						Op:     modelv1.PairQuery_BINARY_OP_EQ,
 						Values: [][]byte{[]byte("/product")},
 					},
 				},
@@ -63,7 +63,7 @@ func Test_service_Search(t *testing.T) {
 				conditions: []Condition{
 					{
 						Key:    "endpoint",
-						Op:     apiv1.PairQuery_BINARY_OP_NE,
+						Op:     modelv1.PairQuery_BINARY_OP_NE,
 						Values: [][]byte{[]byte("/product")},
 					},
 				},
@@ -77,7 +77,7 @@ func Test_service_Search(t *testing.T) {
 				conditions: []Condition{
 					{
 						Key:    "endpoint",
-						Op:     apiv1.PairQuery_BINARY_OP_HAVING,
+						Op:     modelv1.PairQuery_BINARY_OP_HAVING,
 						Values: [][]byte{[]byte("/product"), []byte("/sales")},
 					},
 				},
@@ -91,7 +91,7 @@ func Test_service_Search(t *testing.T) {
 				conditions: []Condition{
 					{
 						Key:    "endpoint",
-						Op:     apiv1.PairQuery_BINARY_OP_NOT_HAVING,
+						Op:     modelv1.PairQuery_BINARY_OP_NOT_HAVING,
 						Values: [][]byte{[]byte("/product"), []byte("/sales")},
 					},
 				},
@@ -105,7 +105,7 @@ func Test_service_Search(t *testing.T) {
 				conditions: []Condition{
 					{
 						Key:    "duration",
-						Op:     apiv1.PairQuery_BINARY_OP_EQ,
+						Op:     modelv1.PairQuery_BINARY_OP_EQ,
 						Values: [][]byte{convert.Int64ToBytes(500)},
 					},
 				},
@@ -119,7 +119,7 @@ func Test_service_Search(t *testing.T) {
 				conditions: []Condition{
 					{
 						Key:    "duration",
-						Op:     apiv1.PairQuery_BINARY_OP_NE,
+						Op:     modelv1.PairQuery_BINARY_OP_NE,
 						Values: [][]byte{convert.Int64ToBytes(500)},
 					},
 				},
@@ -133,7 +133,7 @@ func Test_service_Search(t *testing.T) {
 				conditions: []Condition{
 					{
 						Key:    "duration",
-						Op:     apiv1.PairQuery_BINARY_OP_HAVING,
+						Op:     modelv1.PairQuery_BINARY_OP_HAVING,
 						Values: [][]byte{convert.Int64ToBytes(500), convert.Int64ToBytes(50)},
 					},
 				},
@@ -147,7 +147,7 @@ func Test_service_Search(t *testing.T) {
 				conditions: []Condition{
 					{
 						Key:    "duration",
-						Op:     apiv1.PairQuery_BINARY_OP_NOT_HAVING,
+						Op:     modelv1.PairQuery_BINARY_OP_NOT_HAVING,
 						Values: [][]byte{convert.Int64ToBytes(500), convert.Int64ToBytes(50)},
 					},
 				},
@@ -161,12 +161,12 @@ func Test_service_Search(t *testing.T) {
 				conditions: []Condition{
 					{
 						Key:    "duration",
-						Op:     apiv1.PairQuery_BINARY_OP_GT,
+						Op:     modelv1.PairQuery_BINARY_OP_GT,
 						Values: [][]byte{convert.Int64ToBytes(50)},
 					},
 					{
 						Key:    "duration",
-						Op:     apiv1.PairQuery_BINARY_OP_LT,
+						Op:     modelv1.PairQuery_BINARY_OP_LT,
 						Values: [][]byte{convert.Int64ToBytes(5000)},
 					},
 				},
@@ -180,12 +180,12 @@ func Test_service_Search(t *testing.T) {
 				conditions: []Condition{
 					{
 						Key:    "duration",
-						Op:     apiv1.PairQuery_BINARY_OP_GE,
+						Op:     modelv1.PairQuery_BINARY_OP_GE,
 						Values: [][]byte{convert.Int64ToBytes(50)},
 					},
 					{
 						Key:    "duration",
-						Op:     apiv1.PairQuery_BINARY_OP_LE,
+						Op:     modelv1.PairQuery_BINARY_OP_LE,
 						Values: [][]byte{convert.Int64ToBytes(5000)},
 					},
 				},
diff --git a/banyand/liaison/grpc/data/server_cert.pem b/banyand/liaison/grpc/testdata/server_cert.pem
similarity index 100%
rename from banyand/liaison/grpc/data/server_cert.pem
rename to banyand/liaison/grpc/testdata/server_cert.pem
diff --git a/banyand/liaison/grpc/data/server_key.pem b/banyand/liaison/grpc/testdata/server_key.pem
similarity index 100%
rename from banyand/liaison/grpc/data/server_key.pem
rename to banyand/liaison/grpc/testdata/server_key.pem
diff --git a/banyand/liaison/grpc/grpc.go b/banyand/liaison/grpc/trace.go
similarity index 56%
rename from banyand/liaison/grpc/grpc.go
rename to banyand/liaison/grpc/trace.go
index 2ea2623..9ee1f35 100644
--- a/banyand/liaison/grpc/grpc.go
+++ b/banyand/liaison/grpc/trace.go
@@ -19,12 +19,9 @@ package grpc
 
 import (
 	"context"
-	"fmt"
 	"io"
 	"net"
-	"path/filepath"
-	"runtime"
-	"strings"
+	"strconv"
 	"sync"
 	"time"
 
@@ -35,7 +32,9 @@ import (
 	"github.com/apache/skywalking-banyandb/api/common"
 	"github.com/apache/skywalking-banyandb/api/data"
 	"github.com/apache/skywalking-banyandb/api/event"
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
+	modelv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
+	tracev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/trace/v1"
 	apischema "github.com/apache/skywalking-banyandb/api/schema"
 	"github.com/apache/skywalking-banyandb/banyand/discovery"
 	"github.com/apache/skywalking-banyandb/banyand/queue"
@@ -55,12 +54,14 @@ var (
 	ErrServerKey       = errors.New("invalid server key file")
 	ErrNoAddr          = errors.New("no address")
 	ErrQueryMsg        = errors.New("invalid query message")
+
+	defaultRecvSize = 1024 * 1024 * 10
 )
 
 type Server struct {
 	addr           string
 	maxRecvMsgSize int
-	tlsVal         bool
+	tls            bool
 	certFile       string
 	keyFile        string
 	log            *logger.Logger
@@ -69,90 +70,102 @@ type Server struct {
 	repo           discovery.ServiceRepo
 	shardInfo      *shardInfo
 	seriesInfo     *seriesInfo
-	v1.UnimplementedTraceServiceServer
+	tracev1.UnimplementedTraceServiceServer
+	creds credentials.TransportCredentials
 }
 
 type shardInfo struct {
-	log        *logger.Logger
-	shardEvent *shardEvent
+	log            *logger.Logger
+	shardEventsMap map[string]uint32
+	sync.RWMutex
 }
 
 func (s *shardInfo) Rev(message bus.Message) (resp bus.Message) {
-	event, ok := message.Data().(*v1.ShardEvent)
+	e, ok := message.Data().(*databasev1.ShardEvent)
 	if !ok {
-		s.log.Warn().Msg("invalid event data type")
+		s.log.Warn().Msg("invalid e data type")
 		return
 	}
-	s.shardEvent.setShardEvents(event)
+	s.setShardNum(e)
 	s.log.Info().
-		Str("action", v1.Action_name[int32(event.Action)]).
-		Uint64("shardID", event.Shard.Id).
-		Msg("received a shard event")
+		Str("action", databasev1.Action_name[int32(e.Action)]).
+		Uint64("shardID", e.Shard.Id).
+		Msg("received a shard e")
 	return
 }
 
-type shardEvent struct {
-	shardEventsMap map[string]*v1.ShardEvent
-	sync.RWMutex
-}
-
-func (s *shardEvent) setShardEvents(eventVal *v1.ShardEvent) {
+func (s *shardInfo) setShardNum(eventVal *databasev1.ShardEvent) {
 	s.RWMutex.Lock()
 	defer s.RWMutex.Unlock()
 	idx := eventVal.Shard.Series.GetName() + "-" + eventVal.Shard.Series.GetGroup()
-	if eventVal.Action == v1.Action_ACTION_PUT {
-		s.shardEventsMap[idx] = eventVal
-	} else if eventVal.Action == v1.Action_ACTION_DELETE {
+	if eventVal.Action == databasev1.Action_ACTION_PUT {
+		s.shardEventsMap[idx] = eventVal.Shard.Total
+	} else if eventVal.Action == databasev1.Action_ACTION_DELETE {
 		delete(s.shardEventsMap, idx)
 	}
 }
 
-func (s *shardEvent) getShardEvent(idx string) *v1.ShardEvent {
+func (s *shardInfo) shardNum(idx string) uint32 {
 	s.RWMutex.RLock()
 	defer s.RWMutex.RUnlock()
 	return s.shardEventsMap[idx]
 }
 
 type seriesInfo struct {
-	log         *logger.Logger
-	seriesEvent *seriesEvent
+	log             *logger.Logger
+	seriesEventsMap map[string][]int
+	sync.RWMutex
 }
 
 func (s *seriesInfo) Rev(message bus.Message) (resp bus.Message) {
-	event, ok := message.Data().(*v1.SeriesEvent)
+	e, ok := message.Data().(*databasev1.SeriesEvent)
 	if !ok {
-		s.log.Warn().Msg("invalid event data type")
+		s.log.Warn().Msg("invalid e data type")
 		return
 	}
-	s.seriesEvent.setSeriesEvents(event)
+	s.updateFieldIndexCompositeSeriesID(e)
 	s.log.Info().
-		Str("action", v1.Action_name[int32(event.Action)]).
-		Str("name", event.Series.Name).
-		Str("group", event.Series.Group).
-		Msg("received a shard event")
+		Str("action", databasev1.Action_name[int32(e.Action)]).
+		Str("name", e.Series.Name).
+		Str("group", e.Series.Group).
+		Msg("received a shard e")
 	return
 }
 
-type seriesEvent struct {
-	seriesEventsMap map[string]*v1.SeriesEvent
-	sync.RWMutex
-}
-
-func (s *seriesEvent) setSeriesEvents(seriesEventVal *v1.SeriesEvent) {
+func (s *seriesInfo) updateFieldIndexCompositeSeriesID(seriesEventVal *databasev1.SeriesEvent) {
 	s.RWMutex.Lock()
 	defer s.RWMutex.Unlock()
 	str := seriesEventVal.Series.GetName() + "-" + seriesEventVal.Series.GetGroup()
-	if seriesEventVal.Action == v1.Action_ACTION_PUT {
-		s.seriesEventsMap[str] = seriesEventVal
-	} else if seriesEventVal.Action == v1.Action_ACTION_DELETE {
+	if seriesEventVal.Action == databasev1.Action_ACTION_PUT {
+		ana := logical.DefaultAnalyzer()
+		metadata := common.Metadata{
+			KindVersion: apischema.SeriesKindVersion,
+			Spec:        seriesEventVal.Series,
+		}
+		schema, err := ana.BuildTraceSchema(context.TODO(), metadata)
+		if err != nil {
+			s.log.Err(err).Msg("build trace schema")
+			return
+		}
+		fieldRefs, errField := schema.CreateRef(seriesEventVal.FieldNamesCompositeSeriesId...)
+		if errField != nil {
+			s.log.Err(errField).Msg("create series ref")
+			return
+		}
+		refIdx := make([]int, len(fieldRefs))
+		for i, ref := range fieldRefs {
+			refIdx[i] = ref.Spec.Idx
+		}
+		s.seriesEventsMap[str] = refIdx
+	} else if seriesEventVal.Action == databasev1.Action_ACTION_DELETE {
 		delete(s.seriesEventsMap, str)
 	}
 }
 
-func (s *seriesEvent) getSeriesEvent(idx string) *v1.SeriesEvent {
+func (s *seriesInfo) FieldIndexCompositeSeriesID(seriesMeta string) []int {
 	s.RWMutex.RLock()
 	defer s.RWMutex.RUnlock()
-	return s.seriesEventsMap[idx]
+	return s.seriesEventsMap[seriesMeta]
 }
 
 func (s *Server) PreRun() error {
@@ -166,12 +179,12 @@ func (s *Server) PreRun() error {
 	return s.repo.Subscribe(event.TopicSeriesEvent, s.seriesInfo)
 }
 
-func NewServer(ctx context.Context, pipeline queue.Queue, repo discovery.ServiceRepo) *Server {
+func NewServer(_ context.Context, pipeline queue.Queue, repo discovery.ServiceRepo) *Server {
 	return &Server{
 		pipeline:   pipeline,
 		repo:       repo,
-		shardInfo:  &shardInfo{shardEvent: &shardEvent{shardEventsMap: map[string]*v1.ShardEvent{}}},
-		seriesInfo: &seriesInfo{seriesEvent: &seriesEvent{seriesEventsMap: map[string]*v1.SeriesEvent{}}},
+		shardInfo:  &shardInfo{shardEventsMap: make(map[string]uint32)},
+		seriesInfo: &seriesInfo{seriesEventsMap: make(map[string][]int)},
 	}
 }
 
@@ -180,19 +193,12 @@ func (s *Server) Name() string {
 }
 
 func (s *Server) FlagSet() *run.FlagSet {
-	size := 1024 * 1024 * 10
-	_, currentFile, _, _ := runtime.Caller(0)
-	basePath := filepath.Dir(currentFile)
-	serverCert := filepath.Join(basePath, "data/server_cert.pem")
-	serverKey := filepath.Join(basePath, "data/server_key.pem")
-
 	fs := run.NewFlagSet("grpc")
-	fs.IntVarP(&s.maxRecvMsgSize, "maxRecvMsgSize", "", size, "The size of max receiving message")
-	fs.BoolVarP(&s.tlsVal, "tlsVal", "", true, "Connection uses TLS if true, else plain TCP")
-	fs.StringVarP(&s.certFile, "certFile", "", serverCert, "The TLS cert file")
-	fs.StringVarP(&s.keyFile, "keyFile", "", serverKey, "The TLS key file")
+	fs.IntVarP(&s.maxRecvMsgSize, "max-recv-msg-size", "", defaultRecvSize, "The size of max receiving message")
+	fs.BoolVarP(&s.tls, "tls", "", true, "Connection uses TLS if true, else plain TCP")
+	fs.StringVarP(&s.certFile, "cert-file", "", "server_cert.pem", "The TLS cert file")
+	fs.StringVarP(&s.keyFile, "key-file", "", "server_key.pem", "The TLS key file")
 	fs.StringVarP(&s.addr, "addr", "", ":17912", "The address of banyand listens")
-
 	return fs
 }
 
@@ -200,18 +206,20 @@ func (s *Server) Validate() error {
 	if s.addr == "" {
 		return ErrNoAddr
 	}
-	if s.tlsVal {
-		if s.certFile == "" {
-			return ErrServerCert
-		}
-		if s.keyFile == "" {
-			return ErrServerKey
-		}
-		_, errTLS := credentials.NewServerTLSFromFile(s.certFile, s.keyFile)
-		if errTLS != nil {
-			return errTLS
-		}
+	if !s.tls {
+		return nil
+	}
+	if s.certFile == "" {
+		return ErrServerCert
+	}
+	if s.keyFile == "" {
+		return ErrServerKey
+	}
+	creds, errTLS := credentials.NewServerTLSFromFile(s.certFile, s.keyFile)
+	if errTLS != nil {
+		return errTLS
 	}
+	s.creds = creds
 	return nil
 }
 
@@ -224,13 +232,12 @@ func (s *Server) Serve() error {
 		s.log.Fatal().Err(errValidate).Msg("Failed to validate data")
 	}
 	var opts []grpclib.ServerOption
-	if s.tlsVal {
-		creds, _ := credentials.NewServerTLSFromFile(s.certFile, s.keyFile)
-		opts = []grpclib.ServerOption{grpclib.Creds(creds)}
+	if s.tls {
+		opts = []grpclib.ServerOption{grpclib.Creds(s.creds)}
 	}
 	opts = append(opts, grpclib.MaxRecvMsgSize(s.maxRecvMsgSize))
 	s.ser = grpclib.NewServer(opts...)
-	v1.RegisterTraceServiceServer(s.ser, s)
+	tracev1.RegisterTraceServiceServer(s.ser, s)
 
 	return s.ser.Serve(lis)
 }
@@ -240,72 +247,52 @@ func (s *Server) GracefulStop() {
 	s.ser.GracefulStop()
 }
 
-func (s *Server) computeSeriesID(writeEntity *v1.WriteRequest, mapIndexName string) (SeriesID []byte, err error) {
-	ana := logical.DefaultAnalyzer()
-	metadata := common.Metadata{
-		KindVersion: apischema.SeriesKindVersion,
-		Spec:        writeEntity.GetMetadata(),
-	}
-	schema, ruleError := ana.BuildTraceSchema(context.TODO(), metadata)
-	if ruleError != nil {
-		return nil, ruleError
-	}
-	seriesEventVal := s.seriesInfo.seriesEvent.getSeriesEvent(mapIndexName)
-	if seriesEventVal == nil {
+func (s *Server) computeSeriesID(writeEntity *tracev1.WriteRequest, mapIndexName string) ([]byte, error) {
+	fieldNames := s.seriesInfo.FieldIndexCompositeSeriesID(mapIndexName)
+	if fieldNames == nil {
 		return nil, ErrSeriesEvents
 	}
 	var str string
-	var arr []string
-	fieldRefs, errField := schema.CreateRef(seriesEventVal.FieldNamesCompositeSeriesId...)
-	if errField != nil {
-		return nil, errField
-	}
-	for _, ref := range fieldRefs {
-		field := writeEntity.GetEntity().GetFields()[ref.Spec.Idx]
+	for _, ref := range fieldNames {
+		field := writeEntity.GetEntity().GetFields()[ref]
 		switch v := field.GetValueType().(type) {
-		case *v1.Field_StrArray:
+		case *modelv1.Field_StrArray:
 			for j := 0; j < len(v.StrArray.Value); j++ {
-				arr = append(arr, v.StrArray.Value[j])
+				str = str + v.StrArray.Value[j]
 			}
-		case *v1.Field_IntArray:
+		case *modelv1.Field_IntArray:
 			for t := 0; t < len(v.IntArray.Value); t++ {
-				arr = append(arr, fmt.Sprint(v.IntArray.Value[t]))
+				str = str + strconv.FormatInt(v.IntArray.Value[t], 10)
 			}
-		case *v1.Field_Int:
-			arr = append(arr, fmt.Sprint(v.Int.Value))
-		case *v1.Field_Str:
-			arr = append(arr, fmt.Sprint(v.Str.Value))
+		case *modelv1.Field_Int:
+			str = str + strconv.FormatInt(v.Int.Value, 10)
+		case *modelv1.Field_Str:
+			str = str + v.Str.Value
 		}
+		str = str + ":"
 	}
-	str = strings.Join(arr, "")
 	if str == "" {
 		return nil, ErrInvalidSeriesID
 	}
-	seriesID := []byte(str)
 
-	return seriesID, nil
+	return []byte(str), nil
 }
 
-func (s *Server) computeShardID(seriesID []byte, mapIndexName string) (shardID uint, err error) {
-	shardEventVal := s.shardInfo.shardEvent.getShardEvent(mapIndexName)
-	if shardEventVal == nil {
-		return 0, ErrShardEvents
-	}
-	shardNum := shardEventVal.GetShard().GetId()
+func (s *Server) computeShardID(seriesID []byte, mapIndexName string) (uint, error) {
+	shardNum := s.shardInfo.shardNum(mapIndexName)
 	if shardNum < 1 {
-		shardNum = 1
+		return 0, ErrShardEvents
 	}
-	shardID, shardIDError := partition.ShardID(seriesID, uint32(shardNum))
+	shardID, shardIDError := partition.ShardID(seriesID, shardNum)
 	if shardIDError != nil {
 		return 0, shardIDError
 	}
-
 	return shardID, nil
 }
 
-func (s *Server) Write(TraceWriteServer v1.TraceService_WriteServer) error {
+func (s *Server) Write(stream tracev1.TraceService_WriteServer) error {
 	for {
-		writeEntity, err := TraceWriteServer.Recv()
+		writeEntity, err := stream.Recv()
 		if err == io.EOF {
 			return nil
 		}
@@ -327,13 +314,13 @@ func (s *Server) Write(TraceWriteServer v1.TraceService_WriteServer) error {
 		if errWritePub != nil {
 			return errWritePub
 		}
-		if errSend := TraceWriteServer.Send(&v1.WriteResponse{}); errSend != nil {
+		if errSend := stream.Send(&tracev1.WriteResponse{}); errSend != nil {
 			return errSend
 		}
 	}
 }
 
-func (s *Server) Query(ctx context.Context, entityCriteria *v1.QueryRequest) (*v1.QueryResponse, error) {
+func (s *Server) Query(_ context.Context, entityCriteria *tracev1.QueryRequest) (*tracev1.QueryResponse, error) {
 	message := bus.NewMessage(bus.MessageID(time.Now().UnixNano()), entityCriteria)
 	feat, errQuery := s.pipeline.Publish(data.TopicQueryEvent, message)
 	if errQuery != nil {
@@ -347,14 +334,14 @@ func (s *Server) Query(ctx context.Context, entityCriteria *v1.QueryRequest) (*v
 	if !ok {
 		return nil, ErrQueryMsg
 	}
-	var arr []*v1.Entity
+	var arr []*tracev1.Entity
 	for i := 0; i < len(queryMsg); i++ {
 		arr = append(arr, queryMsg[i].Entity)
 	}
 
-	return &v1.QueryResponse{Entities: arr}, nil
+	return &tracev1.QueryResponse{Entities: arr}, nil
 }
 
-func assemblyWriteData(shardID uint, writeEntity *v1.WriteRequest, seriesID uint64) data.TraceWriteDate {
+func assemblyWriteData(shardID uint, writeEntity *tracev1.WriteRequest, seriesID uint64) data.TraceWriteDate {
 	return data.TraceWriteDate{ShardID: shardID, SeriesID: seriesID, WriteRequest: writeEntity}
 }
diff --git a/banyand/liaison/grpc/grpc_test.go b/banyand/liaison/grpc/trace_test.go
similarity index 90%
rename from banyand/liaison/grpc/grpc_test.go
rename to banyand/liaison/grpc/trace_test.go
index 7b13bdd..84a2830 100644
--- a/banyand/liaison/grpc/grpc_test.go
+++ b/banyand/liaison/grpc/trace_test.go
@@ -33,7 +33,7 @@ import (
 	grpclib "google.golang.org/grpc"
 	"google.golang.org/grpc/credentials"
 
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	tracev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/trace/v1"
 	"github.com/apache/skywalking-banyandb/banyand/discovery"
 	"github.com/apache/skywalking-banyandb/banyand/index"
 	"github.com/apache/skywalking-banyandb/banyand/liaison/grpc"
@@ -82,9 +82,9 @@ func setup(tester *require.Assertions) (*grpc.Server, *grpc.Server, func()) {
 	tester.NoError(err)
 	// Init `liaison` module
 	tcp := grpc.NewServer(context.TODO(), pipeline, repo)
-	tester.NoError(tcp.FlagSet().Parse([]string{"--tlsVal=false", "--addr=:17912"}))
+	tester.NoError(tcp.FlagSet().Parse([]string{"--tls=false", "--addr=:17912"}))
 	tcpTLS := grpc.NewServer(context.TODO(), pipeline, repo)
-	tester.NoError(tcpTLS.FlagSet().Parse([]string{"--tlsVal=true", "--addr=:17913"}))
+	tester.NoError(tcpTLS.FlagSet().Parse([]string{"--tls=true", "--addr=:17913", "--cert-file=testdata/server_cert.pem", "--key-file=testdata/server_key.pem"}))
 
 	err = indexSvc.PreRun()
 	tester.NoError(err)
@@ -127,8 +127,8 @@ func setup(tester *require.Assertions) (*grpc.Server, *grpc.Server, func()) {
 
 type caseData struct {
 	name           string
-	queryGenerator func(baseTs time.Time) *v1.QueryRequest
-	writeGenerator func() *v1.WriteRequest
+	queryGenerator func(baseTs time.Time) *tracev1.QueryRequest
+	writeGenerator func() *tracev1.WriteRequest
 	args           testData
 	wantLen        int
 }
@@ -139,11 +139,11 @@ func TestTraceService(t *testing.T) {
 	defer gracefulStop()
 	_, currentFile, _, _ := runtime.Caller(0)
 	basePath := filepath.Dir(currentFile)
-	certFile := filepath.Join(basePath, "data/server_cert.pem")
+	certFile := filepath.Join(basePath, "testdata/server_cert.pem")
 	testCases := []caseData{
 		{
 			name: "isTLS",
-			queryGenerator: func(baseTs time.Time) *v1.QueryRequest {
+			queryGenerator: func(baseTs time.Time) *tracev1.QueryRequest {
 				return pb.NewQueryRequestBuilder().
 					Limit(10).
 					Offset(0).
@@ -153,7 +153,7 @@ func TestTraceService(t *testing.T) {
 					Projection("trace_id").
 					Build()
 			},
-			writeGenerator: func() *v1.WriteRequest {
+			writeGenerator: func() *tracev1.WriteRequest {
 				entityValue := pb.NewEntityValueBuilder().
 					EntityID("entityId123").
 					DataBinary([]byte{12}).
@@ -185,7 +185,7 @@ func TestTraceService(t *testing.T) {
 		},
 		{
 			name: "noTLS",
-			queryGenerator: func(baseTs time.Time) *v1.QueryRequest {
+			queryGenerator: func(baseTs time.Time) *tracev1.QueryRequest {
 				return pb.NewQueryRequestBuilder().
 					Limit(10).
 					Offset(0).
@@ -195,7 +195,7 @@ func TestTraceService(t *testing.T) {
 					Projection("trace_id").
 					Build()
 			},
-			writeGenerator: func() *v1.WriteRequest {
+			writeGenerator: func() *tracev1.WriteRequest {
 				entityValue := pb.NewEntityValueBuilder().
 					EntityID("entityId123").
 					DataBinary([]byte{12}).
@@ -254,7 +254,7 @@ func dialService(t *testing.T, tc caseData, opts []grpclib.DialOption) {
 }
 
 func traceWrite(t *testing.T, tc caseData, conn *grpclib.ClientConn) {
-	client := v1.NewTraceServiceClient(conn)
+	client := tracev1.NewTraceServiceClient(conn)
 	ctx := context.Background()
 	stream, errorWrite := client.Write(ctx)
 	if errorWrite != nil {
@@ -283,7 +283,7 @@ func traceWrite(t *testing.T, tc caseData, conn *grpclib.ClientConn) {
 }
 
 func traceQuery(t *testing.T, tc caseData, conn *grpclib.ClientConn) {
-	client := v1.NewTraceServiceClient(conn)
+	client := tracev1.NewTraceServiceClient(conn)
 	ctx := context.Background()
 	baseTs := time.Now()
 	stream, errRev := client.Query(ctx, tc.queryGenerator(baseTs))
diff --git a/banyand/query/processor.go b/banyand/query/processor.go
index 807fcc7..b86f6a7 100644
--- a/banyand/query/processor.go
+++ b/banyand/query/processor.go
@@ -23,7 +23,7 @@ import (
 
 	"github.com/apache/skywalking-banyandb/api/common"
 	"github.com/apache/skywalking-banyandb/api/data"
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/trace/v1"
 	apischema "github.com/apache/skywalking-banyandb/api/schema"
 	"github.com/apache/skywalking-banyandb/banyand/discovery"
 	"github.com/apache/skywalking-banyandb/banyand/index"
diff --git a/banyand/query/processor_test.go b/banyand/query/processor_test.go
index a1abe7b..bfa555f 100644
--- a/banyand/query/processor_test.go
+++ b/banyand/query/processor_test.go
@@ -29,7 +29,8 @@ import (
 
 	"github.com/apache/skywalking-banyandb/api/common"
 	"github.com/apache/skywalking-banyandb/api/data"
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	commonv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+	tracev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/trace/v1"
 	"github.com/apache/skywalking-banyandb/banyand/discovery"
 	"github.com/apache/skywalking-banyandb/banyand/index"
 	"github.com/apache/skywalking-banyandb/banyand/liaison/grpc"
@@ -127,7 +128,7 @@ func setupServices(t *testing.T, tester *require.Assertions) (series.Service, qu
 
 func setupData(tester *require.Assertions, baseTs time.Time, svc series.Service) {
 	metadata := common.Metadata{
-		Spec: &v1.Metadata{
+		Spec: &commonv1.Metadata{
 			Name:  "sw",
 			Group: "default",
 		},
@@ -297,13 +298,13 @@ func TestQueryProcessor(t *testing.T) {
 		// name of the test case
 		name string
 		// queryGenerator is used to generate a Query
-		queryGenerator func(baseTs time.Time) *v1.QueryRequest
+		queryGenerator func(baseTs time.Time) *tracev1.QueryRequest
 		// wantLen is the length of entities expected to return
 		wantLen int
 	}{
 		{
 			name: "query given timeRange is out of the time range of data",
-			queryGenerator: func(baseTs time.Time) *v1.QueryRequest {
+			queryGenerator: func(baseTs time.Time) *tracev1.QueryRequest {
 				return pb.NewQueryRequestBuilder().
 					Limit(10).
 					Offset(0).
@@ -316,7 +317,7 @@ func TestQueryProcessor(t *testing.T) {
 		},
 		{
 			name: "query given timeRange which slightly covers the first three segments",
-			queryGenerator: func(baseTs time.Time) *v1.QueryRequest {
+			queryGenerator: func(baseTs time.Time) *tracev1.QueryRequest {
 				return pb.NewQueryRequestBuilder().
 					Limit(10).
 					Offset(0).
@@ -329,7 +330,7 @@ func TestQueryProcessor(t *testing.T) {
 		},
 		{
 			name: "query TraceID given timeRange includes the time range of data",
-			queryGenerator: func(baseTs time.Time) *v1.QueryRequest {
+			queryGenerator: func(baseTs time.Time) *tracev1.QueryRequest {
 				return pb.NewQueryRequestBuilder().
 					Limit(10).
 					Offset(0).
@@ -343,7 +344,7 @@ func TestQueryProcessor(t *testing.T) {
 		},
 		{
 			name: "query TraceID given timeRange includes the time range of data but limit to 1",
-			queryGenerator: func(baseTs time.Time) *v1.QueryRequest {
+			queryGenerator: func(baseTs time.Time) *tracev1.QueryRequest {
 				return pb.NewQueryRequestBuilder().
 					Limit(1).
 					Offset(0).
@@ -357,7 +358,7 @@ func TestQueryProcessor(t *testing.T) {
 		},
 		{
 			name: "Numerical Index - query duration < 200",
-			queryGenerator: func(baseTs time.Time) *v1.QueryRequest {
+			queryGenerator: func(baseTs time.Time) *tracev1.QueryRequest {
 				return pb.NewQueryRequestBuilder().
 					Limit(1).
 					Offset(0).
@@ -371,7 +372,7 @@ func TestQueryProcessor(t *testing.T) {
 		},
 		{
 			name: "Numerical Index - query duration < 400",
-			queryGenerator: func(baseTs time.Time) *v1.QueryRequest {
+			queryGenerator: func(baseTs time.Time) *tracev1.QueryRequest {
 				return pb.NewQueryRequestBuilder().
 					Limit(10).
 					Offset(0).
@@ -385,7 +386,7 @@ func TestQueryProcessor(t *testing.T) {
 		},
 		{
 			name: "Textual Index - db.type == MySQL",
-			queryGenerator: func(baseTs time.Time) *v1.QueryRequest {
+			queryGenerator: func(baseTs time.Time) *tracev1.QueryRequest {
 				return pb.NewQueryRequestBuilder().
 					Limit(10).
 					Offset(0).
@@ -399,7 +400,7 @@ func TestQueryProcessor(t *testing.T) {
 		},
 		{
 			name: "Mixed Index - db.type == MySQL AND duration <= 300",
-			queryGenerator: func(baseTs time.Time) *v1.QueryRequest {
+			queryGenerator: func(baseTs time.Time) *tracev1.QueryRequest {
 				return pb.NewQueryRequestBuilder().
 					Limit(10).
 					Offset(0).
diff --git a/banyand/series/schema/sw/sw.go b/banyand/series/schema/sw/sw.go
index a38bc7f..c4d91a0 100644
--- a/banyand/series/schema/sw/sw.go
+++ b/banyand/series/schema/sw/sw.go
@@ -16,10 +16,10 @@
 // under the License.
 
 //nolint
-//go:generate sh -c "protoc -I../../../../api/proto --encode=banyandb.v1.TraceSeries ../../../../api/proto/banyandb/v1/schema.proto < trace_series.textproto > trace_series.bin"
-//go:generate sh -c "protoc -I../../../../api/proto --encode=banyandb.v1.IndexRule ../../../../api/proto/banyandb/v1/schema.proto < index_rule.textproto > index_rule.bin"
+//go:generate sh -c "protoc -I../../../../api/proto --encode=banyandb.database.v1.TraceSeries ../../../../api/proto/banyandb/database/v1/schema.proto < trace_series.textproto > trace_series.bin"
+//go:generate sh -c "protoc -I../../../../api/proto --encode=banyandb.database.v1.IndexRule ../../../../api/proto/banyandb/database/v1/schema.proto < index_rule.textproto > index_rule.bin"
 //nolint
-//go:generate sh -c "protoc -I../../../../api/proto --encode=banyandb.v1.IndexRuleBinding ../../../../api/proto/banyandb/v1/schema.proto < index_rule_binding.textproto > index_rule_binding.bin"
+//go:generate sh -c "protoc -I../../../../api/proto --encode=banyandb.database.v1.IndexRuleBinding ../../../../api/proto/banyandb/database/v1/schema.proto < index_rule_binding.textproto > index_rule_binding.bin"
 package sw
 
 import (
@@ -30,7 +30,7 @@ import (
 	"github.com/golang/protobuf/proto"
 
 	"github.com/apache/skywalking-banyandb/api/common"
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
 	apischema "github.com/apache/skywalking-banyandb/api/schema"
 	"github.com/apache/skywalking-banyandb/banyand/series/schema"
 )
diff --git a/banyand/series/series.go b/banyand/series/series.go
index f10b60e..02de4df 100644
--- a/banyand/series/series.go
+++ b/banyand/series/series.go
@@ -24,7 +24,7 @@ import (
 
 	"github.com/apache/skywalking-banyandb/api/common"
 	"github.com/apache/skywalking-banyandb/api/data"
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
 	"github.com/apache/skywalking-banyandb/banyand/series/schema"
 	posting2 "github.com/apache/skywalking-banyandb/pkg/posting"
 	"github.com/apache/skywalking-banyandb/pkg/run"
diff --git a/banyand/series/trace/common_test.go b/banyand/series/trace/common_test.go
index 8d13a7c..9445c62 100644
--- a/banyand/series/trace/common_test.go
+++ b/banyand/series/trace/common_test.go
@@ -32,7 +32,7 @@ import (
 
 	"github.com/apache/skywalking-banyandb/api/common"
 	"github.com/apache/skywalking-banyandb/api/data"
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
 	"github.com/apache/skywalking-banyandb/banyand/index"
 	"github.com/apache/skywalking-banyandb/banyand/storage"
 	"github.com/apache/skywalking-banyandb/pkg/convert"
diff --git a/banyand/series/trace/query.go b/banyand/series/trace/query.go
index 770c877..c5af650 100644
--- a/banyand/series/trace/query.go
+++ b/banyand/series/trace/query.go
@@ -27,7 +27,7 @@ import (
 
 	"github.com/apache/skywalking-banyandb/api/common"
 	"github.com/apache/skywalking-banyandb/api/data"
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/trace/v1"
 	"github.com/apache/skywalking-banyandb/banyand/kv"
 	"github.com/apache/skywalking-banyandb/banyand/series"
 	"github.com/apache/skywalking-banyandb/pkg/convert"
diff --git a/banyand/series/trace/schema.go b/banyand/series/trace/schema.go
index a8e4227..f98d039 100644
--- a/banyand/series/trace/schema.go
+++ b/banyand/series/trace/schema.go
@@ -24,7 +24,8 @@ import (
 	"go.uber.org/multierr"
 
 	"github.com/apache/skywalking-banyandb/api/common"
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	commonv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+	databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
 	"github.com/apache/skywalking-banyandb/banyand/series"
 	"github.com/apache/skywalking-banyandb/banyand/series/schema"
 	"github.com/apache/skywalking-banyandb/banyand/series/schema/sw"
@@ -44,7 +45,7 @@ func (s *service) IndexRuleBinding() schema.IndexRuleBinding {
 	return sw.NewIndexRuleBinding()
 }
 
-func (s *service) IndexRules(ctx context.Context, subject *v1.Series, filter series.IndexObjectFilter) ([]*v1.IndexRule, error) {
+func (s *service) IndexRules(ctx context.Context, subject *databasev1.Series, filter series.IndexObjectFilter) ([]*databasev1.IndexRule, error) {
 	group := subject.Series.GetGroup()
 	bindings, err := s.IndexRuleBinding().List(ctx, schema.ListOpt{Group: group})
 	if err != nil {
@@ -55,7 +56,7 @@ func (s *service) IndexRules(ctx context.Context, subject *v1.Series, filter ser
 		return nil, nil
 	}
 	now := time.Now()
-	foundRules := make([]*v1.Metadata, 0)
+	foundRules := make([]*commonv1.Metadata, 0)
 	for _, binding := range bindings {
 		spec := binding.Spec
 		if spec.GetBeginAt().AsTime().After(now) ||
@@ -77,7 +78,7 @@ func (s *service) IndexRules(ctx context.Context, subject *v1.Series, filter ser
 			}
 		}
 	}
-	result := make([]*v1.IndexRule, 0)
+	result := make([]*databasev1.IndexRule, 0)
 	var indexRuleErr error
 	for _, rule := range foundRules {
 		object, getErr := s.IndexRule().Get(ctx, common.Metadata{KindVersion: common.MetadataKindVersion, Spec: rule})
diff --git a/banyand/series/trace/schema_test.go b/banyand/series/trace/schema_test.go
index baf619d..adcbef8 100644
--- a/banyand/series/trace/schema_test.go
+++ b/banyand/series/trace/schema_test.go
@@ -23,20 +23,21 @@ import (
 	"testing"
 
 	"github.com/apache/skywalking-banyandb/api/common"
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	commonv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+	databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
 	"github.com/apache/skywalking-banyandb/banyand/series"
 	"github.com/apache/skywalking-banyandb/banyand/series/schema/sw"
 )
 
 func Test_service_RulesBySubject(t *testing.T) {
 	type args struct {
-		series *v1.Series
+		series *databasev1.Series
 		filter series.IndexObjectFilter
 	}
 	tests := []struct {
 		name    string
 		args    args
-		want    []*v1.IndexRule
+		want    []*databasev1.IndexRule
 		wantErr bool
 	}{
 		{
@@ -50,7 +51,7 @@ func Test_service_RulesBySubject(t *testing.T) {
 			name: "filter index object",
 			args: args{
 				series: createSubject("sw", "default"),
-				filter: func(object *v1.IndexObject) bool {
+				filter: func(object *databasev1.IndexObject) bool {
 					return object.GetFields()[0] == "trace_id"
 				},
 			},
@@ -60,7 +61,7 @@ func Test_service_RulesBySubject(t *testing.T) {
 			name: "got empty idWithShard",
 			args: args{
 				series: createSubject("sw", "default"),
-				filter: func(object *v1.IndexObject) bool {
+				filter: func(object *databasev1.IndexObject) bool {
 					return object.GetFields()[0] == "invalid"
 				},
 			},
@@ -85,23 +86,23 @@ func Test_service_RulesBySubject(t *testing.T) {
 	}
 }
 
-func getIndexRule(name, group string) []*v1.IndexRule {
+func getIndexRule(name, group string) []*databasev1.IndexRule {
 	indexRule, _ := sw.NewIndexRule().Get(context.Background(), common.Metadata{
 		KindVersion: common.MetadataKindVersion,
-		Spec: &v1.Metadata{
+		Spec: &commonv1.Metadata{
 			Group: group,
 			Name:  name,
 		}},
 	)
-	return []*v1.IndexRule{indexRule.Spec}
+	return []*databasev1.IndexRule{indexRule.Spec}
 }
 
-func createSubject(name, group string) *v1.Series {
-	return &v1.Series{
-		Series: &v1.Metadata{
+func createSubject(name, group string) *databasev1.Series {
+	return &databasev1.Series{
+		Series: &commonv1.Metadata{
 			Group: group,
 			Name:  name,
 		},
-		Catalog: v1.Series_CATALOG_TRACE,
+		Catalog: databasev1.Series_CATALOG_TRACE,
 	}
 }
diff --git a/banyand/series/trace/service.go b/banyand/series/trace/service.go
index d646447..05fd04c 100644
--- a/banyand/series/trace/service.go
+++ b/banyand/series/trace/service.go
@@ -26,7 +26,8 @@ import (
 	"github.com/apache/skywalking-banyandb/api/common"
 	"github.com/apache/skywalking-banyandb/api/data"
 	"github.com/apache/skywalking-banyandb/api/event"
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	commonv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+	databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
 	"github.com/apache/skywalking-banyandb/banyand/discovery"
 	"github.com/apache/skywalking-banyandb/banyand/index"
 	"github.com/apache/skywalking-banyandb/banyand/queue"
@@ -96,27 +97,27 @@ func (s *service) Serve() error {
 			SeriesMetadata(sMeta.group, sMeta.name).
 			FieldNames(sMeta.fieldsNamesCompositeSeriesID...).
 			Time(time.Now()).
-			Action(v1.Action_ACTION_PUT).
+			Action(databasev1.Action_ACTION_PUT).
 			Build()
 		_, err := s.repo.Publish(event.TopicSeriesEvent, bus.NewMessage(bus.MessageID(now), e))
 		if err != nil {
 			return err
 		}
-		seriesObj := &v1.Series{
-			Series: &v1.Metadata{
+		seriesObj := &databasev1.Series{
+			Series: &commonv1.Metadata{
 				Name:  sMeta.name,
 				Group: sMeta.group,
 			},
-			Catalog: v1.Series_CATALOG_TRACE,
+			Catalog: databasev1.Series_CATALOG_TRACE,
 		}
 		rules, errGetRules := s.IndexRules(context.Background(), seriesObj, nil)
 		if errGetRules != nil {
 			return errGetRules
 		}
-		shardedRuleIndex := make([]*v1.IndexRuleEvent_ShardedIndexRule, 0, len(rules)*int(sMeta.shardNum))
+		shardedRuleIndex := make([]*databasev1.IndexRuleEvent_ShardedIndexRule, 0, len(rules)*int(sMeta.shardNum))
 		for i := 0; i < int(sMeta.shardNum); i++ {
 			t := time.Now()
-			e := pb.NewShardEventBuilder().Action(v1.Action_ACTION_PUT).Time(t).
+			e := pb.NewShardEventBuilder().Action(databasev1.Action_ACTION_PUT).Time(t).
 				Shard(
 					pb.NewShardBuilder().
 						ID(uint64(i)).Total(sMeta.shardNum).SeriesMetadata(sMeta.group, sMeta.name).UpdatedAt(t).CreatedAt(t).
@@ -129,16 +130,16 @@ func (s *service) Serve() error {
 			if errShard != nil {
 				return errShard
 			}
-			shardedRuleIndex = append(shardedRuleIndex, &v1.IndexRuleEvent_ShardedIndexRule{
+			shardedRuleIndex = append(shardedRuleIndex, &databasev1.IndexRuleEvent_ShardedIndexRule{
 				ShardId: uint64(i),
 				Rules:   rules,
 			})
 		}
 
-		indexRule := &v1.IndexRuleEvent{
+		indexRule := &databasev1.IndexRuleEvent{
 			Series: seriesObj.Series,
 			Rules:  shardedRuleIndex,
-			Action: v1.Action_ACTION_PUT,
+			Action: databasev1.Action_ACTION_PUT,
 			Time:   timestamppb.New(time.Now()),
 		}
 		_, errPublishRules := s.repo.Publish(event.TopicIndexRule, bus.NewMessage(bus.MessageID(now), indexRule))
diff --git a/banyand/series/trace/trace.go b/banyand/series/trace/trace.go
index 96af476..37becfd 100644
--- a/banyand/series/trace/trace.go
+++ b/banyand/series/trace/trace.go
@@ -25,7 +25,9 @@ import (
 
 	"github.com/apache/skywalking-banyandb/api/common"
 	"github.com/apache/skywalking-banyandb/api/data"
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
+	modelv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
+	tracev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/trace/v1"
 	apischema "github.com/apache/skywalking-banyandb/api/schema"
 	"github.com/apache/skywalking-banyandb/banyand/index"
 	"github.com/apache/skywalking-banyandb/banyand/series"
@@ -148,7 +150,7 @@ type traceSeries struct {
 	traceIDIndex                 int
 	traceIDFieldName             string
 	stateFieldName               string
-	stateFieldType               v1.FieldSpec_FieldType
+	stateFieldType               databasev1.FieldSpec_FieldType
 	strStateSuccessVal           string
 	strStateErrorVal             string
 	intStateSuccessVal           int64
@@ -251,10 +253,10 @@ func (t *traceSeries) buildFieldIndex() error {
 		t.fieldIndex[f.GetName()] = idx
 	}
 	switch t.stateFieldType {
-	case v1.FieldSpec_FIELD_TYPE_STRING:
+	case databasev1.FieldSpec_FIELD_TYPE_STRING:
 		t.strStateSuccessVal = state.GetValSuccess()
 		t.strStateErrorVal = state.GetValError()
-	case v1.FieldSpec_FIELD_TYPE_INT:
+	case databasev1.FieldSpec_FIELD_TYPE_INT:
 		intSVal, err := strconv.ParseInt(state.GetValSuccess(), 10, 64)
 		if err != nil {
 			return err
@@ -279,7 +281,7 @@ func (t *traceSeries) buildFieldIndex() error {
 }
 
 // getTraceID extracts traceID as bytes from v1.EntityValue
-func (t *traceSeries) getTraceID(entityValue *v1.EntityValue) ([]byte, error) {
+func (t *traceSeries) getTraceID(entityValue *tracev1.EntityValue) ([]byte, error) {
 	if entityValue.GetFields() == nil {
 		return nil, errors.Wrapf(ErrFieldNotFound, "EntityValue does not contain any fields")
 	}
@@ -291,7 +293,7 @@ func (t *traceSeries) getTraceID(entityValue *v1.EntityValue) ([]byte, error) {
 		return nil, errors.Wrapf(ErrFieldNotFound, "trace_id index %d", t.traceIDIndex)
 	}
 	switch v := f.GetValueType().(type) {
-	case *v1.Field_Str:
+	case *modelv1.Field_Str:
 		return []byte(v.Str.GetValue()), nil
 	default:
 		// TODO: add a test to cover the default case
@@ -299,7 +301,7 @@ func (t *traceSeries) getTraceID(entityValue *v1.EntityValue) ([]byte, error) {
 	}
 }
 
-func (t *traceSeries) getState(entityValue *v1.EntityValue) (state State, fieldStoreName, dataStoreName string, err error) {
+func (t *traceSeries) getState(entityValue *tracev1.EntityValue) (state State, fieldStoreName, dataStoreName string, err error) {
 	if entityValue.GetFields() == nil {
 		err = errors.Wrapf(ErrFieldNotFound, "EntityValue does not contain any fields")
 		return
@@ -316,8 +318,8 @@ func (t *traceSeries) getState(entityValue *v1.EntityValue) (state State, fieldS
 	}
 
 	switch v := f.GetValueType().(type) {
-	case *v1.Field_Int:
-		if t.stateFieldType != v1.FieldSpec_FIELD_TYPE_INT {
+	case *modelv1.Field_Int:
+		if t.stateFieldType != databasev1.FieldSpec_FIELD_TYPE_INT {
 			// TODO: add a test case to cover this line
 			err = errors.Wrapf(ErrUnsupportedFieldType, "given type: Int, supported type: %s", t.stateFieldType.String())
 			return
@@ -332,8 +334,8 @@ func (t *traceSeries) getState(entityValue *v1.EntityValue) (state State, fieldS
 				v.Int.GetValue(), t.intStateSuccessVal, t.intStateErrorVal)
 			return
 		}
-	case *v1.Field_Str:
-		if t.stateFieldType != v1.FieldSpec_FIELD_TYPE_STRING {
+	case *modelv1.Field_Str:
+		if t.stateFieldType != databasev1.FieldSpec_FIELD_TYPE_STRING {
 			err = errors.Wrapf(ErrUnsupportedFieldType, "given type: String, supported type: %s", t.stateFieldType.String())
 			return
 		}
diff --git a/banyand/series/trace/write.go b/banyand/series/trace/write.go
index 1b362d1..87d202a 100644
--- a/banyand/series/trace/write.go
+++ b/banyand/series/trace/write.go
@@ -26,7 +26,9 @@ import (
 
 	"github.com/apache/skywalking-banyandb/api/common"
 	"github.com/apache/skywalking-banyandb/api/data"
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	commonv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+	modelv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
+	tracev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/trace/v1"
 	"github.com/apache/skywalking-banyandb/banyand/index"
 	bydb_bytes "github.com/apache/skywalking-banyandb/pkg/bytes"
 	"github.com/apache/skywalking-banyandb/pkg/convert"
@@ -103,15 +105,15 @@ func (t *traceSeries) Write(seriesID common.SeriesID, shardID uint, entity data.
 		fieldSpec := t.schema.Spec.GetFields()[i]
 		fieldName := fieldSpec.GetName()
 		switch x := field.ValueType.(type) {
-		case *v1.Field_Str:
+		case *modelv1.Field_Str:
 			err = multierr.Append(err, t.writeStrToIndex(shardID, id, fieldName, x.Str.GetValue()))
-		case *v1.Field_Int:
+		case *modelv1.Field_Int:
 			err = multierr.Append(err, t.writeIntToIndex(shardID, id, fieldName, x.Int.GetValue()))
-		case *v1.Field_StrArray:
+		case *modelv1.Field_StrArray:
 			for _, s := range x.StrArray.GetValue() {
 				err = multierr.Append(err, t.writeStrToIndex(shardID, id, fieldName, s))
 			}
-		case *v1.Field_IntArray:
+		case *modelv1.Field_IntArray:
 			for _, integer := range x.IntArray.GetValue() {
 				err = multierr.Append(err, t.writeIntToIndex(shardID, id, fieldName, integer))
 			}
@@ -131,7 +133,7 @@ func (t *traceSeries) writeStrToIndex(shardID uint, id common.ChunkID, name stri
 }
 
 func (t *traceSeries) writeIndex(shardID uint, id common.ChunkID, name string, value []byte) error {
-	return t.idx.Insert(*common.NewMetadata(&v1.Metadata{
+	return t.idx.Insert(*common.NewMetadata(&commonv1.Metadata{
 		Name:  t.name,
 		Group: t.group,
 	}),
@@ -145,8 +147,8 @@ func (t *traceSeries) writeIndex(shardID uint, id common.ChunkID, name string, v
 }
 
 // copyEntityValueWithoutDataBinary copies all fields without DataBinary
-func copyEntityValueWithoutDataBinary(ev *v1.EntityValue) *v1.EntityValue {
-	return &v1.EntityValue{
+func copyEntityValueWithoutDataBinary(ev *tracev1.EntityValue) *tracev1.EntityValue {
+	return &tracev1.EntityValue{
 		EntityId:   ev.GetEntityId(),
 		Timestamp:  ev.GetTimestamp(),
 		DataBinary: nil,
diff --git a/pkg/pb/database.go b/pkg/pb/database.go
index 05f80f7..614c42a 100644
--- a/pkg/pb/database.go
+++ b/pkg/pb/database.go
@@ -22,18 +22,19 @@ import (
 
 	"google.golang.org/protobuf/types/known/timestamppb"
 
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	commonv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+	databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
 )
 
 type ShardEventBuilder struct {
-	se *v1.ShardEvent
+	se *databasev1.ShardEvent
 }
 
 func NewShardEventBuilder() *ShardEventBuilder {
-	return &ShardEventBuilder{se: &v1.ShardEvent{}}
+	return &ShardEventBuilder{se: &databasev1.ShardEvent{}}
 }
 
-func (seb *ShardEventBuilder) Action(action v1.Action) *ShardEventBuilder {
+func (seb *ShardEventBuilder) Action(action databasev1.Action) *ShardEventBuilder {
 	seb.se.Action = action
 	return seb
 }
@@ -43,21 +44,21 @@ func (seb *ShardEventBuilder) Time(t time.Time) *ShardEventBuilder {
 	return seb
 }
 
-func (seb *ShardEventBuilder) Shard(shard *v1.Shard) *ShardEventBuilder {
+func (seb *ShardEventBuilder) Shard(shard *databasev1.Shard) *ShardEventBuilder {
 	seb.se.Shard = shard
 	return seb
 }
 
-func (seb *ShardEventBuilder) Build() *v1.ShardEvent {
+func (seb *ShardEventBuilder) Build() *databasev1.ShardEvent {
 	return seb.se
 }
 
 type ShardBuilder struct {
-	s *v1.Shard
+	s *databasev1.Shard
 }
 
 func NewShardBuilder() *ShardBuilder {
-	return &ShardBuilder{s: &v1.Shard{}}
+	return &ShardBuilder{s: &databasev1.Shard{}}
 }
 
 func (sb *ShardBuilder) ID(shardID uint64) *ShardBuilder {
@@ -66,14 +67,14 @@ func (sb *ShardBuilder) ID(shardID uint64) *ShardBuilder {
 }
 
 func (sb *ShardBuilder) SeriesMetadata(group, name string) *ShardBuilder {
-	sb.s.Series = &v1.Metadata{
+	sb.s.Series = &commonv1.Metadata{
 		Group: group,
 		Name:  name,
 	}
 	return sb
 }
 
-func (sb *ShardBuilder) Node(node *v1.Node) *ShardBuilder {
+func (sb *ShardBuilder) Node(node *databasev1.Node) *ShardBuilder {
 	sb.s.Node = node
 	return sb
 }
@@ -93,16 +94,16 @@ func (sb *ShardBuilder) UpdatedAt(t time.Time) *ShardBuilder {
 	return sb
 }
 
-func (sb *ShardBuilder) Build() *v1.Shard {
+func (sb *ShardBuilder) Build() *databasev1.Shard {
 	return sb.s
 }
 
 type NodeBuilder struct {
-	n *v1.Node
+	n *databasev1.Node
 }
 
 func NewNodeBuilder() *NodeBuilder {
-	return &NodeBuilder{n: &v1.Node{}}
+	return &NodeBuilder{n: &databasev1.Node{}}
 }
 
 func (nb *NodeBuilder) ID(id string) *NodeBuilder {
@@ -125,20 +126,20 @@ func (nb *NodeBuilder) CreatedAt(t time.Time) *NodeBuilder {
 	return nb
 }
 
-func (nb *NodeBuilder) Build() *v1.Node {
+func (nb *NodeBuilder) Build() *databasev1.Node {
 	return nb.n
 }
 
 type SeriesEventBuilder struct {
-	se *v1.SeriesEvent
+	se *databasev1.SeriesEvent
 }
 
 func NewSeriesEventBuilder() *SeriesEventBuilder {
-	return &SeriesEventBuilder{se: &v1.SeriesEvent{}}
+	return &SeriesEventBuilder{se: &databasev1.SeriesEvent{}}
 }
 
 func (seb *SeriesEventBuilder) SeriesMetadata(group, name string) *SeriesEventBuilder {
-	seb.se.Series = &v1.Metadata{
+	seb.se.Series = &commonv1.Metadata{
 		Group: group,
 		Name:  name,
 	}
@@ -150,7 +151,7 @@ func (seb *SeriesEventBuilder) FieldNames(names ...string) *SeriesEventBuilder {
 	return seb
 }
 
-func (seb *SeriesEventBuilder) Action(action v1.Action) *SeriesEventBuilder {
+func (seb *SeriesEventBuilder) Action(action databasev1.Action) *SeriesEventBuilder {
 	seb.se.Action = action
 	return seb
 }
@@ -160,6 +161,6 @@ func (seb *SeriesEventBuilder) Time(t time.Time) *SeriesEventBuilder {
 	return seb
 }
 
-func (seb *SeriesEventBuilder) Build() *v1.SeriesEvent {
+func (seb *SeriesEventBuilder) Build() *databasev1.SeriesEvent {
 	return seb.se
 }
diff --git a/pkg/pb/fields.go b/pkg/pb/fields.go
index 49acd9e..14b030c 100644
--- a/pkg/pb/fields.go
+++ b/pkg/pb/fields.go
@@ -18,11 +18,12 @@
 package pb
 
 import (
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	modelv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
+	tracev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/trace/v1"
 )
 
-func Transform(entityValue *v1.EntityValue, fieldIndexes []FieldEntry) []*v1.TypedPair {
-	typedPairs := make([]*v1.TypedPair, 0)
+func Transform(entityValue *tracev1.EntityValue, fieldIndexes []FieldEntry) []*modelv1.TypedPair {
+	typedPairs := make([]*modelv1.TypedPair, 0)
 	if fieldIndexes != nil {
 		// copy selected fields
 		for _, fieldIndex := range fieldIndexes {
@@ -33,15 +34,15 @@ func Transform(entityValue *v1.EntityValue, fieldIndexes []FieldEntry) []*v1.Typ
 			}
 			f := entityValue.GetFields()[idx]
 			switch v := f.GetValueType().(type) {
-			case *v1.Field_Str:
+			case *modelv1.Field_Str:
 				typedPairs = append(typedPairs, buildPair(key, v.Str.GetValue()))
-			case *v1.Field_StrArray:
+			case *modelv1.Field_StrArray:
 				typedPairs = append(typedPairs, buildPair(key, v.StrArray.GetValue()))
-			case *v1.Field_Int:
+			case *modelv1.Field_Int:
 				typedPairs = append(typedPairs, buildPair(key, v.Int.GetValue()))
-			case *v1.Field_IntArray:
+			case *modelv1.Field_IntArray:
 				typedPairs = append(typedPairs, buildPair(key, v.IntArray.GetValue()))
-			case *v1.Field_Null:
+			case *modelv1.Field_Null:
 			}
 		}
 	} else {
diff --git a/pkg/pb/query.go b/pkg/pb/query.go
index f24e99f..ffdcd49 100644
--- a/pkg/pb/query.go
+++ b/pkg/pb/query.go
@@ -22,35 +22,37 @@ import (
 
 	"google.golang.org/protobuf/types/known/timestamppb"
 
-	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/v1"
+	commonv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+	modelv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
+	tracev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/trace/v1"
 	"github.com/apache/skywalking-banyandb/pkg/convert"
 )
 
 var (
-	binaryOpsMap = map[string]v1.PairQuery_BinaryOp{
-		"=":          v1.PairQuery_BINARY_OP_EQ,
-		"!=":         v1.PairQuery_BINARY_OP_NE,
-		">":          v1.PairQuery_BINARY_OP_GT,
-		">=":         v1.PairQuery_BINARY_OP_GE,
... 930 lines suppressed ...