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/09/30 13:11:02 UTC

[skywalking-banyandb] 01/01: Revert v2 api

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

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

commit a30d5ad9c194f0bfce46f2b64df3217d420879d3
Author: Gao Hongtao <ha...@gmail.com>
AuthorDate: Thu Sep 30 21:08:14 2021 +0800

    Revert v2 api
    
    Signed-off-by: Gao Hongtao <ha...@gmail.com>
---
 .github/workflows/go.yml                           |   12 +-
 .github/workflows/publish-docker.yml               |    4 +-
 api/proto/banyandb/common/v1/common.pb.go          |   89 +-
 api/proto/banyandb/common/v1/common.proto          |    7 +
 api/proto/banyandb/common/v2/common.pb.go          |  245 -----
 api/proto/banyandb/common/v2/common.proto          |   38 -
 api/proto/banyandb/database/v1/database.pb.go      |   92 +-
 api/proto/banyandb/database/v1/database.proto      |   11 +-
 api/proto/banyandb/database/v1/event.pb.go         |  285 ++---
 api/proto/banyandb/database/v1/event.proto         |   23 +-
 api/proto/banyandb/database/v1/schema.pb.go        |  998 +++++++----------
 api/proto/banyandb/database/v1/schema.proto        |  165 +--
 api/proto/banyandb/database/v2/database.pb.go      |  346 ------
 api/proto/banyandb/database/v2/database.proto      |   43 -
 api/proto/banyandb/database/v2/event.pb.go         |  445 --------
 api/proto/banyandb/database/v2/event.proto         |   51 -
 api/proto/banyandb/database/v2/schema.pb.go        | 1117 --------------------
 api/proto/banyandb/database/v2/schema.proto        |  133 ---
 api/proto/banyandb/model/v1/common.pb.go           |  305 +++++-
 api/proto/banyandb/model/v1/common.proto           |   17 +
 api/proto/banyandb/model/v1/query.pb.go            |  534 +++++-----
 api/proto/banyandb/model/v1/query.proto            |   43 +-
 api/proto/banyandb/model/v1/write.pb.go            |  280 -----
 api/proto/banyandb/model/v1/write.proto            |   36 -
 api/proto/banyandb/model/v2/common.pb.go           |  604 -----------
 api/proto/banyandb/model/v2/common.proto           |   56 -
 api/proto/banyandb/model/v2/query.pb.go            |  791 --------------
 api/proto/banyandb/model/v2/query.proto            |   93 --
 api/proto/banyandb/stream/{v2 => v1}/query.pb.go   |  176 +--
 api/proto/banyandb/stream/{v2 => v1}/query.proto   |   22 +-
 api/proto/banyandb/stream/{v2 => v1}/rpc.pb.go     |   72 +-
 api/proto/banyandb/stream/{v2 => v1}/rpc.proto     |   14 +-
 .../banyandb/stream/{v2 => v1}/rpc_grpc.pb.go      |   12 +-
 api/proto/banyandb/stream/{v2 => v1}/write.pb.go   |  136 +--
 api/proto/banyandb/stream/{v2 => v1}/write.proto   |   14 +-
 api/proto/banyandb/trace/v1/query.pb.go            |  449 --------
 api/proto/banyandb/trace/v1/query.proto            |   77 --
 api/proto/banyandb/trace/v1/rpc.pb.go              |  113 --
 api/proto/banyandb/trace/v1/rpc.proto              |   31 -
 api/proto/banyandb/trace/v1/rpc_grpc.pb.go         |  171 ---
 api/proto/banyandb/trace/v1/write.pb.go            |  357 -------
 api/proto/banyandb/trace/v1/write.proto            |   52 -
 banyand/internal/cmd/standalone.go                 |    2 +-
 banyand/liaison/grpc/discovery.go                  |   24 +-
 banyand/liaison/grpc/server.go                     |    6 +-
 banyand/liaison/grpc/stream.go                     |   14 +-
 banyand/liaison/grpc/stream_test.go                |   24 +-
 banyand/metadata/metadata.go                       |   14 +-
 banyand/metadata/metadata_test.go                  |   20 +-
 banyand/metadata/schema/schema.go                  |   16 +-
 banyand/metadata/schema/sw.go                      |   34 +-
 banyand/metadata/schema/sw_test.go                 |    8 +-
 banyand/query/{v2 => }/processor.go                |    8 +-
 banyand/query/{v2 => }/processor_test.go           |   60 +-
 banyand/query/{v2 => }/query.go                    |    2 +-
 .../query}/testdata/global_index.json              |    0
 .../query}/testdata/multiple_shards.json           |    0
 banyand/stream/index.go                            |   22 +-
 banyand/stream/service.go                          |   26 +-
 banyand/stream/stream.go                           |   44 +-
 banyand/stream/stream_query.go                     |   28 +-
 banyand/stream/stream_query_test.go                |  102 +-
 banyand/stream/stream_write.go                     |   17 +-
 banyand/stream/stream_write_test.go                |   40 +-
 banyand/tsdb/block.go                              |    4 +-
 banyand/tsdb/series_seek.go                        |   20 +-
 banyand/tsdb/series_seek_filter.go                 |   12 +-
 banyand/tsdb/series_seek_sort.go                   |   18 +-
 banyand/tsdb/tsdb.go                               |    4 +-
 pkg/index/index.go                                 |    4 +-
 pkg/index/inverted/inverted.go                     |   10 +-
 pkg/index/inverted/mem.go                          |    8 +-
 pkg/index/iterator.go                              |   10 +-
 pkg/index/lsm/search.go                            |    6 +-
 pkg/index/testcases/duration.go                    |   32 +-
 pkg/index/tree.go                                  |   30 +-
 pkg/partition/entity.go                            |   12 +-
 pkg/pb/v1/database.go                              |  166 ---
 pkg/pb/v1/fields.go                                |   69 --
 pkg/pb/v1/query.go                                 |  178 ++--
 pkg/pb/v1/write.go                                 |  163 ++-
 pkg/pb/v2/query.go                                 |  222 ----
 pkg/pb/v2/write.go                                 |  134 ---
 pkg/query/{v2 => }/executor/interface.go           |    4 +-
 pkg/query/{v2 => }/logical/analyzer.go             |   20 +-
 pkg/query/{v2 => }/logical/analyzer_test.go        |   64 +-
 pkg/query/{v2 => }/logical/common.go               |   16 +-
 pkg/query/{v2 => }/logical/common_test.go          |   18 +-
 pkg/query/{v2 => }/logical/expr.go                 |   44 +-
 pkg/query/{v2 => }/logical/expr_literal.go         |   18 +-
 pkg/query/{v2 => }/logical/format.go               |    0
 pkg/query/{v2 => }/logical/interface.go            |    6 +-
 pkg/query/{v2 => }/logical/iter.go                 |    0
 pkg/query/{v2 => }/logical/plan.go                 |   10 +-
 pkg/query/{v2 => }/logical/plan_execution_test.go  |  108 +-
 .../{v2 => }/logical/plan_indexscan_global.go      |   22 +-
 pkg/query/{v2 => }/logical/plan_indexscan_local.go |   32 +-
 pkg/query/{v2 => }/logical/plan_orderby.go         |   50 +-
 pkg/query/{v2 => }/logical/schema.go               |   18 +-
 .../query/logical}/testdata/global_index.json      |    0
 .../query/logical}/testdata/multiple_shards.json   |    0
 101 files changed, 2187 insertions(+), 8415 deletions(-)

diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml
index fd9b26b..ac0b721 100644
--- a/.github/workflows/go.yml
+++ b/.github/workflows/go.yml
@@ -28,13 +28,13 @@ jobs:
     runs-on: ubuntu-20.04
     steps:
       - name: Install Go
-        uses: actions/setup-go@v2
+        uses: actions/setup-go@v1
         with:
           go-version: 1.16
       - name: Install goimports
         run: go install golang.org/x/tools/cmd/goimports@latest
       - name: Check out code into the Go module directory
-        uses: actions/checkout@v2
+        uses: actions/checkout@v1
       - name: Check License Header
         uses: apache/skywalking-eyes@5c90c9698806040f50671a172a7cac17974ecebd
       - name: Update dependencies
@@ -50,11 +50,11 @@ jobs:
     runs-on: ubuntu-20.04
     steps:
       - name: Install Go
-        uses: actions/setup-go@v2
+        uses: actions/setup-go@v1
         with:
           go-version: 1.16
       - name: Check out code into the Go module directory
-        uses: actions/checkout@v2
+        uses: actions/checkout@v1
       - name: Update dependencies 
         run: GOPROXY=https://proxy.golang.org go mod download
       - name: Build
@@ -66,11 +66,11 @@ jobs:
     runs-on: ubuntu-20.04
     steps:
       - name: Install Go
-        uses: actions/setup-go@v2
+        uses: actions/setup-go@v1
         with:
           go-version: 1.16
       - name: Check out code into the Go module directory
-        uses: actions/checkout@v2
+        uses: actions/checkout@v1
       - name: Update dependencies
         run: GOPROXY=https://proxy.golang.org go mod download
       - name: Test
diff --git a/.github/workflows/publish-docker.yml b/.github/workflows/publish-docker.yml
index bc39cd7..cdbfa2f 100644
--- a/.github/workflows/publish-docker.yml
+++ b/.github/workflows/publish-docker.yml
@@ -39,13 +39,13 @@ jobs:
       TAG: ${{ github.sha }}
     steps:
       - name: Install Go
-        uses: actions/setup-go@v2
+        uses: actions/setup-go@v1
         with:
           go-version: 1.16
       - name: Install goimports
         run: go install golang.org/x/tools/cmd/goimports@latest
       - name: Check out code into the Go module directory
-        uses: actions/checkout@v2
+        uses: actions/checkout@v1
       - name: Update dependencies 
         run: GOPROXY=https://proxy.golang.org go mod download
       - name: Generate codes
diff --git a/api/proto/banyandb/common/v1/common.pb.go b/api/proto/banyandb/common/v1/common.pb.go
index ed6aa71..8ff5f46 100644
--- a/api/proto/banyandb/common/v1/common.pb.go
+++ b/api/proto/banyandb/common/v1/common.pb.go
@@ -38,6 +38,55 @@ const (
 	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 )
 
+type Catalog int32
+
+const (
+	Catalog_CATALOG_UNSPECIFIED Catalog = 0
+	Catalog_CATALOG_STREAM      Catalog = 1
+	Catalog_CATALOG_MEASURE     Catalog = 2
+)
+
+// Enum value maps for Catalog.
+var (
+	Catalog_name = map[int32]string{
+		0: "CATALOG_UNSPECIFIED",
+		1: "CATALOG_STREAM",
+		2: "CATALOG_MEASURE",
+	}
+	Catalog_value = map[string]int32{
+		"CATALOG_UNSPECIFIED": 0,
+		"CATALOG_STREAM":      1,
+		"CATALOG_MEASURE":     2,
+	}
+)
+
+func (x Catalog) Enum() *Catalog {
+	p := new(Catalog)
+	*p = x
+	return p
+}
+
+func (x Catalog) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Catalog) Descriptor() protoreflect.EnumDescriptor {
+	return file_banyandb_common_v1_common_proto_enumTypes[0].Descriptor()
+}
+
+func (Catalog) Type() protoreflect.EnumType {
+	return &file_banyandb_common_v1_common_proto_enumTypes[0]
+}
+
+func (x Catalog) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Catalog.Descriptor instead.
+func (Catalog) EnumDescriptor() ([]byte, []int) {
+	return file_banyandb_common_v1_common_proto_rawDescGZIP(), []int{0}
+}
+
 // Metadata is for multi-tenant, multi-model use
 type Metadata struct {
 	state         protoimpl.MessageState
@@ -48,6 +97,7 @@ type Metadata struct {
 	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"`
+	Id   uint32 `protobuf:"varint,3,opt,name=id,proto3" json:"id,omitempty"`
 }
 
 func (x *Metadata) Reset() {
@@ -96,24 +146,36 @@ func (x *Metadata) GetName() string {
 	return ""
 }
 
+func (x *Metadata) GetId() uint32 {
+	if x != nil {
+		return x.Id
+	}
+	return 0
+}
+
 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,
+	0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x22, 0x44, 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,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69,
+	0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x2a, 0x4b, 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,
+	0x12, 0x0a, 0x0e, 0x43, 0x41, 0x54, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41,
+	0x4d, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x54, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x4d,
+	0x45, 0x41, 0x53, 0x55, 0x52, 0x45, 0x10, 0x02, 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 (
@@ -128,9 +190,11 @@ func file_banyandb_common_v1_common_proto_rawDescGZIP() []byte {
 	return file_banyandb_common_v1_common_proto_rawDescData
 }
 
+var file_banyandb_common_v1_common_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
 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
+	(Catalog)(0),     // 0: banyandb.common.v1.Catalog
+	(*Metadata)(nil), // 1: banyandb.common.v1.Metadata
 }
 var file_banyandb_common_v1_common_proto_depIdxs = []int32{
 	0, // [0:0] is the sub-list for method output_type
@@ -164,13 +228,14 @@ func file_banyandb_common_v1_common_proto_init() {
 		File: protoimpl.DescBuilder{
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_banyandb_common_v1_common_proto_rawDesc,
-			NumEnums:      0,
+			NumEnums:      1,
 			NumMessages:   1,
 			NumExtensions: 0,
 			NumServices:   0,
 		},
 		GoTypes:           file_banyandb_common_v1_common_proto_goTypes,
 		DependencyIndexes: file_banyandb_common_v1_common_proto_depIdxs,
+		EnumInfos:         file_banyandb_common_v1_common_proto_enumTypes,
 		MessageInfos:      file_banyandb_common_v1_common_proto_msgTypes,
 	}.Build()
 	File_banyandb_common_v1_common_proto = out.File
diff --git a/api/proto/banyandb/common/v1/common.proto b/api/proto/banyandb/common/v1/common.proto
index d7060f3..cbf1bd1 100644
--- a/api/proto/banyandb/common/v1/common.proto
+++ b/api/proto/banyandb/common/v1/common.proto
@@ -22,10 +22,17 @@ option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/co
 
 package banyandb.common.v1;
 
+enum Catalog {
+    CATALOG_UNSPECIFIED = 0;
+    CATALOG_STREAM = 1;
+    CATALOG_MEASURE = 2;
+}
+
 // 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;
+    uint32 id = 3;
 }
diff --git a/api/proto/banyandb/common/v2/common.pb.go b/api/proto/banyandb/common/v2/common.pb.go
deleted file mode 100644
index 232783c..0000000
--- a/api/proto/banyandb/common/v2/common.pb.go
+++ /dev/null
@@ -1,245 +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/common/v2/common.proto
-
-package v2
-
-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)
-)
-
-type Catalog int32
-
-const (
-	Catalog_CATALOG_UNSPECIFIED Catalog = 0
-	Catalog_CATALOG_STREAM      Catalog = 1
-	Catalog_CATALOG_MEASURE     Catalog = 2
-)
-
-// Enum value maps for Catalog.
-var (
-	Catalog_name = map[int32]string{
-		0: "CATALOG_UNSPECIFIED",
-		1: "CATALOG_STREAM",
-		2: "CATALOG_MEASURE",
-	}
-	Catalog_value = map[string]int32{
-		"CATALOG_UNSPECIFIED": 0,
-		"CATALOG_STREAM":      1,
-		"CATALOG_MEASURE":     2,
-	}
-)
-
-func (x Catalog) Enum() *Catalog {
-	p := new(Catalog)
-	*p = x
-	return p
-}
-
-func (x Catalog) String() string {
-	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
-}
-
-func (Catalog) Descriptor() protoreflect.EnumDescriptor {
-	return file_banyandb_common_v2_common_proto_enumTypes[0].Descriptor()
-}
-
-func (Catalog) Type() protoreflect.EnumType {
-	return &file_banyandb_common_v2_common_proto_enumTypes[0]
-}
-
-func (x Catalog) Number() protoreflect.EnumNumber {
-	return protoreflect.EnumNumber(x)
-}
-
-// Deprecated: Use Catalog.Descriptor instead.
-func (Catalog) EnumDescriptor() ([]byte, []int) {
-	return file_banyandb_common_v2_common_proto_rawDescGZIP(), []int{0}
-}
-
-// 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"`
-	Id   uint32 `protobuf:"varint,3,opt,name=id,proto3" json:"id,omitempty"`
-}
-
-func (x *Metadata) Reset() {
-	*x = Metadata{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_common_v2_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_v2_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_v2_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 ""
-}
-
-func (x *Metadata) GetId() uint32 {
-	if x != nil {
-		return x.Id
-	}
-	return 0
-}
-
-var File_banyandb_common_v2_common_proto protoreflect.FileDescriptor
-
-var file_banyandb_common_v2_common_proto_rawDesc = []byte{
-	0x0a, 0x1f, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
-	0x6e, 0x2f, 0x76, 0x32, 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, 0x32, 0x22, 0x44, 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, 0x12, 0x0e, 0x0a, 0x02, 0x69,
-	0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x2a, 0x4b, 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,
-	0x12, 0x0a, 0x0e, 0x43, 0x41, 0x54, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41,
-	0x4d, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x54, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x4d,
-	0x45, 0x41, 0x53, 0x55, 0x52, 0x45, 0x10, 0x02, 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, 0x32, 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, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
-}
-
-var (
-	file_banyandb_common_v2_common_proto_rawDescOnce sync.Once
-	file_banyandb_common_v2_common_proto_rawDescData = file_banyandb_common_v2_common_proto_rawDesc
-)
-
-func file_banyandb_common_v2_common_proto_rawDescGZIP() []byte {
-	file_banyandb_common_v2_common_proto_rawDescOnce.Do(func() {
-		file_banyandb_common_v2_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_common_v2_common_proto_rawDescData)
-	})
-	return file_banyandb_common_v2_common_proto_rawDescData
-}
-
-var file_banyandb_common_v2_common_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_banyandb_common_v2_common_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
-var file_banyandb_common_v2_common_proto_goTypes = []interface{}{
-	(Catalog)(0),     // 0: banyandb.common.v2.Catalog
-	(*Metadata)(nil), // 1: banyandb.common.v2.Metadata
-}
-var file_banyandb_common_v2_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_v2_common_proto_init() }
-func file_banyandb_common_v2_common_proto_init() {
-	if File_banyandb_common_v2_common_proto != nil {
-		return
-	}
-	if !protoimpl.UnsafeEnabled {
-		file_banyandb_common_v2_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_v2_common_proto_rawDesc,
-			NumEnums:      1,
-			NumMessages:   1,
-			NumExtensions: 0,
-			NumServices:   0,
-		},
-		GoTypes:           file_banyandb_common_v2_common_proto_goTypes,
-		DependencyIndexes: file_banyandb_common_v2_common_proto_depIdxs,
-		EnumInfos:         file_banyandb_common_v2_common_proto_enumTypes,
-		MessageInfos:      file_banyandb_common_v2_common_proto_msgTypes,
-	}.Build()
-	File_banyandb_common_v2_common_proto = out.File
-	file_banyandb_common_v2_common_proto_rawDesc = nil
-	file_banyandb_common_v2_common_proto_goTypes = nil
-	file_banyandb_common_v2_common_proto_depIdxs = nil
-}
diff --git a/api/proto/banyandb/common/v2/common.proto b/api/proto/banyandb/common/v2/common.proto
deleted file mode 100644
index 5461978..0000000
--- a/api/proto/banyandb/common/v2/common.proto
+++ /dev/null
@@ -1,38 +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.common.v2";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v2";
-
-package banyandb.common.v2;
-
-enum Catalog {
-    CATALOG_UNSPECIFIED = 0;
-    CATALOG_STREAM = 1;
-    CATALOG_MEASURE = 2;
-}
-
-// 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;
-    uint32 id = 3;
-}
diff --git a/api/proto/banyandb/database/v1/database.pb.go b/api/proto/banyandb/database/v1/database.pb.go
index 3720d45..f24efd4 100644
--- a/api/proto/banyandb/database/v1/database.pb.go
+++ b/api/proto/banyandb/database/v1/database.pb.go
@@ -118,11 +118,12 @@ type Shard struct {
 	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"`
+	Metadata  *v1.Metadata           `protobuf:"bytes,2,opt,name=metadata,proto3" json:"metadata,omitempty"`
+	Catalog   v1.Catalog             `protobuf:"varint,3,opt,name=catalog,proto3,enum=banyandb.common.v1.Catalog" json:"catalog,omitempty"`
+	Node      *Node                  `protobuf:"bytes,4,opt,name=node,proto3" json:"node,omitempty"`
+	Total     uint32                 `protobuf:"varint,5,opt,name=total,proto3" json:"total,omitempty"`
+	UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`
+	CreatedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
 }
 
 func (x *Shard) Reset() {
@@ -164,13 +165,20 @@ func (x *Shard) GetId() uint64 {
 	return 0
 }
 
-func (x *Shard) GetSeries() *v1.Metadata {
+func (x *Shard) GetMetadata() *v1.Metadata {
 	if x != nil {
-		return x.Series
+		return x.Metadata
 	}
 	return nil
 }
 
+func (x *Shard) GetCatalog() v1.Catalog {
+	if x != nil {
+		return x.Catalog
+	}
+	return v1.Catalog(0)
+}
+
 func (x *Shard) GetNode() *Node {
 	if x != nil {
 		return x.Node
@@ -220,31 +228,35 @@ var file_banyandb_database_v1_database_proto_rawDesc = []byte{
 	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,
+	0x22, 0xc4, 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, 0x38, 0x0a, 0x08, 0x6d, 0x65,
+	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x08, 0x6d, 0x65, 0x74, 0x61,
+	0x64, 0x61, 0x74, 0x61, 0x12, 0x35, 0x0a, 0x07, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62,
+	0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x61, 0x6c,
+	0x6f, 0x67, 0x52, 0x07, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x12, 0x2e, 0x0a, 0x04, 0x6e,
+	0x6f, 0x64, 0x65, 0x18, 0x04, 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, 0x05, 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,
 	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,
+	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, 0x07, 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 (
@@ -265,19 +277,21 @@ var file_banyandb_database_v1_database_proto_goTypes = []interface{}{
 	(*Shard)(nil),                 // 1: banyandb.database.v1.Shard
 	(*timestamppb.Timestamp)(nil), // 2: google.protobuf.Timestamp
 	(*v1.Metadata)(nil),           // 3: banyandb.common.v1.Metadata
+	(v1.Catalog)(0),               // 4: banyandb.common.v1.Catalog
 }
 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
+	3, // 2: banyandb.database.v1.Shard.metadata:type_name -> banyandb.common.v1.Metadata
+	4, // 3: banyandb.database.v1.Shard.catalog:type_name -> banyandb.common.v1.Catalog
+	0, // 4: banyandb.database.v1.Shard.node:type_name -> banyandb.database.v1.Node
+	2, // 5: banyandb.database.v1.Shard.updated_at:type_name -> google.protobuf.Timestamp
+	2, // 6: banyandb.database.v1.Shard.created_at: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_database_v1_database_proto_init() }
diff --git a/api/proto/banyandb/database/v1/database.proto b/api/proto/banyandb/database/v1/database.proto
index 2d26c9d..82a1b58 100644
--- a/api/proto/banyandb/database/v1/database.proto
+++ b/api/proto/banyandb/database/v1/database.proto
@@ -34,9 +34,10 @@ message Node {
 
 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;
+    common.v1.Metadata metadata = 2;
+    common.v1.Catalog catalog = 3;
+    Node node = 4;
+    uint32 total = 5;
+    google.protobuf.Timestamp updated_at = 6;
+    google.protobuf.Timestamp created_at = 7;
 }
diff --git a/api/proto/banyandb/database/v1/event.pb.go b/api/proto/banyandb/database/v1/event.pb.go
index 9341bb9..e3f2836 100644
--- a/api/proto/banyandb/database/v1/event.pb.go
+++ b/api/proto/banyandb/database/v1/event.pb.go
@@ -153,19 +153,19 @@ func (x *ShardEvent) GetTime() *timestamppb.Timestamp {
 	return nil
 }
 
-type SeriesEvent struct {
+type EntityEvent 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"`
+	Subject       *v1.Metadata              `protobuf:"bytes,1,opt,name=subject,proto3" json:"subject,omitempty"`
+	EntityLocator []*EntityEvent_TagLocator `protobuf:"bytes,2,rep,name=entity_locator,json=entityLocator,proto3" json:"entity_locator,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{}
+func (x *EntityEvent) Reset() {
+	*x = EntityEvent{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_banyandb_database_v1_event_proto_msgTypes[1]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -173,13 +173,13 @@ func (x *SeriesEvent) Reset() {
 	}
 }
 
-func (x *SeriesEvent) String() string {
+func (x *EntityEvent) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*SeriesEvent) ProtoMessage() {}
+func (*EntityEvent) ProtoMessage() {}
 
-func (x *SeriesEvent) ProtoReflect() protoreflect.Message {
+func (x *EntityEvent) ProtoReflect() protoreflect.Message {
 	mi := &file_banyandb_database_v1_event_proto_msgTypes[1]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -191,52 +191,50 @@ func (x *SeriesEvent) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use SeriesEvent.ProtoReflect.Descriptor instead.
-func (*SeriesEvent) Descriptor() ([]byte, []int) {
+// Deprecated: Use EntityEvent.ProtoReflect.Descriptor instead.
+func (*EntityEvent) Descriptor() ([]byte, []int) {
 	return file_banyandb_database_v1_event_proto_rawDescGZIP(), []int{1}
 }
 
-func (x *SeriesEvent) GetSeries() *v1.Metadata {
+func (x *EntityEvent) GetSubject() *v1.Metadata {
 	if x != nil {
-		return x.Series
+		return x.Subject
 	}
 	return nil
 }
 
-func (x *SeriesEvent) GetFieldNamesCompositeSeriesId() []string {
+func (x *EntityEvent) GetEntityLocator() []*EntityEvent_TagLocator {
 	if x != nil {
-		return x.FieldNamesCompositeSeriesId
+		return x.EntityLocator
 	}
 	return nil
 }
 
-func (x *SeriesEvent) GetAction() Action {
+func (x *EntityEvent) GetAction() Action {
 	if x != nil {
 		return x.Action
 	}
 	return Action_ACTION_UNSPECIFIED
 }
 
-func (x *SeriesEvent) GetTime() *timestamppb.Timestamp {
+func (x *EntityEvent) GetTime() *timestamppb.Timestamp {
 	if x != nil {
 		return x.Time
 	}
 	return nil
 }
 
-type IndexRuleEvent struct {
+type EntityEvent_TagLocator 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"`
+	FamilyOffset uint32 `protobuf:"varint,1,opt,name=family_offset,json=familyOffset,proto3" json:"family_offset,omitempty"`
+	TagOffset    uint32 `protobuf:"varint,2,opt,name=tag_offset,json=tagOffset,proto3" json:"tag_offset,omitempty"`
 }
 
-func (x *IndexRuleEvent) Reset() {
-	*x = IndexRuleEvent{}
+func (x *EntityEvent_TagLocator) Reset() {
+	*x = EntityEvent_TagLocator{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_banyandb_database_v1_event_proto_msgTypes[2]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -244,13 +242,13 @@ func (x *IndexRuleEvent) Reset() {
 	}
 }
 
-func (x *IndexRuleEvent) String() string {
+func (x *EntityEvent_TagLocator) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*IndexRuleEvent) ProtoMessage() {}
+func (*EntityEvent_TagLocator) ProtoMessage() {}
 
-func (x *IndexRuleEvent) ProtoReflect() protoreflect.Message {
+func (x *EntityEvent_TagLocator) ProtoReflect() protoreflect.Message {
 	mi := &file_banyandb_database_v1_event_proto_msgTypes[2]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -262,92 +260,23 @@ func (x *IndexRuleEvent) ProtoReflect() protoreflect.Message {
 	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}
+// Deprecated: Use EntityEvent_TagLocator.ProtoReflect.Descriptor instead.
+func (*EntityEvent_TagLocator) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_event_proto_rawDescGZIP(), []int{1, 0}
 }
 
-func (x *IndexRuleEvent) GetSeries() *v1.Metadata {
+func (x *EntityEvent_TagLocator) GetFamilyOffset() uint32 {
 	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 x.FamilyOffset
 	}
 	return 0
 }
 
-func (x *IndexRuleEvent_ShardedIndexRule) GetRules() []*IndexRule {
+func (x *EntityEvent_TagLocator) GetTagOffset() uint32 {
 	if x != nil {
-		return x.Rules
+		return x.TagOffset
 	}
-	return nil
+	return 0
 }
 
 var File_banyandb_database_v1_event_proto protoreflect.FileDescriptor
@@ -375,56 +304,40 @@ var file_banyandb_database_v1_event_proto_rawDesc = []byte{
 	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,
+	0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xd2, 0x02, 0x0a, 0x0b, 0x45,
+	0x6e, 0x74, 0x69, 0x74, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x07, 0x73, 0x75,
+	0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65,
+	0x63, 0x74, 0x12, 0x53, 0x0a, 0x0e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6c, 0x6f, 0x63,
+	0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 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,
+	0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x61,
+	0x67, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+	0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 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, 0x1a, 0x50, 0x0a,
+	0x0a, 0x54, 0x61, 0x67, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x66,
+	0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0d, 0x52, 0x0c, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74,
+	0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x67, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x74, 0x61, 0x67, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 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 (
@@ -440,35 +353,29 @@ func file_banyandb_database_v1_event_proto_rawDescGZIP() []byte {
 }
 
 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_msgTypes = make([]protoimpl.MessageInfo, 3)
 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
+	(Action)(0),                    // 0: banyandb.database.v1.Action
+	(*ShardEvent)(nil),             // 1: banyandb.database.v1.ShardEvent
+	(*EntityEvent)(nil),            // 2: banyandb.database.v1.EntityEvent
+	(*EntityEvent_TagLocator)(nil), // 3: banyandb.database.v1.EntityEvent.TagLocator
+	(*Shard)(nil),                  // 4: banyandb.database.v1.Shard
+	(*timestamppb.Timestamp)(nil),  // 5: google.protobuf.Timestamp
+	(*v1.Metadata)(nil),            // 6: banyandb.common.v1.Metadata
 }
 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
+	4, // 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
+	5, // 2: banyandb.database.v1.ShardEvent.time:type_name -> google.protobuf.Timestamp
+	6, // 3: banyandb.database.v1.EntityEvent.subject:type_name -> banyandb.common.v1.Metadata
+	3, // 4: banyandb.database.v1.EntityEvent.entity_locator:type_name -> banyandb.database.v1.EntityEvent.TagLocator
+	0, // 5: banyandb.database.v1.EntityEvent.action:type_name -> banyandb.database.v1.Action
+	5, // 6: banyandb.database.v1.EntityEvent.time: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_database_v1_event_proto_init() }
@@ -492,7 +399,7 @@ func file_banyandb_database_v1_event_proto_init() {
 			}
 		}
 		file_banyandb_database_v1_event_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SeriesEvent); i {
+			switch v := v.(*EntityEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -504,19 +411,7 @@ func file_banyandb_database_v1_event_proto_init() {
 			}
 		}
 		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 {
+			switch v := v.(*EntityEvent_TagLocator); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -534,7 +429,7 @@ func file_banyandb_database_v1_event_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_banyandb_database_v1_event_proto_rawDesc,
 			NumEnums:      1,
-			NumMessages:   4,
+			NumMessages:   3,
 			NumExtensions: 0,
 			NumServices:   0,
 		},
diff --git a/api/proto/banyandb/database/v1/event.proto b/api/proto/banyandb/database/v1/event.proto
index 1a9bd21..3f35ee7 100644
--- a/api/proto/banyandb/database/v1/event.proto
+++ b/api/proto/banyandb/database/v1/event.proto
@@ -39,20 +39,13 @@ message ShardEvent {
     google.protobuf.Timestamp time = 3;
 }
 
-message SeriesEvent {
-    common.v1.Metadata series = 1;
-    repeated string field_names_composite_series_id = 2;
-    Action action = 3;
-    google.protobuf.Timestamp time = 4;
-}
-
-message IndexRuleEvent {
-    common.v1.Metadata series = 1;
-    message ShardedIndexRule {
-        uint64 shard_id = 1;
-        repeated IndexRule rules  = 2;
+message EntityEvent {
+    common.v1.Metadata subject = 1; 
+    message TagLocator {
+        uint32 family_offset = 1;
+        uint32 tag_offset = 2;
     }
-    repeated ShardedIndexRule rules = 2;
-    Action action = 4;
-    google.protobuf.Timestamp time = 5;
+    repeated TagLocator entity_locator = 2;
+    Action action = 3;
+    google.protobuf.Timestamp time = 4; 
 }
diff --git a/api/proto/banyandb/database/v1/schema.pb.go b/api/proto/banyandb/database/v1/schema.pb.go
index 61700a0..0ce648e 100644
--- a/api/proto/banyandb/database/v1/schema.pb.go
+++ b/api/proto/banyandb/database/v1/schema.pb.go
@@ -41,58 +41,61 @@ const (
 	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 )
 
-type FieldType int32
+type TagType int32
 
 const (
-	FieldType_FIELD_TYPE_UNSPECIFIED  FieldType = 0
-	FieldType_FIELD_TYPE_STRING       FieldType = 1
-	FieldType_FIELD_TYPE_INT          FieldType = 2
-	FieldType_FIELD_TYPE_STRING_ARRAY FieldType = 3
-	FieldType_FIELD_TYPE_INT_ARRAY    FieldType = 4
+	TagType_TAG_TYPE_UNSPECIFIED  TagType = 0
+	TagType_TAG_TYPE_STRING       TagType = 1
+	TagType_TAG_TYPE_INT          TagType = 2
+	TagType_TAG_TYPE_STRING_ARRAY TagType = 3
+	TagType_TAG_TYPE_INT_ARRAY    TagType = 4
+	TagType_TAG_TYPE_DATA_BINARY  TagType = 5
 )
 
-// Enum value maps for FieldType.
+// Enum value maps for TagType.
 var (
-	FieldType_name = map[int32]string{
-		0: "FIELD_TYPE_UNSPECIFIED",
-		1: "FIELD_TYPE_STRING",
-		2: "FIELD_TYPE_INT",
-		3: "FIELD_TYPE_STRING_ARRAY",
-		4: "FIELD_TYPE_INT_ARRAY",
+	TagType_name = map[int32]string{
+		0: "TAG_TYPE_UNSPECIFIED",
+		1: "TAG_TYPE_STRING",
+		2: "TAG_TYPE_INT",
+		3: "TAG_TYPE_STRING_ARRAY",
+		4: "TAG_TYPE_INT_ARRAY",
+		5: "TAG_TYPE_DATA_BINARY",
 	}
-	FieldType_value = map[string]int32{
-		"FIELD_TYPE_UNSPECIFIED":  0,
-		"FIELD_TYPE_STRING":       1,
-		"FIELD_TYPE_INT":          2,
-		"FIELD_TYPE_STRING_ARRAY": 3,
-		"FIELD_TYPE_INT_ARRAY":    4,
+	TagType_value = map[string]int32{
+		"TAG_TYPE_UNSPECIFIED":  0,
+		"TAG_TYPE_STRING":       1,
+		"TAG_TYPE_INT":          2,
+		"TAG_TYPE_STRING_ARRAY": 3,
+		"TAG_TYPE_INT_ARRAY":    4,
+		"TAG_TYPE_DATA_BINARY":  5,
 	}
 )
 
-func (x FieldType) Enum() *FieldType {
-	p := new(FieldType)
+func (x TagType) Enum() *TagType {
+	p := new(TagType)
 	*p = x
 	return p
 }
 
-func (x FieldType) String() string {
+func (x TagType) String() string {
 	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (FieldType) Descriptor() protoreflect.EnumDescriptor {
+func (TagType) Descriptor() protoreflect.EnumDescriptor {
 	return file_banyandb_database_v1_schema_proto_enumTypes[0].Descriptor()
 }
 
-func (FieldType) Type() protoreflect.EnumType {
+func (TagType) Type() protoreflect.EnumType {
 	return &file_banyandb_database_v1_schema_proto_enumTypes[0]
 }
 
-func (x FieldType) Number() protoreflect.EnumNumber {
+func (x TagType) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
 
-// Deprecated: Use FieldType.Descriptor instead.
-func (FieldType) EnumDescriptor() ([]byte, []int) {
+// Deprecated: Use TagType.Descriptor instead.
+func (TagType) EnumDescriptor() ([]byte, []int) {
 	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{0}
 }
 
@@ -148,178 +151,106 @@ func (x Duration_DurationUnit) Number() protoreflect.EnumNumber {
 
 // Deprecated: Use Duration_DurationUnit.Descriptor instead.
 func (Duration_DurationUnit) EnumDescriptor() ([]byte, []int) {
-	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{1, 0}
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{0, 0}
 }
 
-// IndexType determine the index structure under the hood
-// Fields with SeriesInternal type is reserved by Series module, would not be indexed by Index module.
-type IndexObject_IndexType int32
+// Type determine the index structure under the hood
+type IndexRule_Type int32
 
 const (
-	IndexObject_INDEX_TYPE_UNSPECIFIED     IndexObject_IndexType = 0
-	IndexObject_INDEX_TYPE_TEXT            IndexObject_IndexType = 1
-	IndexObject_INDEX_TYPE_NUMERICAL       IndexObject_IndexType = 2
-	IndexObject_INDEX_TYPE_ID              IndexObject_IndexType = 3
-	IndexObject_INDEX_TYPE_MULTI_TEXT      IndexObject_IndexType = 4
-	IndexObject_INDEX_TYPE_MULTI_NUMERICAL IndexObject_IndexType = 5
-	IndexObject_INDEX_TYPE_SERIES_INTERNAL IndexObject_IndexType = 6
+	IndexRule_TYPE_UNSPECIFIED IndexRule_Type = 0
+	IndexRule_TYPE_TREE        IndexRule_Type = 1
+	IndexRule_TYPE_INVERTED    IndexRule_Type = 2
 )
 
-// Enum value maps for IndexObject_IndexType.
+// Enum value maps for IndexRule_Type.
 var (
-	IndexObject_IndexType_name = map[int32]string{
-		0: "INDEX_TYPE_UNSPECIFIED",
-		1: "INDEX_TYPE_TEXT",
-		2: "INDEX_TYPE_NUMERICAL",
-		3: "INDEX_TYPE_ID",
-		4: "INDEX_TYPE_MULTI_TEXT",
-		5: "INDEX_TYPE_MULTI_NUMERICAL",
-		6: "INDEX_TYPE_SERIES_INTERNAL",
+	IndexRule_Type_name = map[int32]string{
+		0: "TYPE_UNSPECIFIED",
+		1: "TYPE_TREE",
+		2: "TYPE_INVERTED",
 	}
-	IndexObject_IndexType_value = map[string]int32{
-		"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,
+	IndexRule_Type_value = map[string]int32{
+		"TYPE_UNSPECIFIED": 0,
+		"TYPE_TREE":        1,
+		"TYPE_INVERTED":    2,
 	}
 )
 
-func (x IndexObject_IndexType) Enum() *IndexObject_IndexType {
-	p := new(IndexObject_IndexType)
+func (x IndexRule_Type) Enum() *IndexRule_Type {
+	p := new(IndexRule_Type)
 	*p = x
 	return p
 }
 
-func (x IndexObject_IndexType) String() string {
+func (x IndexRule_Type) String() string {
 	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (IndexObject_IndexType) Descriptor() protoreflect.EnumDescriptor {
+func (IndexRule_Type) Descriptor() protoreflect.EnumDescriptor {
 	return file_banyandb_database_v1_schema_proto_enumTypes[2].Descriptor()
 }
 
-func (IndexObject_IndexType) Type() protoreflect.EnumType {
+func (IndexRule_Type) Type() protoreflect.EnumType {
 	return &file_banyandb_database_v1_schema_proto_enumTypes[2]
 }
 
-func (x IndexObject_IndexType) Number() protoreflect.EnumNumber {
+func (x IndexRule_Type) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
 
-// Deprecated: Use IndexObject_IndexType.Descriptor instead.
-func (IndexObject_IndexType) EnumDescriptor() ([]byte, []int) {
-	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{6, 0}
+// Deprecated: Use IndexRule_Type.Descriptor instead.
+func (IndexRule_Type) EnumDescriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{5, 0}
 }
 
-// Catalog refers to a placement contains objects belonged to a particular data type
-type Series_Catalog int32
+type IndexRule_Location int32
 
 const (
-	Series_CATALOG_UNSPECIFIED Series_Catalog = 0
-	Series_CATALOG_TRACE       Series_Catalog = 1
-	Series_CATALOG_LOG         Series_Catalog = 2
-	Series_CATALOG_METRIC      Series_Catalog = 3
+	IndexRule_LOCATION_UNSPECIFIED IndexRule_Location = 0
+	IndexRule_LOCATION_SERIES      IndexRule_Location = 1
+	IndexRule_LOCATION_GLOBAL      IndexRule_Location = 2
 )
 
-// Enum value maps for Series_Catalog.
+// Enum value maps for IndexRule_Location.
 var (
-	Series_Catalog_name = map[int32]string{
-		0: "CATALOG_UNSPECIFIED",
-		1: "CATALOG_TRACE",
-		2: "CATALOG_LOG",
-		3: "CATALOG_METRIC",
+	IndexRule_Location_name = map[int32]string{
+		0: "LOCATION_UNSPECIFIED",
+		1: "LOCATION_SERIES",
+		2: "LOCATION_GLOBAL",
 	}
-	Series_Catalog_value = map[string]int32{
-		"CATALOG_UNSPECIFIED": 0,
-		"CATALOG_TRACE":       1,
-		"CATALOG_LOG":         2,
-		"CATALOG_METRIC":      3,
+	IndexRule_Location_value = map[string]int32{
+		"LOCATION_UNSPECIFIED": 0,
+		"LOCATION_SERIES":      1,
+		"LOCATION_GLOBAL":      2,
 	}
 )
 
-func (x Series_Catalog) Enum() *Series_Catalog {
-	p := new(Series_Catalog)
+func (x IndexRule_Location) Enum() *IndexRule_Location {
+	p := new(IndexRule_Location)
 	*p = x
 	return p
 }
 
-func (x Series_Catalog) String() string {
+func (x IndexRule_Location) String() string {
 	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (Series_Catalog) Descriptor() protoreflect.EnumDescriptor {
+func (IndexRule_Location) Descriptor() protoreflect.EnumDescriptor {
 	return file_banyandb_database_v1_schema_proto_enumTypes[3].Descriptor()
 }
 
-func (Series_Catalog) Type() protoreflect.EnumType {
+func (IndexRule_Location) Type() protoreflect.EnumType {
 	return &file_banyandb_database_v1_schema_proto_enumTypes[3]
 }
 
-func (x Series_Catalog) Number() protoreflect.EnumNumber {
+func (x IndexRule_Location) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
 
-// Deprecated: Use Series_Catalog.Descriptor instead.
-func (Series_Catalog) EnumDescriptor() ([]byte, []int) {
-	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{8, 0}
-}
-
-type ShardInfo struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Number        uint32   `protobuf:"varint,1,opt,name=number,proto3" json:"number,omitempty"`
-	RoutingFields []string `protobuf:"bytes,2,rep,name=routing_fields,json=routingFields,proto3" json:"routing_fields,omitempty"`
-}
-
-func (x *ShardInfo) Reset() {
-	*x = ShardInfo{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v1_schema_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *ShardInfo) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*ShardInfo) ProtoMessage() {}
-
-func (x *ShardInfo) ProtoReflect() protoreflect.Message {
-	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 {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use ShardInfo.ProtoReflect.Descriptor instead.
-func (*ShardInfo) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{0}
-}
-
-func (x *ShardInfo) GetNumber() uint32 {
-	if x != nil {
-		return x.Number
-	}
-	return 0
-}
-
-func (x *ShardInfo) GetRoutingFields() []string {
-	if x != nil {
-		return x.RoutingFields
-	}
-	return nil
+// Deprecated: Use IndexRule_Location.Descriptor instead.
+func (IndexRule_Location) EnumDescriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{5, 1}
 }
 
 // Duration represents the elapsed time between two instants
@@ -335,7 +266,7 @@ type Duration struct {
 func (x *Duration) Reset() {
 	*x = Duration{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v1_schema_proto_msgTypes[1]
+		mi := &file_banyandb_database_v1_schema_proto_msgTypes[0]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -348,7 +279,7 @@ func (x *Duration) String() string {
 func (*Duration) ProtoMessage() {}
 
 func (x *Duration) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_database_v1_schema_proto_msgTypes[1]
+	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 {
@@ -361,7 +292,7 @@ func (x *Duration) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Duration.ProtoReflect.Descriptor instead.
 func (*Duration) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{1}
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{0}
 }
 
 func (x *Duration) GetVal() uint32 {
@@ -378,32 +309,33 @@ func (x *Duration) GetUnit() Duration_DurationUnit {
 	return Duration_DURATION_UNIT_UNSPECIFIED
 }
 
-type FieldSpec struct {
+type TagFamilySpec struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Name string    `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	Type FieldType `protobuf:"varint,2,opt,name=type,proto3,enum=banyandb.database.v1.FieldType" json:"type,omitempty"`
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// tags defines accepted tags
+	Tags []*TagSpec `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty"`
 }
 
-func (x *FieldSpec) Reset() {
-	*x = FieldSpec{}
+func (x *TagFamilySpec) Reset() {
+	*x = TagFamilySpec{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v1_schema_proto_msgTypes[2]
+		mi := &file_banyandb_database_v1_schema_proto_msgTypes[1]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
 }
 
-func (x *FieldSpec) String() string {
+func (x *TagFamilySpec) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*FieldSpec) ProtoMessage() {}
+func (*TagFamilySpec) ProtoMessage() {}
 
-func (x *FieldSpec) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_database_v1_schema_proto_msgTypes[2]
+func (x *TagFamilySpec) ProtoReflect() protoreflect.Message {
+	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 {
@@ -414,120 +346,51 @@ func (x *FieldSpec) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use FieldSpec.ProtoReflect.Descriptor instead.
-func (*FieldSpec) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{2}
+// Deprecated: Use TagFamilySpec.ProtoReflect.Descriptor instead.
+func (*TagFamilySpec) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{1}
 }
 
-func (x *FieldSpec) GetName() string {
+func (x *TagFamilySpec) GetName() string {
 	if x != nil {
 		return x.Name
 	}
 	return ""
 }
 
-func (x *FieldSpec) GetType() FieldType {
-	if x != nil {
-		return x.Type
-	}
-	return FieldType_FIELD_TYPE_UNSPECIFIED
-}
-
-type TraceStateMap struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Field      string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"`
-	ValSuccess string `protobuf:"bytes,2,opt,name=val_success,json=valSuccess,proto3" json:"val_success,omitempty"`
-	ValError   string `protobuf:"bytes,3,opt,name=val_error,json=valError,proto3" json:"val_error,omitempty"`
-}
-
-func (x *TraceStateMap) Reset() {
-	*x = TraceStateMap{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v1_schema_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *TraceStateMap) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*TraceStateMap) ProtoMessage() {}
-
-func (x *TraceStateMap) ProtoReflect() protoreflect.Message {
-	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 {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use TraceStateMap.ProtoReflect.Descriptor instead.
-func (*TraceStateMap) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{3}
-}
-
-func (x *TraceStateMap) GetField() string {
-	if x != nil {
-		return x.Field
-	}
-	return ""
-}
-
-func (x *TraceStateMap) GetValSuccess() string {
-	if x != nil {
-		return x.ValSuccess
-	}
-	return ""
-}
-
-func (x *TraceStateMap) GetValError() string {
+func (x *TagFamilySpec) GetTags() []*TagSpec {
 	if x != nil {
-		return x.ValError
+		return x.Tags
 	}
-	return ""
+	return nil
 }
 
-// The key in TraceFieldMap are reserved by trace series engine. Their corresponding value is the Fields or
-// the combination of Fields
-type TraceFieldMap struct {
+type TagSpec struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	// trace_id the unique identity of a single trace
-	TraceId string `protobuf:"bytes,1,opt,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"`
-	// series_id groups entities into a storage bucket
-	SeriesId []string `protobuf:"bytes,2,rep,name=series_id,json=seriesId,proto3" json:"series_id,omitempty"`
-	// state indicates the trace is "success" or "error"
-	State *TraceStateMap `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"`
+	Name string  `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Type TagType `protobuf:"varint,2,opt,name=type,proto3,enum=banyandb.database.v1.TagType" json:"type,omitempty"`
 }
 
-func (x *TraceFieldMap) Reset() {
-	*x = TraceFieldMap{}
+func (x *TagSpec) Reset() {
+	*x = TagSpec{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v1_schema_proto_msgTypes[4]
+		mi := &file_banyandb_database_v1_schema_proto_msgTypes[2]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
 }
 
-func (x *TraceFieldMap) String() string {
+func (x *TagSpec) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*TraceFieldMap) ProtoMessage() {}
+func (*TagSpec) ProtoMessage() {}
 
-func (x *TraceFieldMap) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_database_v1_schema_proto_msgTypes[4]
+func (x *TagSpec) ProtoReflect() protoreflect.Message {
+	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 {
@@ -538,69 +401,61 @@ func (x *TraceFieldMap) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use TraceFieldMap.ProtoReflect.Descriptor instead.
-func (*TraceFieldMap) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{4}
+// Deprecated: Use TagSpec.ProtoReflect.Descriptor instead.
+func (*TagSpec) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{2}
 }
 
-func (x *TraceFieldMap) GetTraceId() string {
+func (x *TagSpec) GetName() string {
 	if x != nil {
-		return x.TraceId
+		return x.Name
 	}
 	return ""
 }
 
-func (x *TraceFieldMap) GetSeriesId() []string {
+func (x *TagSpec) GetType() TagType {
 	if x != nil {
-		return x.SeriesId
-	}
-	return nil
-}
-
-func (x *TraceFieldMap) GetState() *TraceStateMap {
-	if x != nil {
-		return x.State
+		return x.Type
 	}
-	return nil
+	return TagType_TAG_TYPE_UNSPECIFIED
 }
 
-// TraceSeries represents a trace storage object
-type TraceSeries struct {
+// Stream intends to store streaming data, for example, traces or logs
+type Stream struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
 	// metadata is the identity of a trace series
 	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
-	ReservedFieldsMap *TraceFieldMap `protobuf:"bytes,3,opt,name=reserved_fields_map,json=reservedFieldsMap,proto3" json:"reserved_fields_map,omitempty"`
-	// shard indicates how trace data distributes
-	Shard *ShardInfo `protobuf:"bytes,4,opt,name=shard,proto3" json:"shard,omitempty"`
+	// tag_families
+	TagFamilies []*TagFamilySpec `protobuf:"bytes,2,rep,name=tag_families,json=tagFamilies,proto3" json:"tag_families,omitempty"`
+	// entity indicates how to generate a series and shard a stream
+	Entity *Entity `protobuf:"bytes,3,opt,name=entity,proto3" json:"entity,omitempty"`
 	// duration determines how long a TraceSeries keeps its data
+	ShardNum uint32    `protobuf:"varint,4,opt,name=shard_num,json=shardNum,proto3" json:"shard_num,omitempty"`
 	Duration *Duration `protobuf:"bytes,5,opt,name=duration,proto3" json:"duration,omitempty"`
 	// updated_at_nanoseconds indicates when the TraceSeries is updated
 	UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`
 }
 
-func (x *TraceSeries) Reset() {
-	*x = TraceSeries{}
+func (x *Stream) Reset() {
+	*x = Stream{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v1_schema_proto_msgTypes[5]
+		mi := &file_banyandb_database_v1_schema_proto_msgTypes[3]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
 }
 
-func (x *TraceSeries) String() string {
+func (x *Stream) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*TraceSeries) ProtoMessage() {}
+func (*Stream) ProtoMessage() {}
 
-func (x *TraceSeries) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_database_v1_schema_proto_msgTypes[5]
+func (x *Stream) ProtoReflect() protoreflect.Message {
+	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 {
@@ -611,86 +466,78 @@ func (x *TraceSeries) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use TraceSeries.ProtoReflect.Descriptor instead.
-func (*TraceSeries) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{5}
+// Deprecated: Use Stream.ProtoReflect.Descriptor instead.
+func (*Stream) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{3}
 }
 
-func (x *TraceSeries) GetMetadata() *v1.Metadata {
+func (x *Stream) GetMetadata() *v1.Metadata {
 	if x != nil {
 		return x.Metadata
 	}
 	return nil
 }
 
-func (x *TraceSeries) GetFields() []*FieldSpec {
+func (x *Stream) GetTagFamilies() []*TagFamilySpec {
 	if x != nil {
-		return x.Fields
+		return x.TagFamilies
 	}
 	return nil
 }
 
-func (x *TraceSeries) GetReservedFieldsMap() *TraceFieldMap {
+func (x *Stream) GetEntity() *Entity {
 	if x != nil {
-		return x.ReservedFieldsMap
+		return x.Entity
 	}
 	return nil
 }
 
-func (x *TraceSeries) GetShard() *ShardInfo {
+func (x *Stream) GetShardNum() uint32 {
 	if x != nil {
-		return x.Shard
+		return x.ShardNum
 	}
-	return nil
+	return 0
 }
 
-func (x *TraceSeries) GetDuration() *Duration {
+func (x *Stream) GetDuration() *Duration {
 	if x != nil {
 		return x.Duration
 	}
 	return nil
 }
 
-func (x *TraceSeries) GetUpdatedAt() *timestamppb.Timestamp {
+func (x *Stream) GetUpdatedAt() *timestamppb.Timestamp {
 	if x != nil {
 		return x.UpdatedAt
 	}
 	return nil
 }
 
-// IndexObject defines who should be indexed.
-type IndexObject struct {
+type Entity struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	// name is the identity of a IndexObject
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	// 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
-	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.database.v1.IndexObject_IndexType" json:"type,omitempty"`
+	TagNames []string `protobuf:"bytes,1,rep,name=tag_names,json=tagNames,proto3" json:"tag_names,omitempty"`
 }
 
-func (x *IndexObject) Reset() {
-	*x = IndexObject{}
+func (x *Entity) Reset() {
+	*x = Entity{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v1_schema_proto_msgTypes[6]
+		mi := &file_banyandb_database_v1_schema_proto_msgTypes[4]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
 }
 
-func (x *IndexObject) String() string {
+func (x *Entity) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*IndexObject) ProtoMessage() {}
+func (*Entity) ProtoMessage() {}
 
-func (x *IndexObject) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_database_v1_schema_proto_msgTypes[6]
+func (x *Entity) ProtoReflect() protoreflect.Message {
+	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 {
@@ -701,58 +548,20 @@ func (x *IndexObject) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use IndexObject.ProtoReflect.Descriptor instead.
-func (*IndexObject) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{6}
-}
-
-func (x *IndexObject) GetName() string {
-	if x != nil {
-		return x.Name
-	}
-	return ""
+// Deprecated: Use Entity.ProtoReflect.Descriptor instead.
+func (*Entity) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{4}
 }
 
-func (x *IndexObject) GetFields() []string {
+func (x *Entity) GetTagNames() []string {
 	if x != nil {
-		return x.Fields
+		return x.TagNames
 	}
 	return nil
 }
 
-func (x *IndexObject) GetType() IndexObject_IndexType {
-	if x != nil {
-		return x.Type
-	}
-	return IndexObject_INDEX_TYPE_UNSPECIFIED
-}
-
-// 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: .......
-// }
+// IndexRule defines how to generate indices based on tags and the index type
+// IndexRule should bind to a subject through an IndexRuleBinding to generate proper indices.
 type IndexRule struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -760,16 +569,22 @@ type IndexRule struct {
 
 	// metadata define the rule's identity
 	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"`
+	// tags are the combination that refers to an indexed object
+	// If the elements in tags are more than 1, the object will generate a multi-tag index
+	// Caveat: All tags in a multi-tag MUST have an identical IndexType
+	Tags []string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty"`
+	// type is the IndexType of this IndexObject.
+	Type IndexRule_Type `protobuf:"varint,3,opt,name=type,proto3,enum=banyandb.database.v1.IndexRule_Type" json:"type,omitempty"`
+	// location indicates where to store index.
+	Location IndexRule_Location `protobuf:"varint,4,opt,name=location,proto3,enum=banyandb.database.v1.IndexRule_Location" json:"location,omitempty"`
 	// updated_at_nanoseconds indicates when the IndexRule is updated
-	UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`
+	UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`
 }
 
 func (x *IndexRule) Reset() {
 	*x = IndexRule{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v1_schema_proto_msgTypes[7]
+		mi := &file_banyandb_database_v1_schema_proto_msgTypes[5]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -782,7 +597,7 @@ func (x *IndexRule) String() string {
 func (*IndexRule) ProtoMessage() {}
 
 func (x *IndexRule) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_database_v1_schema_proto_msgTypes[7]
+	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 {
@@ -795,7 +610,7 @@ func (x *IndexRule) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use IndexRule.ProtoReflect.Descriptor instead.
 func (*IndexRule) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{7}
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{5}
 }
 
 func (x *IndexRule) GetMetadata() *v1.Metadata {
@@ -805,13 +620,27 @@ func (x *IndexRule) GetMetadata() *v1.Metadata {
 	return nil
 }
 
-func (x *IndexRule) GetObjects() []*IndexObject {
+func (x *IndexRule) GetTags() []string {
 	if x != nil {
-		return x.Objects
+		return x.Tags
 	}
 	return nil
 }
 
+func (x *IndexRule) GetType() IndexRule_Type {
+	if x != nil {
+		return x.Type
+	}
+	return IndexRule_TYPE_UNSPECIFIED
+}
+
+func (x *IndexRule) GetLocation() IndexRule_Location {
+	if x != nil {
+		return x.Location
+	}
+	return IndexRule_LOCATION_UNSPECIFIED
+}
+
 func (x *IndexRule) GetUpdatedAt() *timestamppb.Timestamp {
 	if x != nil {
 		return x.UpdatedAt
@@ -819,41 +648,35 @@ func (x *IndexRule) GetUpdatedAt() *timestamppb.Timestamp {
 	return nil
 }
 
-// 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}
-//                }
-type Series struct {
+// Subject defines which stream or measure would generate indices
+type Subject struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	// catalog is where the subject/series belongs to
-	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 *v1.Metadata `protobuf:"bytes,2,opt,name=series,proto3" json:"series,omitempty"`
+	// catalog is where the subject belongs to
+	Catalog v1.Catalog `protobuf:"varint,1,opt,name=catalog,proto3,enum=banyandb.common.v1.Catalog" json:"catalog,omitempty"`
+	// name refers to a stream or measure in a particular catalog
+	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
 }
 
-func (x *Series) Reset() {
-	*x = Series{}
+func (x *Subject) Reset() {
+	*x = Subject{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v1_schema_proto_msgTypes[8]
+		mi := &file_banyandb_database_v1_schema_proto_msgTypes[6]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
 }
 
-func (x *Series) String() string {
+func (x *Subject) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*Series) ProtoMessage() {}
+func (*Subject) ProtoMessage() {}
 
-func (x *Series) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_database_v1_schema_proto_msgTypes[8]
+func (x *Subject) ProtoReflect() protoreflect.Message {
+	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 {
@@ -864,26 +687,26 @@ func (x *Series) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use Series.ProtoReflect.Descriptor instead.
-func (*Series) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{8}
+// Deprecated: Use Subject.ProtoReflect.Descriptor instead.
+func (*Subject) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{6}
 }
 
-func (x *Series) GetCatalog() Series_Catalog {
+func (x *Subject) GetCatalog() v1.Catalog {
 	if x != nil {
 		return x.Catalog
 	}
-	return Series_CATALOG_UNSPECIFIED
+	return v1.Catalog(0)
 }
 
-func (x *Series) GetSeries() *v1.Metadata {
+func (x *Subject) GetName() string {
 	if x != nil {
-		return x.Series
+		return x.Name
 	}
-	return nil
+	return ""
 }
 
-// IndexRuleBinding is a bridge to connect an IndexRule to several Series
+// IndexRuleBinding is a bridge to connect severalIndexRules to a subject
 // This binding is valid between begin_at_nanoseconds and expire_at_nanoseconds, that provides flexible strategies
 // to control how to generate time series indices.
 type IndexRuleBinding struct {
@@ -893,10 +716,10 @@ type IndexRuleBinding struct {
 
 	// metadata is the identity of this binding
 	Metadata *v1.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
-	// rule_ref refers to the IndexRule
-	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"`
+	// rules refers to the IndexRule
+	Rules []string `protobuf:"bytes,2,rep,name=rules,proto3" json:"rules,omitempty"`
+	// subject indicates the subject of binding action
+	Subject *Subject `protobuf:"bytes,3,opt,name=subject,proto3" json:"subject,omitempty"`
 	// begin_at_nanoseconds is the timestamp, after which the binding will be active
 	BeginAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=begin_at,json=beginAt,proto3" json:"begin_at,omitempty"`
 	// expire_at_nanoseconds it the timestamp, after which the binding will be inactive
@@ -909,7 +732,7 @@ type IndexRuleBinding struct {
 func (x *IndexRuleBinding) Reset() {
 	*x = IndexRuleBinding{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v1_schema_proto_msgTypes[9]
+		mi := &file_banyandb_database_v1_schema_proto_msgTypes[7]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -922,7 +745,7 @@ func (x *IndexRuleBinding) String() string {
 func (*IndexRuleBinding) ProtoMessage() {}
 
 func (x *IndexRuleBinding) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_database_v1_schema_proto_msgTypes[9]
+	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 {
@@ -935,7 +758,7 @@ func (x *IndexRuleBinding) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use IndexRuleBinding.ProtoReflect.Descriptor instead.
 func (*IndexRuleBinding) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{9}
+	return file_banyandb_database_v1_schema_proto_rawDescGZIP(), []int{7}
 }
 
 func (x *IndexRuleBinding) GetMetadata() *v1.Metadata {
@@ -945,16 +768,16 @@ func (x *IndexRuleBinding) GetMetadata() *v1.Metadata {
 	return nil
 }
 
-func (x *IndexRuleBinding) GetRuleRef() *v1.Metadata {
+func (x *IndexRuleBinding) GetRules() []string {
 	if x != nil {
-		return x.RuleRef
+		return x.Rules
 	}
 	return nil
 }
 
-func (x *IndexRuleBinding) GetSubjects() []*Series {
+func (x *IndexRuleBinding) GetSubject() *Subject {
 	if x != nil {
-		return x.Subjects
+		return x.Subject
 	}
 	return nil
 }
@@ -990,157 +813,126 @@ var file_banyandb_database_v1_schema_proto_rawDesc = []byte{
 	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,
-	0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x49, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43,
-	0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x55, 0x52, 0x41, 0x54,
-	0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x49, 0x54, 0x5f, 0x48, 0x4f, 0x55, 0x52, 0x10, 0x01, 0x12,
-	0x15, 0x0a, 0x11, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x49, 0x54,
-	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, 0x54, 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, 0x33, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 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, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 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,
+	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 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, 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, 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,
+	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, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x49, 0x54, 0x5f, 0x55, 0x4e,
+	0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x44,
+	0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x49, 0x54, 0x5f, 0x48, 0x4f, 0x55,
+	0x52, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f,
+	0x55, 0x4e, 0x49, 0x54, 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, 0x56, 0x0a, 0x0d, 0x54,
+	0x61, 0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 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, 0x31, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d,
+	0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61,
+	0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x74,
+	0x61, 0x67, 0x73, 0x22, 0x50, 0x0a, 0x07, 0x54, 0x61, 0x67, 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, 0x31, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e,
+	0x32, 0x1d, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61,
+	0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52,
+	0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xd4, 0x02, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d,
+	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, 0x46, 0x0a, 0x0c, 0x74, 0x61,
+	0x67, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 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, 0x61, 0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c,
+	0x79, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x74, 0x61, 0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69,
+	0x65, 0x73, 0x12, 0x34, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01,
+	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, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79,
+	0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x61, 0x72,
+	0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x68, 0x61,
+	0x72, 0x64, 0x4e, 0x75, 0x6d, 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, 0x25, 0x0a, 0x06,
+	0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x67, 0x5f, 0x6e, 0x61,
+	0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x67, 0x4e, 0x61,
+	0x6d, 0x65, 0x73, 0x22, 0xa4, 0x03, 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, 0x12, 0x0a, 0x04, 0x74,
+	0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12,
+	0x38, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 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,
+	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x2e, 0x54,
+	0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x44, 0x0a, 0x08, 0x6c, 0x6f, 0x63,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 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, 0x2e, 0x4c, 0x6f, 0x63,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x22, 0x3e, 0x0a, 0x04, 0x54, 0x79,
+	0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
+	0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45,
+	0x5f, 0x54, 0x52, 0x45, 0x45, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f,
+	0x49, 0x4e, 0x56, 0x45, 0x52, 0x54, 0x45, 0x44, 0x10, 0x02, 0x22, 0x4e, 0x0a, 0x08, 0x4c, 0x6f,
+	0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49,
+	0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,
+	0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x52,
+	0x49, 0x45, 0x53, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f,
+	0x4e, 0x5f, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x10, 0x02, 0x22, 0x54, 0x0a, 0x07, 0x53, 0x75,
+	0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x61,
+	0x6c, 0x6f, 0x67, 0x52, 0x07, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04,
+	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+	0x22, 0xc6, 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,
+	0x14, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05,
+	0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
+	0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75,
+	0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 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, 0x2a, 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, 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,
+	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, 0x2a, 0x97, 0x01, 0x0a, 0x07, 0x54, 0x61,
+	0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x54, 0x41, 0x47, 0x5f, 0x54, 0x59, 0x50,
+	0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,
+	0x13, 0x0a, 0x0f, 0x54, 0x41, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49,
+	0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x41, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45,
+	0x5f, 0x49, 0x4e, 0x54, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x54, 0x41, 0x47, 0x5f, 0x54, 0x59,
+	0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x52, 0x52, 0x41, 0x59, 0x10,
+	0x03, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x41, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e,
+	0x54, 0x5f, 0x41, 0x52, 0x52, 0x41, 0x59, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x14, 0x54, 0x41, 0x47,
+	0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x42, 0x49, 0x4e, 0x41, 0x52,
+	0x59, 0x10, 0x05, 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 (
@@ -1156,52 +948,48 @@ func file_banyandb_database_v1_schema_proto_rawDescGZIP() []byte {
 }
 
 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_msgTypes = make([]protoimpl.MessageInfo, 8)
 var file_banyandb_database_v1_schema_proto_goTypes = []interface{}{
-	(FieldType)(0),                // 0: banyandb.database.v1.FieldType
+	(TagType)(0),                  // 0: banyandb.database.v1.TagType
 	(Duration_DurationUnit)(0),    // 1: banyandb.database.v1.Duration.DurationUnit
-	(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
+	(IndexRule_Type)(0),           // 2: banyandb.database.v1.IndexRule.Type
+	(IndexRule_Location)(0),       // 3: banyandb.database.v1.IndexRule.Location
+	(*Duration)(nil),              // 4: banyandb.database.v1.Duration
+	(*TagFamilySpec)(nil),         // 5: banyandb.database.v1.TagFamilySpec
+	(*TagSpec)(nil),               // 6: banyandb.database.v1.TagSpec
+	(*Stream)(nil),                // 7: banyandb.database.v1.Stream
+	(*Entity)(nil),                // 8: banyandb.database.v1.Entity
+	(*IndexRule)(nil),             // 9: banyandb.database.v1.IndexRule
+	(*Subject)(nil),               // 10: banyandb.database.v1.Subject
+	(*IndexRuleBinding)(nil),      // 11: banyandb.database.v1.IndexRuleBinding
+	(*v1.Metadata)(nil),           // 12: banyandb.common.v1.Metadata
+	(*timestamppb.Timestamp)(nil), // 13: google.protobuf.Timestamp
+	(v1.Catalog)(0),               // 14: banyandb.common.v1.Catalog
 }
 var file_banyandb_database_v1_schema_proto_depIdxs = []int32{
 	1,  // 0: banyandb.database.v1.Duration.unit:type_name -> banyandb.database.v1.Duration.DurationUnit
-	0,  // 1: banyandb.database.v1.FieldSpec.type:type_name -> banyandb.database.v1.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
+	6,  // 1: banyandb.database.v1.TagFamilySpec.tags:type_name -> banyandb.database.v1.TagSpec
+	0,  // 2: banyandb.database.v1.TagSpec.type:type_name -> banyandb.database.v1.TagType
+	12, // 3: banyandb.database.v1.Stream.metadata:type_name -> banyandb.common.v1.Metadata
+	5,  // 4: banyandb.database.v1.Stream.tag_families:type_name -> banyandb.database.v1.TagFamilySpec
+	8,  // 5: banyandb.database.v1.Stream.entity:type_name -> banyandb.database.v1.Entity
+	4,  // 6: banyandb.database.v1.Stream.duration:type_name -> banyandb.database.v1.Duration
+	13, // 7: banyandb.database.v1.Stream.updated_at:type_name -> google.protobuf.Timestamp
+	12, // 8: banyandb.database.v1.IndexRule.metadata:type_name -> banyandb.common.v1.Metadata
+	2,  // 9: banyandb.database.v1.IndexRule.type:type_name -> banyandb.database.v1.IndexRule.Type
+	3,  // 10: banyandb.database.v1.IndexRule.location:type_name -> banyandb.database.v1.IndexRule.Location
+	13, // 11: banyandb.database.v1.IndexRule.updated_at:type_name -> google.protobuf.Timestamp
+	14, // 12: banyandb.database.v1.Subject.catalog:type_name -> banyandb.common.v1.Catalog
+	12, // 13: banyandb.database.v1.IndexRuleBinding.metadata:type_name -> banyandb.common.v1.Metadata
+	10, // 14: banyandb.database.v1.IndexRuleBinding.subject:type_name -> banyandb.database.v1.Subject
+	13, // 15: banyandb.database.v1.IndexRuleBinding.begin_at:type_name -> google.protobuf.Timestamp
+	13, // 16: banyandb.database.v1.IndexRuleBinding.expire_at:type_name -> google.protobuf.Timestamp
+	13, // 17: banyandb.database.v1.IndexRuleBinding.updated_at:type_name -> google.protobuf.Timestamp
+	18, // [18:18] is the sub-list for method output_type
+	18, // [18:18] is the sub-list for method input_type
+	18, // [18:18] is the sub-list for extension type_name
+	18, // [18:18] is the sub-list for extension extendee
+	0,  // [0:18] is the sub-list for field type_name
 }
 
 func init() { file_banyandb_database_v1_schema_proto_init() }
@@ -1211,7 +999,7 @@ func file_banyandb_database_v1_schema_proto_init() {
 	}
 	if !protoimpl.UnsafeEnabled {
 		file_banyandb_database_v1_schema_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ShardInfo); i {
+			switch v := v.(*Duration); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1223,7 +1011,7 @@ func file_banyandb_database_v1_schema_proto_init() {
 			}
 		}
 		file_banyandb_database_v1_schema_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Duration); i {
+			switch v := v.(*TagFamilySpec); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1235,7 +1023,7 @@ func file_banyandb_database_v1_schema_proto_init() {
 			}
 		}
 		file_banyandb_database_v1_schema_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*FieldSpec); i {
+			switch v := v.(*TagSpec); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1247,7 +1035,7 @@ func file_banyandb_database_v1_schema_proto_init() {
 			}
 		}
 		file_banyandb_database_v1_schema_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TraceStateMap); i {
+			switch v := v.(*Stream); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1259,7 +1047,7 @@ func file_banyandb_database_v1_schema_proto_init() {
 			}
 		}
 		file_banyandb_database_v1_schema_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TraceFieldMap); i {
+			switch v := v.(*Entity); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1271,7 +1059,7 @@ func file_banyandb_database_v1_schema_proto_init() {
 			}
 		}
 		file_banyandb_database_v1_schema_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TraceSeries); i {
+			switch v := v.(*IndexRule); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1283,7 +1071,7 @@ func file_banyandb_database_v1_schema_proto_init() {
 			}
 		}
 		file_banyandb_database_v1_schema_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*IndexObject); i {
+			switch v := v.(*Subject); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1295,30 +1083,6 @@ func file_banyandb_database_v1_schema_proto_init() {
 			}
 		}
 		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
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		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
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		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
@@ -1337,7 +1101,7 @@ func file_banyandb_database_v1_schema_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_banyandb_database_v1_schema_proto_rawDesc,
 			NumEnums:      4,
-			NumMessages:   10,
+			NumMessages:   8,
 			NumExtensions: 0,
 			NumServices:   0,
 		},
diff --git a/api/proto/banyandb/database/v1/schema.proto b/api/proto/banyandb/database/v1/schema.proto
index 50daff4..e80f3d5 100644
--- a/api/proto/banyandb/database/v1/schema.proto
+++ b/api/proto/banyandb/database/v1/schema.proto
@@ -25,11 +25,6 @@ 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;
@@ -43,141 +38,91 @@ message Duration {
     DurationUnit unit = 2;
 }
 
-enum FieldType {
-    FIELD_TYPE_UNSPECIFIED=0;
-    FIELD_TYPE_STRING = 1;
-    FIELD_TYPE_INT = 2;
-    FIELD_TYPE_STRING_ARRAY = 3;
-    FIELD_TYPE_INT_ARRAY = 4;
+enum TagType {
+    TAG_TYPE_UNSPECIFIED=0;
+    TAG_TYPE_STRING = 1;
+    TAG_TYPE_INT = 2;
+    TAG_TYPE_STRING_ARRAY = 3;
+    TAG_TYPE_INT_ARRAY = 4;
+    TAG_TYPE_DATA_BINARY = 5;
 }
 
-message FieldSpec {
+message TagFamilySpec {
     string name = 1;
-    FieldType type = 2;
-}
-
-message TraceStateMap {
-    string field = 1;
-    string val_success = 2;
-    string val_error = 3;
+    // tags defines accepted tags
+    repeated TagSpec tags = 2; 
 }
 
-// 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;
+message TagSpec {
+    string name = 1;
+    TagType type = 2;
 }
 
-// TraceSeries represents a trace storage object
-message TraceSeries {
+// Stream intends to store streaming data, for example, traces or logs
+message Stream {
     // 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;
+    // tag_families 
+    repeated TagFamilySpec tag_families = 2;
+    // entity indicates how to generate a series and shard a stream
+    Entity entity = 3;
     // duration determines how long a TraceSeries keeps its data
+    uint32 shard_num = 4;
     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;
+message Entity {
+    repeated string tag_names = 1;
 }
 
-// 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: .......
-// }
+// IndexRule defines how to generate indices based on tags and the index type
+// IndexRule should bind to a subject through an IndexRuleBinding to generate proper indices.
 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;
+    // tags are the combination that refers to an indexed object
+    // If the elements in tags are more than 1, the object will generate a multi-tag index
+    // Caveat: All tags in a multi-tag MUST have an identical IndexType
+    repeated string tags = 2;
+    // Type determine the index structure under the hood
+    enum Type {
+        TYPE_UNSPECIFIED = 0;
+        TYPE_TREE = 1;
+        TYPE_INVERTED = 2;
+    }
+    // type is the IndexType of this IndexObject.
+    Type type = 3;
+    enum Location {
+        LOCATION_UNSPECIFIED = 0;
+        LOCATION_SERIES = 1;
+        LOCATION_GLOBAL = 2;
+    }
+    // location indicates where to store index.
+    Location location = 4;
     // updated_at_nanoseconds indicates when the IndexRule is updated
-    google.protobuf.Timestamp updated_at = 6;
+    google.protobuf.Timestamp updated_at = 5;
 }
 
-// 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;
+// Subject defines which stream or measure would generate indices
+message Subject {
+    // catalog is where the subject belongs to
+    common.v1.Catalog catalog = 1;
+    // name refers to a stream or measure in a particular catalog
+    string name = 2;
 }
 
-// IndexRuleBinding is a bridge to connect an IndexRule to several Series
+// IndexRuleBinding is a bridge to connect severalIndexRules to a subject
 // 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;
+    // rules refers to the IndexRule
+    repeated string rules = 2;
+    // subject indicates the subject of binding action
+    Subject subject = 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
diff --git a/api/proto/banyandb/database/v2/database.pb.go b/api/proto/banyandb/database/v2/database.pb.go
deleted file mode 100644
index 81796c0..0000000
--- a/api/proto/banyandb/database/v2/database.pb.go
+++ /dev/null
@@ -1,346 +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/database/v2/database.proto
-
-package v2
-
-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"
-
-	v2 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v2"
-)
-
-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_v2_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_v2_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_v2_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"`
-	Metadata  *v2.Metadata           `protobuf:"bytes,2,opt,name=metadata,proto3" json:"metadata,omitempty"`
-	Catalog   v2.Catalog             `protobuf:"varint,3,opt,name=catalog,proto3,enum=banyandb.common.v2.Catalog" json:"catalog,omitempty"`
-	Node      *Node                  `protobuf:"bytes,4,opt,name=node,proto3" json:"node,omitempty"`
-	Total     uint32                 `protobuf:"varint,5,opt,name=total,proto3" json:"total,omitempty"`
-	UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`
-	CreatedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
-}
-
-func (x *Shard) Reset() {
-	*x = Shard{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v2_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_v2_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_v2_database_proto_rawDescGZIP(), []int{1}
-}
-
-func (x *Shard) GetId() uint64 {
-	if x != nil {
-		return x.Id
-	}
-	return 0
-}
-
-func (x *Shard) GetMetadata() *v2.Metadata {
-	if x != nil {
-		return x.Metadata
-	}
-	return nil
-}
-
-func (x *Shard) GetCatalog() v2.Catalog {
-	if x != nil {
-		return x.Catalog
-	}
-	return v2.Catalog(0)
-}
-
-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_v2_database_proto protoreflect.FileDescriptor
-
-var file_banyandb_database_v2_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, 0x32, 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, 0x32, 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, 0x32,
-	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, 0xc4, 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, 0x38, 0x0a, 0x08, 0x6d, 0x65,
-	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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,
-	0x32, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61,
-	0x64, 0x61, 0x74, 0x61, 0x12, 0x35, 0x0a, 0x07, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62,
-	0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x61, 0x74, 0x61, 0x6c,
-	0x6f, 0x67, 0x52, 0x07, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x12, 0x2e, 0x0a, 0x04, 0x6e,
-	0x6f, 0x64, 0x65, 0x18, 0x04, 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, 0x32,
-	0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74,
-	0x6f, 0x74, 0x61, 0x6c, 0x18, 0x05, 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,
-	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, 0x12, 0x39, 0x0a, 0x0a,
-	0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 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, 0x32, 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, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x33,
-}
-
-var (
-	file_banyandb_database_v2_database_proto_rawDescOnce sync.Once
-	file_banyandb_database_v2_database_proto_rawDescData = file_banyandb_database_v2_database_proto_rawDesc
-)
-
-func file_banyandb_database_v2_database_proto_rawDescGZIP() []byte {
-	file_banyandb_database_v2_database_proto_rawDescOnce.Do(func() {
-		file_banyandb_database_v2_database_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_database_v2_database_proto_rawDescData)
-	})
-	return file_banyandb_database_v2_database_proto_rawDescData
-}
-
-var file_banyandb_database_v2_database_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
-var file_banyandb_database_v2_database_proto_goTypes = []interface{}{
-	(*Node)(nil),                  // 0: banyandb.database.v2.Node
-	(*Shard)(nil),                 // 1: banyandb.database.v2.Shard
-	(*timestamppb.Timestamp)(nil), // 2: google.protobuf.Timestamp
-	(*v2.Metadata)(nil),           // 3: banyandb.common.v2.Metadata
-	(v2.Catalog)(0),               // 4: banyandb.common.v2.Catalog
-}
-var file_banyandb_database_v2_database_proto_depIdxs = []int32{
-	2, // 0: banyandb.database.v2.Node.updated_at:type_name -> google.protobuf.Timestamp
-	2, // 1: banyandb.database.v2.Node.created_at:type_name -> google.protobuf.Timestamp
-	3, // 2: banyandb.database.v2.Shard.metadata:type_name -> banyandb.common.v2.Metadata
-	4, // 3: banyandb.database.v2.Shard.catalog:type_name -> banyandb.common.v2.Catalog
-	0, // 4: banyandb.database.v2.Shard.node:type_name -> banyandb.database.v2.Node
-	2, // 5: banyandb.database.v2.Shard.updated_at:type_name -> google.protobuf.Timestamp
-	2, // 6: banyandb.database.v2.Shard.created_at: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_database_v2_database_proto_init() }
-func file_banyandb_database_v2_database_proto_init() {
-	if File_banyandb_database_v2_database_proto != nil {
-		return
-	}
-	if !protoimpl.UnsafeEnabled {
-		file_banyandb_database_v2_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_v2_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_v2_database_proto_rawDesc,
-			NumEnums:      0,
-			NumMessages:   2,
-			NumExtensions: 0,
-			NumServices:   0,
-		},
-		GoTypes:           file_banyandb_database_v2_database_proto_goTypes,
-		DependencyIndexes: file_banyandb_database_v2_database_proto_depIdxs,
-		MessageInfos:      file_banyandb_database_v2_database_proto_msgTypes,
-	}.Build()
-	File_banyandb_database_v2_database_proto = out.File
-	file_banyandb_database_v2_database_proto_rawDesc = nil
-	file_banyandb_database_v2_database_proto_goTypes = nil
-	file_banyandb_database_v2_database_proto_depIdxs = nil
-}
diff --git a/api/proto/banyandb/database/v2/database.proto b/api/proto/banyandb/database/v2/database.proto
deleted file mode 100644
index ce5903a..0000000
--- a/api/proto/banyandb/database/v2/database.proto
+++ /dev/null
@@ -1,43 +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.database.v2";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v2";
-
-package banyandb.database.v2;
-
-import "google/protobuf/timestamp.proto";
-import "banyandb/common/v2/common.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;
-    common.v2.Metadata metadata = 2;
-    common.v2.Catalog catalog = 3;
-    Node node = 4;
-    uint32 total = 5;
-    google.protobuf.Timestamp updated_at = 6;
-    google.protobuf.Timestamp created_at = 7;
-}
diff --git a/api/proto/banyandb/database/v2/event.pb.go b/api/proto/banyandb/database/v2/event.pb.go
deleted file mode 100644
index f9bb88c..0000000
--- a/api/proto/banyandb/database/v2/event.pb.go
+++ /dev/null
@@ -1,445 +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/database/v2/event.proto
-
-package v2
-
-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"
-
-	v2 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v2"
-)
-
-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_v2_event_proto_enumTypes[0].Descriptor()
-}
-
-func (Action) Type() protoreflect.EnumType {
-	return &file_banyandb_database_v2_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_v2_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.v2.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_v2_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_v2_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_v2_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 EntityEvent struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Subject       *v2.Metadata              `protobuf:"bytes,1,opt,name=subject,proto3" json:"subject,omitempty"`
-	EntityLocator []*EntityEvent_TagLocator `protobuf:"bytes,2,rep,name=entity_locator,json=entityLocator,proto3" json:"entity_locator,omitempty"`
-	Action        Action                    `protobuf:"varint,3,opt,name=action,proto3,enum=banyandb.database.v2.Action" json:"action,omitempty"`
-	Time          *timestamppb.Timestamp    `protobuf:"bytes,4,opt,name=time,proto3" json:"time,omitempty"`
-}
-
-func (x *EntityEvent) Reset() {
-	*x = EntityEvent{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v2_event_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *EntityEvent) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*EntityEvent) ProtoMessage() {}
-
-func (x *EntityEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_database_v2_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 EntityEvent.ProtoReflect.Descriptor instead.
-func (*EntityEvent) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v2_event_proto_rawDescGZIP(), []int{1}
-}
-
-func (x *EntityEvent) GetSubject() *v2.Metadata {
-	if x != nil {
-		return x.Subject
-	}
-	return nil
-}
-
-func (x *EntityEvent) GetEntityLocator() []*EntityEvent_TagLocator {
-	if x != nil {
-		return x.EntityLocator
-	}
-	return nil
-}
-
-func (x *EntityEvent) GetAction() Action {
-	if x != nil {
-		return x.Action
-	}
-	return Action_ACTION_UNSPECIFIED
-}
-
-func (x *EntityEvent) GetTime() *timestamppb.Timestamp {
-	if x != nil {
-		return x.Time
-	}
-	return nil
-}
-
-type EntityEvent_TagLocator struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	FamilyOffset uint32 `protobuf:"varint,1,opt,name=family_offset,json=familyOffset,proto3" json:"family_offset,omitempty"`
-	TagOffset    uint32 `protobuf:"varint,2,opt,name=tag_offset,json=tagOffset,proto3" json:"tag_offset,omitempty"`
-}
-
-func (x *EntityEvent_TagLocator) Reset() {
-	*x = EntityEvent_TagLocator{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v2_event_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *EntityEvent_TagLocator) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*EntityEvent_TagLocator) ProtoMessage() {}
-
-func (x *EntityEvent_TagLocator) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_database_v2_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 EntityEvent_TagLocator.ProtoReflect.Descriptor instead.
-func (*EntityEvent_TagLocator) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v2_event_proto_rawDescGZIP(), []int{1, 0}
-}
-
-func (x *EntityEvent_TagLocator) GetFamilyOffset() uint32 {
-	if x != nil {
-		return x.FamilyOffset
-	}
-	return 0
-}
-
-func (x *EntityEvent_TagLocator) GetTagOffset() uint32 {
-	if x != nil {
-		return x.TagOffset
-	}
-	return 0
-}
-
-var File_banyandb_database_v2_event_proto protoreflect.FileDescriptor
-
-var file_banyandb_database_v2_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, 0x32, 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, 0x32, 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, 0x32, 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, 0x32,
-	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, 0x32, 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, 0x32, 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, 0x32, 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, 0xd2, 0x02, 0x0a, 0x0b, 0x45,
-	0x6e, 0x74, 0x69, 0x74, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x07, 0x73, 0x75,
-	0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x32,
-	0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65,
-	0x63, 0x74, 0x12, 0x53, 0x0a, 0x0e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6c, 0x6f, 0x63,
-	0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x62, 0x61, 0x6e,
-	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76,
-	0x32, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x61,
-	0x67, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
-	0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 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, 0x32, 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, 0x1a, 0x50, 0x0a,
-	0x0a, 0x54, 0x61, 0x67, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x66,
-	0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x0d, 0x52, 0x0c, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74,
-	0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x67, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x74, 0x61, 0x67, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 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, 0x32, 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, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
-}
-
-var (
-	file_banyandb_database_v2_event_proto_rawDescOnce sync.Once
-	file_banyandb_database_v2_event_proto_rawDescData = file_banyandb_database_v2_event_proto_rawDesc
-)
-
-func file_banyandb_database_v2_event_proto_rawDescGZIP() []byte {
-	file_banyandb_database_v2_event_proto_rawDescOnce.Do(func() {
-		file_banyandb_database_v2_event_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_database_v2_event_proto_rawDescData)
-	})
-	return file_banyandb_database_v2_event_proto_rawDescData
-}
-
-var file_banyandb_database_v2_event_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_banyandb_database_v2_event_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
-var file_banyandb_database_v2_event_proto_goTypes = []interface{}{
-	(Action)(0),                    // 0: banyandb.database.v2.Action
-	(*ShardEvent)(nil),             // 1: banyandb.database.v2.ShardEvent
-	(*EntityEvent)(nil),            // 2: banyandb.database.v2.EntityEvent
-	(*EntityEvent_TagLocator)(nil), // 3: banyandb.database.v2.EntityEvent.TagLocator
-	(*Shard)(nil),                  // 4: banyandb.database.v2.Shard
-	(*timestamppb.Timestamp)(nil),  // 5: google.protobuf.Timestamp
-	(*v2.Metadata)(nil),            // 6: banyandb.common.v2.Metadata
-}
-var file_banyandb_database_v2_event_proto_depIdxs = []int32{
-	4, // 0: banyandb.database.v2.ShardEvent.shard:type_name -> banyandb.database.v2.Shard
-	0, // 1: banyandb.database.v2.ShardEvent.action:type_name -> banyandb.database.v2.Action
-	5, // 2: banyandb.database.v2.ShardEvent.time:type_name -> google.protobuf.Timestamp
-	6, // 3: banyandb.database.v2.EntityEvent.subject:type_name -> banyandb.common.v2.Metadata
-	3, // 4: banyandb.database.v2.EntityEvent.entity_locator:type_name -> banyandb.database.v2.EntityEvent.TagLocator
-	0, // 5: banyandb.database.v2.EntityEvent.action:type_name -> banyandb.database.v2.Action
-	5, // 6: banyandb.database.v2.EntityEvent.time: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_database_v2_event_proto_init() }
-func file_banyandb_database_v2_event_proto_init() {
-	if File_banyandb_database_v2_event_proto != nil {
-		return
-	}
-	file_banyandb_database_v2_database_proto_init()
-	file_banyandb_database_v2_schema_proto_init()
-	if !protoimpl.UnsafeEnabled {
-		file_banyandb_database_v2_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_v2_event_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*EntityEvent); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_database_v2_event_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*EntityEvent_TagLocator); 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_v2_event_proto_rawDesc,
-			NumEnums:      1,
-			NumMessages:   3,
-			NumExtensions: 0,
-			NumServices:   0,
-		},
-		GoTypes:           file_banyandb_database_v2_event_proto_goTypes,
-		DependencyIndexes: file_banyandb_database_v2_event_proto_depIdxs,
-		EnumInfos:         file_banyandb_database_v2_event_proto_enumTypes,
-		MessageInfos:      file_banyandb_database_v2_event_proto_msgTypes,
-	}.Build()
-	File_banyandb_database_v2_event_proto = out.File
-	file_banyandb_database_v2_event_proto_rawDesc = nil
-	file_banyandb_database_v2_event_proto_goTypes = nil
-	file_banyandb_database_v2_event_proto_depIdxs = nil
-}
diff --git a/api/proto/banyandb/database/v2/event.proto b/api/proto/banyandb/database/v2/event.proto
deleted file mode 100644
index bec7d9d..0000000
--- a/api/proto/banyandb/database/v2/event.proto
+++ /dev/null
@@ -1,51 +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.database.v2";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v2";
-
-package banyandb.database.v2;
-
-import "google/protobuf/timestamp.proto";
-import "banyandb/common/v2/common.proto";
-import "banyandb/database/v2/database.proto";
-import "banyandb/database/v2/schema.proto";
-
-enum Action {
-    ACTION_UNSPECIFIED = 0;
-    ACTION_PUT = 1;
-    ACTION_DELETE = 2;
-}
-
-message ShardEvent {
-    Shard shard = 1;
-    Action action = 2;
-    google.protobuf.Timestamp time = 3;
-}
-
-message EntityEvent {
-    common.v2.Metadata subject = 1; 
-    message TagLocator {
-        uint32 family_offset = 1;
-        uint32 tag_offset = 2;
-    }
-    repeated TagLocator entity_locator = 2;
-    Action action = 3;
-    google.protobuf.Timestamp time = 4; 
-}
diff --git a/api/proto/banyandb/database/v2/schema.pb.go b/api/proto/banyandb/database/v2/schema.pb.go
deleted file mode 100644
index f277eb9..0000000
--- a/api/proto/banyandb/database/v2/schema.pb.go
+++ /dev/null
@@ -1,1117 +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/database/v2/schema.proto
-
-package v2
-
-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"
-
-	v2 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v2"
-)
-
-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 TagType int32
-
-const (
-	TagType_TAG_TYPE_UNSPECIFIED  TagType = 0
-	TagType_TAG_TYPE_STRING       TagType = 1
-	TagType_TAG_TYPE_INT          TagType = 2
-	TagType_TAG_TYPE_STRING_ARRAY TagType = 3
-	TagType_TAG_TYPE_INT_ARRAY    TagType = 4
-	TagType_TAG_TYPE_DATA_BINARY  TagType = 5
-)
-
-// Enum value maps for TagType.
-var (
-	TagType_name = map[int32]string{
-		0: "TAG_TYPE_UNSPECIFIED",
-		1: "TAG_TYPE_STRING",
-		2: "TAG_TYPE_INT",
-		3: "TAG_TYPE_STRING_ARRAY",
-		4: "TAG_TYPE_INT_ARRAY",
-		5: "TAG_TYPE_DATA_BINARY",
-	}
-	TagType_value = map[string]int32{
-		"TAG_TYPE_UNSPECIFIED":  0,
-		"TAG_TYPE_STRING":       1,
-		"TAG_TYPE_INT":          2,
-		"TAG_TYPE_STRING_ARRAY": 3,
-		"TAG_TYPE_INT_ARRAY":    4,
-		"TAG_TYPE_DATA_BINARY":  5,
-	}
-)
-
-func (x TagType) Enum() *TagType {
-	p := new(TagType)
-	*p = x
-	return p
-}
-
-func (x TagType) String() string {
-	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
-}
-
-func (TagType) Descriptor() protoreflect.EnumDescriptor {
-	return file_banyandb_database_v2_schema_proto_enumTypes[0].Descriptor()
-}
-
-func (TagType) Type() protoreflect.EnumType {
-	return &file_banyandb_database_v2_schema_proto_enumTypes[0]
-}
-
-func (x TagType) Number() protoreflect.EnumNumber {
-	return protoreflect.EnumNumber(x)
-}
-
-// Deprecated: Use TagType.Descriptor instead.
-func (TagType) EnumDescriptor() ([]byte, []int) {
-	return file_banyandb_database_v2_schema_proto_rawDescGZIP(), []int{0}
-}
-
-type Duration_DurationUnit int32
-
-const (
-	Duration_DURATION_UNIT_UNSPECIFIED Duration_DurationUnit = 0
-	Duration_DURATION_UNIT_HOUR        Duration_DurationUnit = 1
-	Duration_DURATION_UNIT_DAY         Duration_DurationUnit = 2
-	Duration_DURATION_UNIT_WEEK        Duration_DurationUnit = 3
-	Duration_DURATION_UNIT_MONTH       Duration_DurationUnit = 4
-)
-
-// Enum value maps for Duration_DurationUnit.
-var (
-	Duration_DurationUnit_name = map[int32]string{
-		0: "DURATION_UNIT_UNSPECIFIED",
-		1: "DURATION_UNIT_HOUR",
-		2: "DURATION_UNIT_DAY",
-		3: "DURATION_UNIT_WEEK",
-		4: "DURATION_UNIT_MONTH",
-	}
-	Duration_DurationUnit_value = map[string]int32{
-		"DURATION_UNIT_UNSPECIFIED": 0,
-		"DURATION_UNIT_HOUR":        1,
-		"DURATION_UNIT_DAY":         2,
-		"DURATION_UNIT_WEEK":        3,
-		"DURATION_UNIT_MONTH":       4,
-	}
-)
-
-func (x Duration_DurationUnit) Enum() *Duration_DurationUnit {
-	p := new(Duration_DurationUnit)
-	*p = x
-	return p
-}
-
-func (x Duration_DurationUnit) String() string {
-	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
-}
-
-func (Duration_DurationUnit) Descriptor() protoreflect.EnumDescriptor {
-	return file_banyandb_database_v2_schema_proto_enumTypes[1].Descriptor()
-}
-
-func (Duration_DurationUnit) Type() protoreflect.EnumType {
-	return &file_banyandb_database_v2_schema_proto_enumTypes[1]
-}
-
-func (x Duration_DurationUnit) Number() protoreflect.EnumNumber {
-	return protoreflect.EnumNumber(x)
-}
-
-// Deprecated: Use Duration_DurationUnit.Descriptor instead.
-func (Duration_DurationUnit) EnumDescriptor() ([]byte, []int) {
-	return file_banyandb_database_v2_schema_proto_rawDescGZIP(), []int{0, 0}
-}
-
-// Type determine the index structure under the hood
-type IndexRule_Type int32
-
-const (
-	IndexRule_TYPE_UNSPECIFIED IndexRule_Type = 0
-	IndexRule_TYPE_TREE        IndexRule_Type = 1
-	IndexRule_TYPE_INVERTED    IndexRule_Type = 2
-)
-
-// Enum value maps for IndexRule_Type.
-var (
-	IndexRule_Type_name = map[int32]string{
-		0: "TYPE_UNSPECIFIED",
-		1: "TYPE_TREE",
-		2: "TYPE_INVERTED",
-	}
-	IndexRule_Type_value = map[string]int32{
-		"TYPE_UNSPECIFIED": 0,
-		"TYPE_TREE":        1,
-		"TYPE_INVERTED":    2,
-	}
-)
-
-func (x IndexRule_Type) Enum() *IndexRule_Type {
-	p := new(IndexRule_Type)
-	*p = x
-	return p
-}
-
-func (x IndexRule_Type) String() string {
-	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
-}
-
-func (IndexRule_Type) Descriptor() protoreflect.EnumDescriptor {
-	return file_banyandb_database_v2_schema_proto_enumTypes[2].Descriptor()
-}
-
-func (IndexRule_Type) Type() protoreflect.EnumType {
-	return &file_banyandb_database_v2_schema_proto_enumTypes[2]
-}
-
-func (x IndexRule_Type) Number() protoreflect.EnumNumber {
-	return protoreflect.EnumNumber(x)
-}
-
-// Deprecated: Use IndexRule_Type.Descriptor instead.
-func (IndexRule_Type) EnumDescriptor() ([]byte, []int) {
-	return file_banyandb_database_v2_schema_proto_rawDescGZIP(), []int{5, 0}
-}
-
-type IndexRule_Location int32
-
-const (
-	IndexRule_LOCATION_UNSPECIFIED IndexRule_Location = 0
-	IndexRule_LOCATION_SERIES      IndexRule_Location = 1
-	IndexRule_LOCATION_GLOBAL      IndexRule_Location = 2
-)
-
-// Enum value maps for IndexRule_Location.
-var (
-	IndexRule_Location_name = map[int32]string{
-		0: "LOCATION_UNSPECIFIED",
-		1: "LOCATION_SERIES",
-		2: "LOCATION_GLOBAL",
-	}
-	IndexRule_Location_value = map[string]int32{
-		"LOCATION_UNSPECIFIED": 0,
-		"LOCATION_SERIES":      1,
-		"LOCATION_GLOBAL":      2,
-	}
-)
-
-func (x IndexRule_Location) Enum() *IndexRule_Location {
-	p := new(IndexRule_Location)
-	*p = x
-	return p
-}
-
-func (x IndexRule_Location) String() string {
-	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
-}
-
-func (IndexRule_Location) Descriptor() protoreflect.EnumDescriptor {
-	return file_banyandb_database_v2_schema_proto_enumTypes[3].Descriptor()
-}
-
-func (IndexRule_Location) Type() protoreflect.EnumType {
-	return &file_banyandb_database_v2_schema_proto_enumTypes[3]
-}
-
-func (x IndexRule_Location) Number() protoreflect.EnumNumber {
-	return protoreflect.EnumNumber(x)
-}
-
-// Deprecated: Use IndexRule_Location.Descriptor instead.
-func (IndexRule_Location) EnumDescriptor() ([]byte, []int) {
-	return file_banyandb_database_v2_schema_proto_rawDescGZIP(), []int{5, 1}
-}
-
-// Duration represents the elapsed time between two instants
-type Duration struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	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.database.v2.Duration_DurationUnit" json:"unit,omitempty"`
-}
-
-func (x *Duration) Reset() {
-	*x = Duration{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v2_schema_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *Duration) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*Duration) ProtoMessage() {}
-
-func (x *Duration) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_database_v2_schema_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 Duration.ProtoReflect.Descriptor instead.
-func (*Duration) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v2_schema_proto_rawDescGZIP(), []int{0}
-}
-
-func (x *Duration) GetVal() uint32 {
-	if x != nil {
-		return x.Val
-	}
-	return 0
-}
-
-func (x *Duration) GetUnit() Duration_DurationUnit {
-	if x != nil {
-		return x.Unit
-	}
-	return Duration_DURATION_UNIT_UNSPECIFIED
-}
-
-type TagFamilySpec struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	// tags defines accepted tags
-	Tags []*TagSpec `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty"`
-}
-
-func (x *TagFamilySpec) Reset() {
-	*x = TagFamilySpec{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v2_schema_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *TagFamilySpec) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*TagFamilySpec) ProtoMessage() {}
-
-func (x *TagFamilySpec) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_database_v2_schema_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 TagFamilySpec.ProtoReflect.Descriptor instead.
-func (*TagFamilySpec) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v2_schema_proto_rawDescGZIP(), []int{1}
-}
-
-func (x *TagFamilySpec) GetName() string {
-	if x != nil {
-		return x.Name
-	}
-	return ""
-}
-
-func (x *TagFamilySpec) GetTags() []*TagSpec {
-	if x != nil {
-		return x.Tags
-	}
-	return nil
-}
-
-type TagSpec struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Name string  `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	Type TagType `protobuf:"varint,2,opt,name=type,proto3,enum=banyandb.database.v2.TagType" json:"type,omitempty"`
-}
-
-func (x *TagSpec) Reset() {
-	*x = TagSpec{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v2_schema_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *TagSpec) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*TagSpec) ProtoMessage() {}
-
-func (x *TagSpec) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_database_v2_schema_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 TagSpec.ProtoReflect.Descriptor instead.
-func (*TagSpec) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v2_schema_proto_rawDescGZIP(), []int{2}
-}
-
-func (x *TagSpec) GetName() string {
-	if x != nil {
-		return x.Name
-	}
-	return ""
-}
-
-func (x *TagSpec) GetType() TagType {
-	if x != nil {
-		return x.Type
-	}
-	return TagType_TAG_TYPE_UNSPECIFIED
-}
-
-// Stream intends to store streaming data, for example, traces or logs
-type Stream struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// metadata is the identity of a trace series
-	Metadata *v2.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
-	// tag_families
-	TagFamilies []*TagFamilySpec `protobuf:"bytes,2,rep,name=tag_families,json=tagFamilies,proto3" json:"tag_families,omitempty"`
-	// entity indicates how to generate a series and shard a stream
-	Entity *Entity `protobuf:"bytes,3,opt,name=entity,proto3" json:"entity,omitempty"`
-	// duration determines how long a TraceSeries keeps its data
-	ShardNum uint32    `protobuf:"varint,4,opt,name=shard_num,json=shardNum,proto3" json:"shard_num,omitempty"`
-	Duration *Duration `protobuf:"bytes,5,opt,name=duration,proto3" json:"duration,omitempty"`
-	// updated_at_nanoseconds indicates when the TraceSeries is updated
-	UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`
-}
-
-func (x *Stream) Reset() {
-	*x = Stream{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v2_schema_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *Stream) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*Stream) ProtoMessage() {}
-
-func (x *Stream) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_database_v2_schema_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 Stream.ProtoReflect.Descriptor instead.
-func (*Stream) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v2_schema_proto_rawDescGZIP(), []int{3}
-}
-
-func (x *Stream) GetMetadata() *v2.Metadata {
-	if x != nil {
-		return x.Metadata
-	}
-	return nil
-}
-
-func (x *Stream) GetTagFamilies() []*TagFamilySpec {
-	if x != nil {
-		return x.TagFamilies
-	}
-	return nil
-}
-
-func (x *Stream) GetEntity() *Entity {
-	if x != nil {
-		return x.Entity
-	}
-	return nil
-}
-
-func (x *Stream) GetShardNum() uint32 {
-	if x != nil {
-		return x.ShardNum
-	}
-	return 0
-}
-
-func (x *Stream) GetDuration() *Duration {
-	if x != nil {
-		return x.Duration
-	}
-	return nil
-}
-
-func (x *Stream) GetUpdatedAt() *timestamppb.Timestamp {
-	if x != nil {
-		return x.UpdatedAt
-	}
-	return nil
-}
-
-type Entity struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	TagNames []string `protobuf:"bytes,1,rep,name=tag_names,json=tagNames,proto3" json:"tag_names,omitempty"`
-}
-
-func (x *Entity) Reset() {
-	*x = Entity{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v2_schema_proto_msgTypes[4]
-		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_database_v2_schema_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 Entity.ProtoReflect.Descriptor instead.
-func (*Entity) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v2_schema_proto_rawDescGZIP(), []int{4}
-}
-
-func (x *Entity) GetTagNames() []string {
-	if x != nil {
-		return x.TagNames
-	}
-	return nil
-}
-
-// IndexRule defines how to generate indices based on tags and the index type
-// IndexRule should bind to a subject through an IndexRuleBinding to generate proper indices.
-type IndexRule struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// metadata define the rule's identity
-	Metadata *v2.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
-	// tags are the combination that refers to an indexed object
-	// If the elements in tags are more than 1, the object will generate a multi-tag index
-	// Caveat: All tags in a multi-tag MUST have an identical IndexType
-	Tags []string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty"`
-	// type is the IndexType of this IndexObject.
-	Type IndexRule_Type `protobuf:"varint,3,opt,name=type,proto3,enum=banyandb.database.v2.IndexRule_Type" json:"type,omitempty"`
-	// location indicates where to store index.
-	Location IndexRule_Location `protobuf:"varint,4,opt,name=location,proto3,enum=banyandb.database.v2.IndexRule_Location" json:"location,omitempty"`
-	// updated_at_nanoseconds indicates when the IndexRule is updated
-	UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`
-}
-
-func (x *IndexRule) Reset() {
-	*x = IndexRule{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v2_schema_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *IndexRule) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*IndexRule) ProtoMessage() {}
-
-func (x *IndexRule) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_database_v2_schema_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 IndexRule.ProtoReflect.Descriptor instead.
-func (*IndexRule) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v2_schema_proto_rawDescGZIP(), []int{5}
-}
-
-func (x *IndexRule) GetMetadata() *v2.Metadata {
-	if x != nil {
-		return x.Metadata
-	}
-	return nil
-}
-
-func (x *IndexRule) GetTags() []string {
-	if x != nil {
-		return x.Tags
-	}
-	return nil
-}
-
-func (x *IndexRule) GetType() IndexRule_Type {
-	if x != nil {
-		return x.Type
-	}
-	return IndexRule_TYPE_UNSPECIFIED
-}
-
-func (x *IndexRule) GetLocation() IndexRule_Location {
-	if x != nil {
-		return x.Location
-	}
-	return IndexRule_LOCATION_UNSPECIFIED
-}
-
-func (x *IndexRule) GetUpdatedAt() *timestamppb.Timestamp {
-	if x != nil {
-		return x.UpdatedAt
-	}
-	return nil
-}
-
-// Subject defines which stream or measure would generate indices
-type Subject struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// catalog is where the subject belongs to
-	Catalog v2.Catalog `protobuf:"varint,1,opt,name=catalog,proto3,enum=banyandb.common.v2.Catalog" json:"catalog,omitempty"`
-	// name refers to a stream or measure in a particular catalog
-	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
-}
-
-func (x *Subject) Reset() {
-	*x = Subject{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v2_schema_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *Subject) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*Subject) ProtoMessage() {}
-
-func (x *Subject) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_database_v2_schema_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 Subject.ProtoReflect.Descriptor instead.
-func (*Subject) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v2_schema_proto_rawDescGZIP(), []int{6}
-}
-
-func (x *Subject) GetCatalog() v2.Catalog {
-	if x != nil {
-		return x.Catalog
-	}
-	return v2.Catalog(0)
-}
-
-func (x *Subject) GetName() string {
-	if x != nil {
-		return x.Name
-	}
-	return ""
-}
-
-// IndexRuleBinding is a bridge to connect severalIndexRules to a subject
-// This binding is valid between begin_at_nanoseconds and expire_at_nanoseconds, that provides flexible strategies
-// to control how to generate time series indices.
-type IndexRuleBinding struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// metadata is the identity of this binding
-	Metadata *v2.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
-	// rules refers to the IndexRule
-	Rules []string `protobuf:"bytes,2,rep,name=rules,proto3" json:"rules,omitempty"`
-	// subject indicates the subject of binding action
-	Subject *Subject `protobuf:"bytes,3,opt,name=subject,proto3" json:"subject,omitempty"`
-	// begin_at_nanoseconds is the timestamp, after which the binding will be active
-	BeginAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=begin_at,json=beginAt,proto3" json:"begin_at,omitempty"`
-	// expire_at_nanoseconds it the timestamp, after which the binding will be inactive
-	// expire_at_nanoseconds must be larger than begin_at_nanoseconds
-	ExpireAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=expire_at,json=expireAt,proto3" json:"expire_at,omitempty"`
-	// updated_at_nanoseconds indicates when the IndexRuleBinding is updated
-	UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`
-}
-
-func (x *IndexRuleBinding) Reset() {
-	*x = IndexRuleBinding{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_database_v2_schema_proto_msgTypes[7]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *IndexRuleBinding) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*IndexRuleBinding) ProtoMessage() {}
-
-func (x *IndexRuleBinding) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_database_v2_schema_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 IndexRuleBinding.ProtoReflect.Descriptor instead.
-func (*IndexRuleBinding) Descriptor() ([]byte, []int) {
-	return file_banyandb_database_v2_schema_proto_rawDescGZIP(), []int{7}
-}
-
-func (x *IndexRuleBinding) GetMetadata() *v2.Metadata {
-	if x != nil {
-		return x.Metadata
-	}
-	return nil
-}
-
-func (x *IndexRuleBinding) GetRules() []string {
-	if x != nil {
-		return x.Rules
-	}
-	return nil
-}
-
-func (x *IndexRuleBinding) GetSubject() *Subject {
-	if x != nil {
-		return x.Subject
-	}
-	return nil
-}
-
-func (x *IndexRuleBinding) GetBeginAt() *timestamppb.Timestamp {
-	if x != nil {
-		return x.BeginAt
-	}
-	return nil
-}
-
-func (x *IndexRuleBinding) GetExpireAt() *timestamppb.Timestamp {
-	if x != nil {
-		return x.ExpireAt
-	}
-	return nil
-}
-
-func (x *IndexRuleBinding) GetUpdatedAt() *timestamppb.Timestamp {
-	if x != nil {
-		return x.UpdatedAt
-	}
-	return nil
-}
-
-var File_banyandb_database_v2_schema_proto protoreflect.FileDescriptor
-
-var file_banyandb_database_v2_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, 0x32, 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, 0x32, 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, 0x32, 0x2f, 0x63,
-	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 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, 0x32, 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, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x49, 0x54, 0x5f, 0x55, 0x4e,
-	0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x44,
-	0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x49, 0x54, 0x5f, 0x48, 0x4f, 0x55,
-	0x52, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f,
-	0x55, 0x4e, 0x49, 0x54, 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, 0x56, 0x0a, 0x0d, 0x54,
-	0x61, 0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 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, 0x31, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d,
-	0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61,
-	0x73, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x61, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x74,
-	0x61, 0x67, 0x73, 0x22, 0x50, 0x0a, 0x07, 0x54, 0x61, 0x67, 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, 0x31, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e,
-	0x32, 0x1d, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61,
-	0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x61, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52,
-	0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xd4, 0x02, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d,
-	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, 0x32, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
-	0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x46, 0x0a, 0x0c, 0x74, 0x61,
-	0x67, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
-	0x32, 0x23, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61,
-	0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x61, 0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c,
-	0x79, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x74, 0x61, 0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69,
-	0x65, 0x73, 0x12, 0x34, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61,
-	0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79,
-	0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x61, 0x72,
-	0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x68, 0x61,
-	0x72, 0x64, 0x4e, 0x75, 0x6d, 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, 0x32, 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, 0x25, 0x0a, 0x06,
-	0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x67, 0x5f, 0x6e, 0x61,
-	0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x67, 0x4e, 0x61,
-	0x6d, 0x65, 0x73, 0x22, 0xa4, 0x03, 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, 0x32, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
-	0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x74,
-	0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12,
-	0x38, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 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, 0x32, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x2e, 0x54,
-	0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x44, 0x0a, 0x08, 0x6c, 0x6f, 0x63,
-	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x62, 0x61,
-	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e,
-	0x76, 0x32, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x2e, 0x4c, 0x6f, 0x63,
-	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x22, 0x3e, 0x0a, 0x04, 0x54, 0x79,
-	0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
-	0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45,
-	0x5f, 0x54, 0x52, 0x45, 0x45, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f,
-	0x49, 0x4e, 0x56, 0x45, 0x52, 0x54, 0x45, 0x44, 0x10, 0x02, 0x22, 0x4e, 0x0a, 0x08, 0x4c, 0x6f,
-	0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49,
-	0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,
-	0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x52,
-	0x49, 0x45, 0x53, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f,
-	0x4e, 0x5f, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x10, 0x02, 0x22, 0x54, 0x0a, 0x07, 0x53, 0x75,
-	0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x61, 0x74, 0x61,
-	0x6c, 0x6f, 0x67, 0x52, 0x07, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04,
-	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
-	0x22, 0xc6, 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, 0x32, 0x2e, 0x4d, 0x65, 0x74,
-	0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12,
-	0x14, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05,
-	0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74,
-	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
-	0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x75,
-	0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x2a, 0x97, 0x01, 0x0a, 0x07, 0x54, 0x61,
-	0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x54, 0x41, 0x47, 0x5f, 0x54, 0x59, 0x50,
-	0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,
-	0x13, 0x0a, 0x0f, 0x54, 0x41, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49,
-	0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x41, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45,
-	0x5f, 0x49, 0x4e, 0x54, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x54, 0x41, 0x47, 0x5f, 0x54, 0x59,
-	0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x52, 0x52, 0x41, 0x59, 0x10,
-	0x03, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x41, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e,
-	0x54, 0x5f, 0x41, 0x52, 0x52, 0x41, 0x59, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x14, 0x54, 0x41, 0x47,
-	0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x42, 0x49, 0x4e, 0x41, 0x52,
-	0x59, 0x10, 0x05, 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,
-	0x32, 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, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
-}
-
-var (
-	file_banyandb_database_v2_schema_proto_rawDescOnce sync.Once
-	file_banyandb_database_v2_schema_proto_rawDescData = file_banyandb_database_v2_schema_proto_rawDesc
-)
-
-func file_banyandb_database_v2_schema_proto_rawDescGZIP() []byte {
-	file_banyandb_database_v2_schema_proto_rawDescOnce.Do(func() {
-		file_banyandb_database_v2_schema_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_database_v2_schema_proto_rawDescData)
-	})
-	return file_banyandb_database_v2_schema_proto_rawDescData
-}
-
-var file_banyandb_database_v2_schema_proto_enumTypes = make([]protoimpl.EnumInfo, 4)
-var file_banyandb_database_v2_schema_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
-var file_banyandb_database_v2_schema_proto_goTypes = []interface{}{
-	(TagType)(0),                  // 0: banyandb.database.v2.TagType
-	(Duration_DurationUnit)(0),    // 1: banyandb.database.v2.Duration.DurationUnit
-	(IndexRule_Type)(0),           // 2: banyandb.database.v2.IndexRule.Type
-	(IndexRule_Location)(0),       // 3: banyandb.database.v2.IndexRule.Location
-	(*Duration)(nil),              // 4: banyandb.database.v2.Duration
-	(*TagFamilySpec)(nil),         // 5: banyandb.database.v2.TagFamilySpec
-	(*TagSpec)(nil),               // 6: banyandb.database.v2.TagSpec
-	(*Stream)(nil),                // 7: banyandb.database.v2.Stream
-	(*Entity)(nil),                // 8: banyandb.database.v2.Entity
-	(*IndexRule)(nil),             // 9: banyandb.database.v2.IndexRule
-	(*Subject)(nil),               // 10: banyandb.database.v2.Subject
-	(*IndexRuleBinding)(nil),      // 11: banyandb.database.v2.IndexRuleBinding
-	(*v2.Metadata)(nil),           // 12: banyandb.common.v2.Metadata
-	(*timestamppb.Timestamp)(nil), // 13: google.protobuf.Timestamp
-	(v2.Catalog)(0),               // 14: banyandb.common.v2.Catalog
-}
-var file_banyandb_database_v2_schema_proto_depIdxs = []int32{
-	1,  // 0: banyandb.database.v2.Duration.unit:type_name -> banyandb.database.v2.Duration.DurationUnit
-	6,  // 1: banyandb.database.v2.TagFamilySpec.tags:type_name -> banyandb.database.v2.TagSpec
-	0,  // 2: banyandb.database.v2.TagSpec.type:type_name -> banyandb.database.v2.TagType
-	12, // 3: banyandb.database.v2.Stream.metadata:type_name -> banyandb.common.v2.Metadata
-	5,  // 4: banyandb.database.v2.Stream.tag_families:type_name -> banyandb.database.v2.TagFamilySpec
-	8,  // 5: banyandb.database.v2.Stream.entity:type_name -> banyandb.database.v2.Entity
-	4,  // 6: banyandb.database.v2.Stream.duration:type_name -> banyandb.database.v2.Duration
-	13, // 7: banyandb.database.v2.Stream.updated_at:type_name -> google.protobuf.Timestamp
-	12, // 8: banyandb.database.v2.IndexRule.metadata:type_name -> banyandb.common.v2.Metadata
-	2,  // 9: banyandb.database.v2.IndexRule.type:type_name -> banyandb.database.v2.IndexRule.Type
-	3,  // 10: banyandb.database.v2.IndexRule.location:type_name -> banyandb.database.v2.IndexRule.Location
-	13, // 11: banyandb.database.v2.IndexRule.updated_at:type_name -> google.protobuf.Timestamp
-	14, // 12: banyandb.database.v2.Subject.catalog:type_name -> banyandb.common.v2.Catalog
-	12, // 13: banyandb.database.v2.IndexRuleBinding.metadata:type_name -> banyandb.common.v2.Metadata
-	10, // 14: banyandb.database.v2.IndexRuleBinding.subject:type_name -> banyandb.database.v2.Subject
-	13, // 15: banyandb.database.v2.IndexRuleBinding.begin_at:type_name -> google.protobuf.Timestamp
-	13, // 16: banyandb.database.v2.IndexRuleBinding.expire_at:type_name -> google.protobuf.Timestamp
-	13, // 17: banyandb.database.v2.IndexRuleBinding.updated_at:type_name -> google.protobuf.Timestamp
-	18, // [18:18] is the sub-list for method output_type
-	18, // [18:18] is the sub-list for method input_type
-	18, // [18:18] is the sub-list for extension type_name
-	18, // [18:18] is the sub-list for extension extendee
-	0,  // [0:18] is the sub-list for field type_name
-}
-
-func init() { file_banyandb_database_v2_schema_proto_init() }
-func file_banyandb_database_v2_schema_proto_init() {
-	if File_banyandb_database_v2_schema_proto != nil {
-		return
-	}
-	if !protoimpl.UnsafeEnabled {
-		file_banyandb_database_v2_schema_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Duration); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_database_v2_schema_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TagFamilySpec); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_database_v2_schema_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TagSpec); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_database_v2_schema_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Stream); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_database_v2_schema_proto_msgTypes[4].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_database_v2_schema_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*IndexRule); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_database_v2_schema_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Subject); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_database_v2_schema_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*IndexRuleBinding); 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_v2_schema_proto_rawDesc,
-			NumEnums:      4,
-			NumMessages:   8,
-			NumExtensions: 0,
-			NumServices:   0,
-		},
-		GoTypes:           file_banyandb_database_v2_schema_proto_goTypes,
-		DependencyIndexes: file_banyandb_database_v2_schema_proto_depIdxs,
-		EnumInfos:         file_banyandb_database_v2_schema_proto_enumTypes,
-		MessageInfos:      file_banyandb_database_v2_schema_proto_msgTypes,
-	}.Build()
-	File_banyandb_database_v2_schema_proto = out.File
-	file_banyandb_database_v2_schema_proto_rawDesc = nil
-	file_banyandb_database_v2_schema_proto_goTypes = nil
-	file_banyandb_database_v2_schema_proto_depIdxs = nil
-}
diff --git a/api/proto/banyandb/database/v2/schema.proto b/api/proto/banyandb/database/v2/schema.proto
deleted file mode 100644
index a5647a6..0000000
--- a/api/proto/banyandb/database/v2/schema.proto
+++ /dev/null
@@ -1,133 +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.database.v2";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v2";
-
-package banyandb.database.v2;
-
-import "google/protobuf/timestamp.proto";
-import "banyandb/common/v2/common.proto";
-
-// 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;
-}
-
-enum TagType {
-    TAG_TYPE_UNSPECIFIED=0;
-    TAG_TYPE_STRING = 1;
-    TAG_TYPE_INT = 2;
-    TAG_TYPE_STRING_ARRAY = 3;
-    TAG_TYPE_INT_ARRAY = 4;
-    TAG_TYPE_DATA_BINARY = 5;
-}
-
-message TagFamilySpec {
-    string name = 1;
-    // tags defines accepted tags
-    repeated TagSpec tags = 2; 
-}
-
-message TagSpec {
-    string name = 1;
-    TagType type = 2;
-}
-
-// Stream intends to store streaming data, for example, traces or logs
-message Stream {
-    // metadata is the identity of a trace series
-    common.v2.Metadata metadata = 1;
-    // tag_families 
-    repeated TagFamilySpec tag_families = 2;
-    // entity indicates how to generate a series and shard a stream
-    Entity entity = 3;
-    // duration determines how long a TraceSeries keeps its data
-    uint32 shard_num = 4;
-    Duration duration = 5;
-    // updated_at_nanoseconds indicates when the TraceSeries is updated
-    google.protobuf.Timestamp updated_at = 6;
-}
-
-message Entity {
-    repeated string tag_names = 1;
-}
-
-// IndexRule defines how to generate indices based on tags and the index type
-// IndexRule should bind to a subject through an IndexRuleBinding to generate proper indices.
-message IndexRule {
-    // metadata define the rule's identity
-    common.v2.Metadata metadata = 1;
-    // tags are the combination that refers to an indexed object
-    // If the elements in tags are more than 1, the object will generate a multi-tag index
-    // Caveat: All tags in a multi-tag MUST have an identical IndexType
-    repeated string tags = 2;
-    // Type determine the index structure under the hood
-    enum Type {
-        TYPE_UNSPECIFIED = 0;
-        TYPE_TREE = 1;
-        TYPE_INVERTED = 2;
-    }
-    // type is the IndexType of this IndexObject.
-    Type type = 3;
-    enum Location {
-        LOCATION_UNSPECIFIED = 0;
-        LOCATION_SERIES = 1;
-        LOCATION_GLOBAL = 2;
-    }
-    // location indicates where to store index.
-    Location location = 4;
-    // updated_at_nanoseconds indicates when the IndexRule is updated
-    google.protobuf.Timestamp updated_at = 5;
-}
-
-// Subject defines which stream or measure would generate indices
-message Subject {
-    // catalog is where the subject belongs to
-    common.v2.Catalog catalog = 1;
-    // name refers to a stream or measure in a particular catalog
-    string name = 2;
-}
-
-// IndexRuleBinding is a bridge to connect severalIndexRules to a subject
-// 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.v2.Metadata metadata = 1;
-    // rules refers to the IndexRule
-    repeated string rules = 2;
-    // subject indicates the subject of binding action
-    Subject subject = 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/common.pb.go b/api/proto/banyandb/model/v1/common.pb.go
index 05a9cf3..31cb054 100644
--- a/api/proto/banyandb/model/v1/common.pb.go
+++ b/api/proto/banyandb/model/v1/common.pb.go
@@ -29,6 +29,7 @@ import (
 
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	structpb "google.golang.org/protobuf/types/known/structpb"
 )
 
 const (
@@ -226,28 +227,237 @@ func (x *IntArray) GetValue() []int64 {
 	return nil
 }
 
+type TagValue struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Types that are assignable to Value:
+	//	*TagValue_Null
+	//	*TagValue_Str
+	//	*TagValue_StrArray
+	//	*TagValue_Int
+	//	*TagValue_IntArray
+	//	*TagValue_BinaryData
+	Value isTagValue_Value `protobuf_oneof:"value"`
+}
+
+func (x *TagValue) Reset() {
+	*x = TagValue{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_model_v1_common_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *TagValue) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TagValue) ProtoMessage() {}
+
+func (x *TagValue) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_model_v1_common_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 TagValue.ProtoReflect.Descriptor instead.
+func (*TagValue) Descriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_common_proto_rawDescGZIP(), []int{4}
+}
+
+func (m *TagValue) GetValue() isTagValue_Value {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func (x *TagValue) GetNull() structpb.NullValue {
+	if x, ok := x.GetValue().(*TagValue_Null); ok {
+		return x.Null
+	}
+	return structpb.NullValue(0)
+}
+
+func (x *TagValue) GetStr() *Str {
+	if x, ok := x.GetValue().(*TagValue_Str); ok {
+		return x.Str
+	}
+	return nil
+}
+
+func (x *TagValue) GetStrArray() *StrArray {
+	if x, ok := x.GetValue().(*TagValue_StrArray); ok {
+		return x.StrArray
+	}
+	return nil
+}
+
+func (x *TagValue) GetInt() *Int {
+	if x, ok := x.GetValue().(*TagValue_Int); ok {
+		return x.Int
+	}
+	return nil
+}
+
+func (x *TagValue) GetIntArray() *IntArray {
+	if x, ok := x.GetValue().(*TagValue_IntArray); ok {
+		return x.IntArray
+	}
+	return nil
+}
+
+func (x *TagValue) GetBinaryData() []byte {
+	if x, ok := x.GetValue().(*TagValue_BinaryData); ok {
+		return x.BinaryData
+	}
+	return nil
+}
+
+type isTagValue_Value interface {
+	isTagValue_Value()
+}
+
+type TagValue_Null struct {
+	Null structpb.NullValue `protobuf:"varint,1,opt,name=null,proto3,enum=google.protobuf.NullValue,oneof"`
+}
+
+type TagValue_Str struct {
+	Str *Str `protobuf:"bytes,2,opt,name=str,proto3,oneof"`
+}
+
+type TagValue_StrArray struct {
+	StrArray *StrArray `protobuf:"bytes,3,opt,name=str_array,json=strArray,proto3,oneof"`
+}
+
+type TagValue_Int struct {
+	Int *Int `protobuf:"bytes,4,opt,name=int,proto3,oneof"`
+}
+
+type TagValue_IntArray struct {
+	IntArray *IntArray `protobuf:"bytes,5,opt,name=int_array,json=intArray,proto3,oneof"`
+}
+
+type TagValue_BinaryData struct {
+	BinaryData []byte `protobuf:"bytes,6,opt,name=binary_data,json=binaryData,proto3,oneof"`
+}
+
+func (*TagValue_Null) isTagValue_Value() {}
+
+func (*TagValue_Str) isTagValue_Value() {}
+
+func (*TagValue_StrArray) isTagValue_Value() {}
+
+func (*TagValue_Int) isTagValue_Value() {}
+
+func (*TagValue_IntArray) isTagValue_Value() {}
+
+func (*TagValue_BinaryData) isTagValue_Value() {}
+
+type TagFamilyForWrite struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Tags []*TagValue `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty"`
+}
+
+func (x *TagFamilyForWrite) Reset() {
+	*x = TagFamilyForWrite{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_model_v1_common_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *TagFamilyForWrite) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TagFamilyForWrite) ProtoMessage() {}
+
+func (x *TagFamilyForWrite) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_model_v1_common_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 TagFamilyForWrite.ProtoReflect.Descriptor instead.
+func (*TagFamilyForWrite) Descriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_common_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *TagFamilyForWrite) GetTags() []*TagValue {
+	if x != nil {
+		return x.Tags
+	}
+	return nil
+}
+
 var File_banyandb_model_v1_common_proto protoreflect.FileDescriptor
 
 var file_banyandb_model_v1_common_proto_rawDesc = []byte{
 	0x0a, 0x1e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c,
 	0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 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, 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, 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,
+	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,
+	0xb8, 0x02, 0x0a, 0x08, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 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, 0x12, 0x21,
+	0x0a, 0x0b, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20,
+	0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0a, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74,
+	0x61, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x44, 0x0a, 0x11, 0x54, 0x61,
+	0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x46, 0x6f, 0x72, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12,
+	0x2f, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e,
+	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76,
+	0x31, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73,
+	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 (
@@ -262,19 +472,28 @@ func file_banyandb_model_v1_common_proto_rawDescGZIP() []byte {
 	return file_banyandb_model_v1_common_proto_rawDescData
 }
 
-var file_banyandb_model_v1_common_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
+var file_banyandb_model_v1_common_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
 var file_banyandb_model_v1_common_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
+	(*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
+	(*TagValue)(nil),          // 4: banyandb.model.v1.TagValue
+	(*TagFamilyForWrite)(nil), // 5: banyandb.model.v1.TagFamilyForWrite
+	(structpb.NullValue)(0),   // 6: google.protobuf.NullValue
 }
 var file_banyandb_model_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
+	6, // 0: banyandb.model.v1.TagValue.null:type_name -> google.protobuf.NullValue
+	0, // 1: banyandb.model.v1.TagValue.str:type_name -> banyandb.model.v1.Str
+	2, // 2: banyandb.model.v1.TagValue.str_array:type_name -> banyandb.model.v1.StrArray
+	1, // 3: banyandb.model.v1.TagValue.int:type_name -> banyandb.model.v1.Int
+	3, // 4: banyandb.model.v1.TagValue.int_array:type_name -> banyandb.model.v1.IntArray
+	4, // 5: banyandb.model.v1.TagFamilyForWrite.tags:type_name -> banyandb.model.v1.TagValue
+	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_model_v1_common_proto_init() }
@@ -331,6 +550,38 @@ func file_banyandb_model_v1_common_proto_init() {
 				return nil
 			}
 		}
+		file_banyandb_model_v1_common_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TagValue); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_model_v1_common_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TagFamilyForWrite); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_banyandb_model_v1_common_proto_msgTypes[4].OneofWrappers = []interface{}{
+		(*TagValue_Null)(nil),
+		(*TagValue_Str)(nil),
+		(*TagValue_StrArray)(nil),
+		(*TagValue_Int)(nil),
+		(*TagValue_IntArray)(nil),
+		(*TagValue_BinaryData)(nil),
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -338,7 +589,7 @@ func file_banyandb_model_v1_common_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_banyandb_model_v1_common_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   4,
+			NumMessages:   6,
 			NumExtensions: 0,
 			NumServices:   0,
 		},
diff --git a/api/proto/banyandb/model/v1/common.proto b/api/proto/banyandb/model/v1/common.proto
index 59f77e0..2314215 100644
--- a/api/proto/banyandb/model/v1/common.proto
+++ b/api/proto/banyandb/model/v1/common.proto
@@ -22,6 +22,8 @@ package banyandb.model.v1;
 option java_package = "org.apache.skywalking.banyandb.model.v1";
 option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1";
 
+import "google/protobuf/struct.proto";
+
 message Str {
     string value = 1;
 }
@@ -37,3 +39,18 @@ message StrArray {
 message IntArray {
     repeated int64 value = 1;
 }
+
+message TagValue {
+    oneof value {
+        google.protobuf.NullValue null = 1;
+        Str str = 2;
+        StrArray str_array = 3;
+        Int int = 4;
+        IntArray int_array = 5;
+        bytes binary_data = 6;
+    }
+}
+
+message TagFamilyForWrite {
+    repeated TagValue tags = 1;
+}
diff --git a/api/proto/banyandb/model/v1/query.pb.go b/api/proto/banyandb/model/v1/query.pb.go
index bcd3bd5..5c7c225 100644
--- a/api/proto/banyandb/model/v1/query.pb.go
+++ b/api/proto/banyandb/model/v1/query.pb.go
@@ -30,8 +30,6 @@ 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/database/v1"
 )
 
 const (
@@ -45,23 +43,23 @@ const (
 // 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
+type Condition_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
+	Condition_BINARY_OP_UNSPECIFIED Condition_BinaryOp = 0
+	Condition_BINARY_OP_EQ          Condition_BinaryOp = 1
+	Condition_BINARY_OP_NE          Condition_BinaryOp = 2
+	Condition_BINARY_OP_LT          Condition_BinaryOp = 3
+	Condition_BINARY_OP_GT          Condition_BinaryOp = 4
+	Condition_BINARY_OP_LE          Condition_BinaryOp = 5
+	Condition_BINARY_OP_GE          Condition_BinaryOp = 6
+	Condition_BINARY_OP_HAVING      Condition_BinaryOp = 7
+	Condition_BINARY_OP_NOT_HAVING  Condition_BinaryOp = 8
 )
 
-// Enum value maps for PairQuery_BinaryOp.
+// Enum value maps for Condition_BinaryOp.
 var (
-	PairQuery_BinaryOp_name = map[int32]string{
+	Condition_BinaryOp_name = map[int32]string{
 		0: "BINARY_OP_UNSPECIFIED",
 		1: "BINARY_OP_EQ",
 		2: "BINARY_OP_NE",
@@ -72,7 +70,7 @@ var (
 		7: "BINARY_OP_HAVING",
 		8: "BINARY_OP_NOT_HAVING",
 	}
-	PairQuery_BinaryOp_value = map[string]int32{
+	Condition_BinaryOp_value = map[string]int32{
 		"BINARY_OP_UNSPECIFIED": 0,
 		"BINARY_OP_EQ":          1,
 		"BINARY_OP_NE":          2,
@@ -85,31 +83,31 @@ var (
 	}
 )
 
-func (x PairQuery_BinaryOp) Enum() *PairQuery_BinaryOp {
-	p := new(PairQuery_BinaryOp)
+func (x Condition_BinaryOp) Enum() *Condition_BinaryOp {
+	p := new(Condition_BinaryOp)
 	*p = x
 	return p
 }
 
-func (x PairQuery_BinaryOp) String() string {
+func (x Condition_BinaryOp) String() string {
 	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (PairQuery_BinaryOp) Descriptor() protoreflect.EnumDescriptor {
+func (Condition_BinaryOp) Descriptor() protoreflect.EnumDescriptor {
 	return file_banyandb_model_v1_query_proto_enumTypes[0].Descriptor()
 }
 
-func (PairQuery_BinaryOp) Type() protoreflect.EnumType {
+func (Condition_BinaryOp) Type() protoreflect.EnumType {
 	return &file_banyandb_model_v1_query_proto_enumTypes[0]
 }
 
-func (x PairQuery_BinaryOp) Number() protoreflect.EnumNumber {
+func (x Condition_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{1, 0}
+// Deprecated: Use Condition_BinaryOp.Descriptor instead.
+func (Condition_BinaryOp) EnumDescriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{2, 0}
 }
 
 type QueryOrder_Sort int32
@@ -158,30 +156,24 @@ func (x QueryOrder_Sort) Number() protoreflect.EnumNumber {
 
 // Deprecated: Use QueryOrder_Sort.Descriptor instead.
 func (QueryOrder_Sort) EnumDescriptor() ([]byte, []int) {
-	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{2, 0}
+	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{3, 0}
 }
 
 // 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.
+// Besides, other 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 {
+type Tag struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
-	// Types that are assignable to Typed:
-	//	*TypedPair_NullPair
-	//	*TypedPair_IntPair
-	//	*TypedPair_StrPair
-	//	*TypedPair_IntArrayPair
-	//	*TypedPair_StrArrayPair
-	Typed isTypedPair_Typed `protobuf_oneof:"typed"`
+	Key   string    `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
+	Value *TagValue `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
 }
 
-func (x *TypedPair) Reset() {
-	*x = TypedPair{}
+func (x *Tag) Reset() {
+	*x = Tag{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_banyandb_model_v1_query_proto_msgTypes[0]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -189,13 +181,13 @@ func (x *TypedPair) Reset() {
 	}
 }
 
-func (x *TypedPair) String() string {
+func (x *Tag) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*TypedPair) ProtoMessage() {}
+func (*Tag) ProtoMessage() {}
 
-func (x *TypedPair) ProtoReflect() protoreflect.Message {
+func (x *Tag) ProtoReflect() protoreflect.Message {
 	mi := &file_banyandb_model_v1_query_proto_msgTypes[0]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -207,123 +199,110 @@ func (x *TypedPair) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use TypedPair.ProtoReflect.Descriptor instead.
-func (*TypedPair) Descriptor() ([]byte, []int) {
+// Deprecated: Use Tag.ProtoReflect.Descriptor instead.
+func (*Tag) Descriptor() ([]byte, []int) {
 	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{0}
 }
 
-func (x *TypedPair) GetKey() string {
+func (x *Tag) GetKey() string {
 	if x != nil {
 		return x.Key
 	}
 	return ""
 }
 
-func (m *TypedPair) GetTyped() isTypedPair_Typed {
-	if m != nil {
-		return m.Typed
-	}
-	return nil
-}
-
-func (x *TypedPair) GetNullPair() *TypedPair_NullWithType {
-	if x, ok := x.GetTyped().(*TypedPair_NullPair); ok {
-		return x.NullPair
-	}
-	return nil
-}
-
-func (x *TypedPair) GetIntPair() *Int {
-	if x, ok := x.GetTyped().(*TypedPair_IntPair); ok {
-		return x.IntPair
+func (x *Tag) GetValue() *TagValue {
+	if x != nil {
+		return x.Value
 	}
 	return nil
 }
 
-func (x *TypedPair) GetStrPair() *Str {
-	if x, ok := x.GetTyped().(*TypedPair_StrPair); ok {
-		return x.StrPair
-	}
-	return nil
-}
+type TagFamily struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (x *TypedPair) GetIntArrayPair() *IntArray {
-	if x, ok := x.GetTyped().(*TypedPair_IntArrayPair); ok {
-		return x.IntArrayPair
-	}
-	return nil
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Tags []*Tag `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty"`
 }
 
-func (x *TypedPair) GetStrArrayPair() *StrArray {
-	if x, ok := x.GetTyped().(*TypedPair_StrArrayPair); ok {
-		return x.StrArrayPair
+func (x *TagFamily) Reset() {
+	*x = TagFamily{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_model_v1_query_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
 	}
-	return nil
 }
 
-type isTypedPair_Typed interface {
-	isTypedPair_Typed()
+func (x *TagFamily) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-type TypedPair_NullPair struct {
-	NullPair *TypedPair_NullWithType `protobuf:"bytes,2,opt,name=null_pair,json=nullPair,proto3,oneof"`
-}
+func (*TagFamily) ProtoMessage() {}
 
-type TypedPair_IntPair struct {
-	IntPair *Int `protobuf:"bytes,3,opt,name=int_pair,json=intPair,proto3,oneof"`
+func (x *TagFamily) 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)
 }
 
-type TypedPair_StrPair struct {
-	StrPair *Str `protobuf:"bytes,4,opt,name=str_pair,json=strPair,proto3,oneof"`
+// Deprecated: Use TagFamily.ProtoReflect.Descriptor instead.
+func (*TagFamily) Descriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{1}
 }
 
-type TypedPair_IntArrayPair struct {
-	IntArrayPair *IntArray `protobuf:"bytes,5,opt,name=int_array_pair,json=intArrayPair,proto3,oneof"`
+func (x *TagFamily) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
 }
 
-type TypedPair_StrArrayPair struct {
-	StrArrayPair *StrArray `protobuf:"bytes,6,opt,name=str_array_pair,json=strArrayPair,proto3,oneof"`
+func (x *TagFamily) GetTags() []*Tag {
+	if x != nil {
+		return x.Tags
+	}
+	return nil
 }
 
-func (*TypedPair_NullPair) isTypedPair_Typed() {}
-
-func (*TypedPair_IntPair) isTypedPair_Typed() {}
-
-func (*TypedPair_StrPair) isTypedPair_Typed() {}
-
-func (*TypedPair_IntArrayPair) isTypedPair_Typed() {}
-
-func (*TypedPair_StrArrayPair) isTypedPair_Typed() {}
-
-// PairQuery consists of the query condition with a single binary operator to be imposed
+// Condition 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 {
+type Condition 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"`
+	Name  string             `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Op    Condition_BinaryOp `protobuf:"varint,2,opt,name=op,proto3,enum=banyandb.model.v1.Condition_BinaryOp" json:"op,omitempty"`
+	Value *TagValue          `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"`
 }
 
-func (x *PairQuery) Reset() {
-	*x = PairQuery{}
+func (x *Condition) Reset() {
+	*x = Condition{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_model_v1_query_proto_msgTypes[1]
+		mi := &file_banyandb_model_v1_query_proto_msgTypes[2]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
 }
 
-func (x *PairQuery) String() string {
+func (x *Condition) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*PairQuery) ProtoMessage() {}
+func (*Condition) ProtoMessage() {}
 
-func (x *PairQuery) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_model_v1_query_proto_msgTypes[1]
+func (x *Condition) 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 {
@@ -334,40 +313,47 @@ func (x *PairQuery) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use PairQuery.ProtoReflect.Descriptor instead.
-func (*PairQuery) Descriptor() ([]byte, []int) {
-	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{1}
+// Deprecated: Use Condition.ProtoReflect.Descriptor instead.
+func (*Condition) Descriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{2}
 }
 
-func (x *PairQuery) GetOp() PairQuery_BinaryOp {
+func (x *Condition) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Condition) GetOp() Condition_BinaryOp {
 	if x != nil {
 		return x.Op
 	}
-	return PairQuery_BINARY_OP_UNSPECIFIED
+	return Condition_BINARY_OP_UNSPECIFIED
 }
 
-func (x *PairQuery) GetCondition() *TypedPair {
+func (x *Condition) GetValue() *TagValue {
 	if x != nil {
-		return x.Condition
+		return x.Value
 	}
 	return nil
 }
 
-// QueryOrder means a Sort operation to be done for a given field.
-// The key_name refers to the key of a Pair.
+// QueryOrder means a Sort operation to be done for a given index rule.
+// The index_rule_name refers to the name of a index rule bound to the subject.
 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"`
+	IndexRuleName string          `protobuf:"bytes,1,opt,name=index_rule_name,json=indexRuleName,proto3" json:"index_rule_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[2]
+		mi := &file_banyandb_model_v1_query_proto_msgTypes[3]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -380,7 +366,7 @@ func (x *QueryOrder) String() string {
 func (*QueryOrder) ProtoMessage() {}
 
 func (x *QueryOrder) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_model_v1_query_proto_msgTypes[2]
+	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 {
@@ -393,12 +379,12 @@ func (x *QueryOrder) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use QueryOrder.ProtoReflect.Descriptor instead.
 func (*QueryOrder) Descriptor() ([]byte, []int) {
-	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{2}
+	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{3}
 }
 
-func (x *QueryOrder) GetKeyName() string {
+func (x *QueryOrder) GetIndexRuleName() string {
 	if x != nil {
-		return x.KeyName
+		return x.IndexRuleName
 	}
 	return ""
 }
@@ -416,16 +402,14 @@ type Projection struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	// whether binary part is needed
-	DataBinary bool `protobuf:"varint,1,opt,name=data_binary,json=dataBinary,proto3" json:"data_binary,omitempty"`
 	// The key_name refers to the key(s) of Pair(s).
-	KeyNames []string `protobuf:"bytes,2,rep,name=key_names,json=keyNames,proto3" json:"key_names,omitempty"`
+	TagFamilies []*Projection_TagFamily `protobuf:"bytes,1,rep,name=tag_families,json=tagFamilies,proto3" json:"tag_families,omitempty"`
 }
 
 func (x *Projection) Reset() {
 	*x = Projection{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_model_v1_query_proto_msgTypes[3]
+		mi := &file_banyandb_model_v1_query_proto_msgTypes[4]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -438,7 +422,7 @@ func (x *Projection) String() string {
 func (*Projection) ProtoMessage() {}
 
 func (x *Projection) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_model_v1_query_proto_msgTypes[3]
+	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 {
@@ -451,19 +435,12 @@ func (x *Projection) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Projection.ProtoReflect.Descriptor instead.
 func (*Projection) Descriptor() ([]byte, []int) {
-	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{3}
-}
-
-func (x *Projection) GetDataBinary() bool {
-	if x != nil {
-		return x.DataBinary
-	}
-	return false
+	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{4}
 }
 
-func (x *Projection) GetKeyNames() []string {
+func (x *Projection) GetTagFamilies() []*Projection_TagFamily {
 	if x != nil {
-		return x.KeyNames
+		return x.TagFamilies
 	}
 	return nil
 }
@@ -482,7 +459,7 @@ type TimeRange struct {
 func (x *TimeRange) Reset() {
 	*x = TimeRange{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_model_v1_query_proto_msgTypes[4]
+		mi := &file_banyandb_model_v1_query_proto_msgTypes[5]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -495,7 +472,7 @@ func (x *TimeRange) String() string {
 func (*TimeRange) ProtoMessage() {}
 
 func (x *TimeRange) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_model_v1_query_proto_msgTypes[4]
+	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 {
@@ -508,7 +485,7 @@ func (x *TimeRange) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use TimeRange.ProtoReflect.Descriptor instead.
 func (*TimeRange) Descriptor() ([]byte, []int) {
-	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{4}
+	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{5}
 }
 
 func (x *TimeRange) GetBegin() *timestamppb.Timestamp {
@@ -525,31 +502,32 @@ func (x *TimeRange) GetEnd() *timestamppb.Timestamp {
 	return nil
 }
 
-type TypedPair_NullWithType struct {
+type Projection_TagFamily struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Type v1.FieldType `protobuf:"varint,1,opt,name=type,proto3,enum=banyandb.database.v1.FieldType" json:"type,omitempty"`
+	Name string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Tags []string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty"`
 }
 
-func (x *TypedPair_NullWithType) Reset() {
-	*x = TypedPair_NullWithType{}
+func (x *Projection_TagFamily) Reset() {
+	*x = Projection_TagFamily{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_model_v1_query_proto_msgTypes[5]
+		mi := &file_banyandb_model_v1_query_proto_msgTypes[6]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
 }
 
-func (x *TypedPair_NullWithType) String() string {
+func (x *Projection_TagFamily) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*TypedPair_NullWithType) ProtoMessage() {}
+func (*Projection_TagFamily) ProtoMessage() {}
 
-func (x *TypedPair_NullWithType) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_model_v1_query_proto_msgTypes[5]
+func (x *Projection_TagFamily) 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 {
@@ -560,16 +538,23 @@ func (x *TypedPair_NullWithType) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use TypedPair_NullWithType.ProtoReflect.Descriptor instead.
-func (*TypedPair_NullWithType) Descriptor() ([]byte, []int) {
-	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{0, 0}
+// Deprecated: Use Projection_TagFamily.ProtoReflect.Descriptor instead.
+func (*Projection_TagFamily) Descriptor() ([]byte, []int) {
+	return file_banyandb_model_v1_query_proto_rawDescGZIP(), []int{4, 0}
 }
 
-func (x *TypedPair_NullWithType) GetType() v1.FieldType {
+func (x *Projection_TagFamily) GetName() string {
 	if x != nil {
-		return x.Type
+		return x.Name
 	}
-	return v1.FieldType(0)
+	return ""
+}
+
+func (x *Projection_TagFamily) GetTags() []string {
+	if x != nil {
+		return x.Tags
+	}
+	return nil
 }
 
 var File_banyandb_model_v1_query_proto protoreflect.FileDescriptor
@@ -582,85 +567,71 @@ var file_banyandb_model_v1_query_proto_rawDesc = []byte{
 	0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72,
 	0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x6d, 0x6f,
 	0x64, 0x65, 0x6c, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 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, 0xa9, 0x03, 0x0a, 0x09, 0x54, 0x79, 0x70, 0x65, 0x64,
-	0x50, 0x61, 0x69, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x48, 0x0a, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x70,
-	0x61, 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 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, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x57, 0x69, 0x74, 0x68,
-	0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x6e, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x69, 0x72,
-	0x12, 0x33, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x18, 0x03, 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, 0x07, 0x69, 0x6e,
-	0x74, 0x50, 0x61, 0x69, 0x72, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x5f, 0x70, 0x61, 0x69,
-	0x72, 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, 0x53, 0x74, 0x72, 0x48,
-	0x00, 0x52, 0x07, 0x73, 0x74, 0x72, 0x50, 0x61, 0x69, 0x72, 0x12, 0x43, 0x0a, 0x0e, 0x69, 0x6e,
-	0x74, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x5f, 0x70, 0x61, 0x69, 0x72, 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, 0x0c, 0x69, 0x6e, 0x74, 0x41, 0x72, 0x72, 0x61, 0x79, 0x50, 0x61, 0x69, 0x72, 0x12,
-	0x43, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x5f, 0x70, 0x61, 0x69,
-	0x72, 0x18, 0x06, 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, 0x0c, 0x73, 0x74, 0x72, 0x41, 0x72, 0x72, 0x61, 0x79,
-	0x50, 0x61, 0x69, 0x72, 0x1a, 0x43, 0x0a, 0x0c, 0x4e, 0x75, 0x6c, 0x6c, 0x57, 0x69, 0x74, 0x68,
-	0x54, 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x0e, 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, 0x54,
-	0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 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, 0x4a, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69,
-	0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72,
-	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x42, 0x69, 0x6e,
-	0x61, 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73,
-	0x18, 0x02, 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,
+	0x6f, 0x74, 0x6f, 0x22, 0x4a, 0x0a, 0x03, 0x54, 0x61, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,
+	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x31, 0x0a, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 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,
+	0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22,
+	0x4b, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04,
+	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+	0x12, 0x2a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16,
+	0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e,
+	0x76, 0x31, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0xcd, 0x02, 0x0a,
+	0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
+	0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35,
+	0x0a, 0x02, 0x6f, 0x70, 0x18, 0x02, 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, 0x43,
+	0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x4f,
+	0x70, 0x52, 0x02, 0x6f, 0x70, 0x12, 0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 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, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 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, 0xa7, 0x01, 0x0a,
+	0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x69,
+	0x6e, 0x64, 0x65, 0x78, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 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, 0x8d, 0x01, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x6a, 0x65,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x0c, 0x74, 0x61, 0x67, 0x5f, 0x66, 0x61, 0x6d,
+	0x69, 0x6c, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 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, 0x2e, 0x54, 0x61, 0x67, 0x46, 0x61,
+	0x6d, 0x69, 0x6c, 0x79, 0x52, 0x0b, 0x74, 0x61, 0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65,
+	0x73, 0x1a, 0x33, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x12,
+	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
+	0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09,
+	0x52, 0x04, 0x74, 0x61, 0x67, 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 (
@@ -676,40 +647,34 @@ func file_banyandb_model_v1_query_proto_rawDescGZIP() []byte {
 }
 
 var file_banyandb_model_v1_query_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
-var file_banyandb_model_v1_query_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
+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
-	(*TypedPair)(nil),              // 2: banyandb.model.v1.TypedPair
-	(*PairQuery)(nil),              // 3: banyandb.model.v1.PairQuery
-	(*QueryOrder)(nil),             // 4: banyandb.model.v1.QueryOrder
-	(*Projection)(nil),             // 5: banyandb.model.v1.Projection
-	(*TimeRange)(nil),              // 6: banyandb.model.v1.TimeRange
-	(*TypedPair_NullWithType)(nil), // 7: banyandb.model.v1.TypedPair.NullWithType
-	(*Int)(nil),                    // 8: banyandb.model.v1.Int
-	(*Str)(nil),                    // 9: banyandb.model.v1.Str
-	(*IntArray)(nil),               // 10: banyandb.model.v1.IntArray
-	(*StrArray)(nil),               // 11: banyandb.model.v1.StrArray
-	(*timestamppb.Timestamp)(nil),  // 12: google.protobuf.Timestamp
-	(v1.FieldType)(0),              // 13: banyandb.database.v1.FieldType
+	(Condition_BinaryOp)(0),       // 0: banyandb.model.v1.Condition.BinaryOp
+	(QueryOrder_Sort)(0),          // 1: banyandb.model.v1.QueryOrder.Sort
+	(*Tag)(nil),                   // 2: banyandb.model.v1.Tag
+	(*TagFamily)(nil),             // 3: banyandb.model.v1.TagFamily
+	(*Condition)(nil),             // 4: banyandb.model.v1.Condition
+	(*QueryOrder)(nil),            // 5: banyandb.model.v1.QueryOrder
+	(*Projection)(nil),            // 6: banyandb.model.v1.Projection
+	(*TimeRange)(nil),             // 7: banyandb.model.v1.TimeRange
+	(*Projection_TagFamily)(nil),  // 8: banyandb.model.v1.Projection.TagFamily
+	(*TagValue)(nil),              // 9: banyandb.model.v1.TagValue
+	(*timestamppb.Timestamp)(nil), // 10: google.protobuf.Timestamp
 }
 var file_banyandb_model_v1_query_proto_depIdxs = []int32{
-	7,  // 0: banyandb.model.v1.TypedPair.null_pair:type_name -> banyandb.model.v1.TypedPair.NullWithType
-	8,  // 1: banyandb.model.v1.TypedPair.int_pair:type_name -> banyandb.model.v1.Int
-	9,  // 2: banyandb.model.v1.TypedPair.str_pair:type_name -> banyandb.model.v1.Str
-	10, // 3: banyandb.model.v1.TypedPair.int_array_pair:type_name -> banyandb.model.v1.IntArray
-	11, // 4: banyandb.model.v1.TypedPair.str_array_pair:type_name -> banyandb.model.v1.StrArray
-	0,  // 5: banyandb.model.v1.PairQuery.op:type_name -> banyandb.model.v1.PairQuery.BinaryOp
-	2,  // 6: banyandb.model.v1.PairQuery.condition:type_name -> banyandb.model.v1.TypedPair
-	1,  // 7: banyandb.model.v1.QueryOrder.sort:type_name -> banyandb.model.v1.QueryOrder.Sort
-	12, // 8: banyandb.model.v1.TimeRange.begin:type_name -> google.protobuf.Timestamp
-	12, // 9: banyandb.model.v1.TimeRange.end:type_name -> google.protobuf.Timestamp
-	13, // 10: banyandb.model.v1.TypedPair.NullWithType.type:type_name -> banyandb.database.v1.FieldType
-	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
+	9,  // 0: banyandb.model.v1.Tag.value:type_name -> banyandb.model.v1.TagValue
+	2,  // 1: banyandb.model.v1.TagFamily.tags:type_name -> banyandb.model.v1.Tag
+	0,  // 2: banyandb.model.v1.Condition.op:type_name -> banyandb.model.v1.Condition.BinaryOp
+	9,  // 3: banyandb.model.v1.Condition.value:type_name -> banyandb.model.v1.TagValue
+	1,  // 4: banyandb.model.v1.QueryOrder.sort:type_name -> banyandb.model.v1.QueryOrder.Sort
+	8,  // 5: banyandb.model.v1.Projection.tag_families:type_name -> banyandb.model.v1.Projection.TagFamily
+	10, // 6: banyandb.model.v1.TimeRange.begin:type_name -> google.protobuf.Timestamp
+	10, // 7: banyandb.model.v1.TimeRange.end:type_name -> google.protobuf.Timestamp
+	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_model_v1_query_proto_init() }
@@ -720,7 +685,7 @@ func file_banyandb_model_v1_query_proto_init() {
 	file_banyandb_model_v1_common_proto_init()
 	if !protoimpl.UnsafeEnabled {
 		file_banyandb_model_v1_query_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TypedPair); i {
+			switch v := v.(*Tag); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -732,7 +697,7 @@ func file_banyandb_model_v1_query_proto_init() {
 			}
 		}
 		file_banyandb_model_v1_query_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*PairQuery); i {
+			switch v := v.(*TagFamily); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -744,7 +709,7 @@ func file_banyandb_model_v1_query_proto_init() {
 			}
 		}
 		file_banyandb_model_v1_query_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*QueryOrder); i {
+			switch v := v.(*Condition); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -756,7 +721,7 @@ func file_banyandb_model_v1_query_proto_init() {
 			}
 		}
 		file_banyandb_model_v1_query_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Projection); i {
+			switch v := v.(*QueryOrder); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -768,7 +733,7 @@ func file_banyandb_model_v1_query_proto_init() {
 			}
 		}
 		file_banyandb_model_v1_query_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TimeRange); i {
+			switch v := v.(*Projection); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -780,7 +745,19 @@ func file_banyandb_model_v1_query_proto_init() {
 			}
 		}
 		file_banyandb_model_v1_query_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TypedPair_NullWithType); i {
+			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[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Projection_TagFamily); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -791,13 +768,6 @@ func file_banyandb_model_v1_query_proto_init() {
 				return nil
 			}
 		}
-	}
-	file_banyandb_model_v1_query_proto_msgTypes[0].OneofWrappers = []interface{}{
-		(*TypedPair_NullPair)(nil),
-		(*TypedPair_IntPair)(nil),
-		(*TypedPair_StrPair)(nil),
-		(*TypedPair_IntArrayPair)(nil),
-		(*TypedPair_StrArrayPair)(nil),
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -805,7 +775,7 @@ func file_banyandb_model_v1_query_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_banyandb_model_v1_query_proto_rawDesc,
 			NumEnums:      2,
-			NumMessages:   6,
+			NumMessages:   7,
 			NumExtensions: 0,
 			NumServices:   0,
 		},
diff --git a/api/proto/banyandb/model/v1/query.proto b/api/proto/banyandb/model/v1/query.proto
index bede77e..eaacc9f 100644
--- a/api/proto/banyandb/model/v1/query.proto
+++ b/api/proto/banyandb/model/v1/query.proto
@@ -24,31 +24,25 @@ package banyandb.model.v1;
 
 import "google/protobuf/timestamp.proto";
 import "banyandb/model/v1/common.proto";
-import "banyandb/database/v1/schema.proto";
 
 // 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.
+// Besides, other 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 {
+message Tag {
     string key = 1;
-    oneof typed {
-        NullWithType null_pair = 2;
-        Int int_pair = 3;
-        Str str_pair = 4;
-        IntArray int_array_pair = 5;
-        StrArray str_array_pair = 6;
-    }
+    TagValue value = 2;
+}
 
-    message NullWithType {
-        database.v1.FieldType type = 1;
-    }
+message TagFamily {
+    string name = 1;
+    repeated Tag tags = 2;
 }
 
-// PairQuery consists of the query condition with a single binary operator to be imposed
+// Condition 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 {
+message Condition {
     // 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.
@@ -64,14 +58,15 @@ message PairQuery {
         BINARY_OP_HAVING = 7;
         BINARY_OP_NOT_HAVING = 8;
     }
-    BinaryOp op = 1;
-    TypedPair condition = 2;
+    string name = 1;
+    BinaryOp op = 2;
+    TagValue value = 3;
 }
 
-// QueryOrder means a Sort operation to be done for a given field.
-// The key_name refers to the key of a Pair.
+// QueryOrder means a Sort operation to be done for a given index rule.
+// The index_rule_name refers to the name of a index rule bound to the subject.
 message QueryOrder {
-    string key_name = 1;
+    string index_rule_name = 1;
     enum Sort {
         SORT_UNSPECIFIED = 0;
         SORT_DESC = 1;
@@ -82,10 +77,12 @@ message QueryOrder {
 
 // Projection is used to select the names of keys to be returned.
 message Projection {
-    // whether binary part is needed
-    bool data_binary = 1;
+    message TagFamily {
+        string name = 1;
+        repeated string tags = 2;
+    }
     // The key_name refers to the key(s) of Pair(s).
-    repeated string key_names = 2;
+    repeated TagFamily tag_families = 1;
 }
 
 // TimeRange is a range query for uint64,
diff --git a/api/proto/banyandb/model/v1/write.pb.go b/api/proto/banyandb/model/v1/write.pb.go
deleted file mode 100644
index acabf77..0000000
--- a/api/proto/banyandb/model/v1/write.pb.go
+++ /dev/null
@@ -1,280 +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/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 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[0]
-		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[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 Field.ProtoReflect.Descriptor instead.
-func (*Field) Descriptor() ([]byte, []int) {
-	return file_banyandb_model_v1_write_proto_rawDescGZIP(), []int{0}
-}
-
-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,
-	0x1a, 0x1e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c,
-	0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	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, 1)
-var file_banyandb_model_v1_write_proto_goTypes = []interface{}{
-	(*Field)(nil),           // 0: banyandb.model.v1.Field
-	(structpb.NullValue)(0), // 1: google.protobuf.NullValue
-	(*Str)(nil),             // 2: banyandb.model.v1.Str
-	(*StrArray)(nil),        // 3: banyandb.model.v1.StrArray
-	(*Int)(nil),             // 4: banyandb.model.v1.Int
-	(*IntArray)(nil),        // 5: banyandb.model.v1.IntArray
-}
-var file_banyandb_model_v1_write_proto_depIdxs = []int32{
-	1, // 0: banyandb.model.v1.Field.null:type_name -> google.protobuf.NullValue
-	2, // 1: banyandb.model.v1.Field.str:type_name -> banyandb.model.v1.Str
-	3, // 2: banyandb.model.v1.Field.str_array:type_name -> banyandb.model.v1.StrArray
-	4, // 3: banyandb.model.v1.Field.int:type_name -> banyandb.model.v1.Int
-	5, // 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
-	}
-	file_banyandb_model_v1_common_proto_init()
-	if !protoimpl.UnsafeEnabled {
-		file_banyandb_model_v1_write_proto_msgTypes[0].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[0].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:   1,
-			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/model/v1/write.proto b/api/proto/banyandb/model/v1/write.proto
deleted file mode 100644
index 0888346..0000000
--- a/api/proto/banyandb/model/v1/write.proto
+++ /dev/null
@@ -1,36 +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.model.v1";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1";
-
-package banyandb.model.v1;
-
-import "google/protobuf/struct.proto";
-import "banyandb/model/v1/common.proto";
-
-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/model/v2/common.pb.go b/api/proto/banyandb/model/v2/common.pb.go
deleted file mode 100644
index 18cdaea..0000000
--- a/api/proto/banyandb/model/v2/common.pb.go
+++ /dev/null
@@ -1,604 +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/model/v2/common.proto
-
-package v2
-
-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_v2_common_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_v2_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 Str.ProtoReflect.Descriptor instead.
-func (*Str) Descriptor() ([]byte, []int) {
-	return file_banyandb_model_v2_common_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_v2_common_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_v2_common_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_v2_common_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_v2_common_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_v2_common_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_v2_common_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_v2_common_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_v2_common_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_v2_common_proto_rawDescGZIP(), []int{3}
-}
-
-func (x *IntArray) GetValue() []int64 {
-	if x != nil {
-		return x.Value
-	}
-	return nil
-}
-
-type TagValue struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// Types that are assignable to Value:
-	//	*TagValue_Null
-	//	*TagValue_Str
-	//	*TagValue_StrArray
-	//	*TagValue_Int
-	//	*TagValue_IntArray
-	//	*TagValue_BinaryData
-	Value isTagValue_Value `protobuf_oneof:"value"`
-}
-
-func (x *TagValue) Reset() {
-	*x = TagValue{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_model_v2_common_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *TagValue) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*TagValue) ProtoMessage() {}
-
-func (x *TagValue) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_model_v2_common_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 TagValue.ProtoReflect.Descriptor instead.
-func (*TagValue) Descriptor() ([]byte, []int) {
-	return file_banyandb_model_v2_common_proto_rawDescGZIP(), []int{4}
-}
-
-func (m *TagValue) GetValue() isTagValue_Value {
-	if m != nil {
-		return m.Value
-	}
-	return nil
-}
-
-func (x *TagValue) GetNull() structpb.NullValue {
-	if x, ok := x.GetValue().(*TagValue_Null); ok {
-		return x.Null
-	}
-	return structpb.NullValue(0)
-}
-
-func (x *TagValue) GetStr() *Str {
-	if x, ok := x.GetValue().(*TagValue_Str); ok {
-		return x.Str
-	}
-	return nil
-}
-
-func (x *TagValue) GetStrArray() *StrArray {
-	if x, ok := x.GetValue().(*TagValue_StrArray); ok {
-		return x.StrArray
-	}
-	return nil
-}
-
-func (x *TagValue) GetInt() *Int {
-	if x, ok := x.GetValue().(*TagValue_Int); ok {
-		return x.Int
-	}
-	return nil
-}
-
-func (x *TagValue) GetIntArray() *IntArray {
-	if x, ok := x.GetValue().(*TagValue_IntArray); ok {
-		return x.IntArray
-	}
-	return nil
-}
-
-func (x *TagValue) GetBinaryData() []byte {
-	if x, ok := x.GetValue().(*TagValue_BinaryData); ok {
-		return x.BinaryData
-	}
-	return nil
-}
-
-type isTagValue_Value interface {
-	isTagValue_Value()
-}
-
-type TagValue_Null struct {
-	Null structpb.NullValue `protobuf:"varint,1,opt,name=null,proto3,enum=google.protobuf.NullValue,oneof"`
-}
-
-type TagValue_Str struct {
-	Str *Str `protobuf:"bytes,2,opt,name=str,proto3,oneof"`
-}
-
-type TagValue_StrArray struct {
-	StrArray *StrArray `protobuf:"bytes,3,opt,name=str_array,json=strArray,proto3,oneof"`
-}
-
-type TagValue_Int struct {
-	Int *Int `protobuf:"bytes,4,opt,name=int,proto3,oneof"`
-}
-
-type TagValue_IntArray struct {
-	IntArray *IntArray `protobuf:"bytes,5,opt,name=int_array,json=intArray,proto3,oneof"`
-}
-
-type TagValue_BinaryData struct {
-	BinaryData []byte `protobuf:"bytes,6,opt,name=binary_data,json=binaryData,proto3,oneof"`
-}
-
-func (*TagValue_Null) isTagValue_Value() {}
-
-func (*TagValue_Str) isTagValue_Value() {}
-
-func (*TagValue_StrArray) isTagValue_Value() {}
-
-func (*TagValue_Int) isTagValue_Value() {}
-
-func (*TagValue_IntArray) isTagValue_Value() {}
-
-func (*TagValue_BinaryData) isTagValue_Value() {}
-
-type TagFamilyForWrite struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Tags []*TagValue `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty"`
-}
-
-func (x *TagFamilyForWrite) Reset() {
-	*x = TagFamilyForWrite{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_model_v2_common_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *TagFamilyForWrite) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*TagFamilyForWrite) ProtoMessage() {}
-
-func (x *TagFamilyForWrite) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_model_v2_common_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 TagFamilyForWrite.ProtoReflect.Descriptor instead.
-func (*TagFamilyForWrite) Descriptor() ([]byte, []int) {
-	return file_banyandb_model_v2_common_proto_rawDescGZIP(), []int{5}
-}
-
-func (x *TagFamilyForWrite) GetTags() []*TagValue {
-	if x != nil {
-		return x.Tags
-	}
-	return nil
-}
-
-var File_banyandb_model_v2_common_proto protoreflect.FileDescriptor
-
-var file_banyandb_model_v2_common_proto_rawDesc = []byte{
-	0x0a, 0x1e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c,
-	0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x12, 0x11, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c,
-	0x2e, 0x76, 0x32, 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,
-	0xb8, 0x02, 0x0a, 0x08, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 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, 0x32, 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,
-	0x32, 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, 0x32, 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, 0x32, 0x2e, 0x49, 0x6e, 0x74, 0x41, 0x72, 0x72,
-	0x61, 0x79, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x41, 0x72, 0x72, 0x61, 0x79, 0x12, 0x21,
-	0x0a, 0x0b, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20,
-	0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0a, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74,
-	0x61, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x44, 0x0a, 0x11, 0x54, 0x61,
-	0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x46, 0x6f, 0x72, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12,
-	0x2f, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e,
-	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76,
-	0x32, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73,
-	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, 0x32, 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, 0x32, 0x62, 0x06,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
-}
-
-var (
-	file_banyandb_model_v2_common_proto_rawDescOnce sync.Once
-	file_banyandb_model_v2_common_proto_rawDescData = file_banyandb_model_v2_common_proto_rawDesc
-)
-
-func file_banyandb_model_v2_common_proto_rawDescGZIP() []byte {
-	file_banyandb_model_v2_common_proto_rawDescOnce.Do(func() {
-		file_banyandb_model_v2_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_model_v2_common_proto_rawDescData)
-	})
-	return file_banyandb_model_v2_common_proto_rawDescData
-}
-
-var file_banyandb_model_v2_common_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
-var file_banyandb_model_v2_common_proto_goTypes = []interface{}{
-	(*Str)(nil),               // 0: banyandb.model.v2.Str
-	(*Int)(nil),               // 1: banyandb.model.v2.Int
-	(*StrArray)(nil),          // 2: banyandb.model.v2.StrArray
-	(*IntArray)(nil),          // 3: banyandb.model.v2.IntArray
-	(*TagValue)(nil),          // 4: banyandb.model.v2.TagValue
-	(*TagFamilyForWrite)(nil), // 5: banyandb.model.v2.TagFamilyForWrite
-	(structpb.NullValue)(0),   // 6: google.protobuf.NullValue
-}
-var file_banyandb_model_v2_common_proto_depIdxs = []int32{
-	6, // 0: banyandb.model.v2.TagValue.null:type_name -> google.protobuf.NullValue
-	0, // 1: banyandb.model.v2.TagValue.str:type_name -> banyandb.model.v2.Str
-	2, // 2: banyandb.model.v2.TagValue.str_array:type_name -> banyandb.model.v2.StrArray
-	1, // 3: banyandb.model.v2.TagValue.int:type_name -> banyandb.model.v2.Int
-	3, // 4: banyandb.model.v2.TagValue.int_array:type_name -> banyandb.model.v2.IntArray
-	4, // 5: banyandb.model.v2.TagFamilyForWrite.tags:type_name -> banyandb.model.v2.TagValue
-	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_model_v2_common_proto_init() }
-func file_banyandb_model_v2_common_proto_init() {
-	if File_banyandb_model_v2_common_proto != nil {
-		return
-	}
-	if !protoimpl.UnsafeEnabled {
-		file_banyandb_model_v2_common_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_v2_common_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_v2_common_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_v2_common_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_v2_common_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TagValue); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_model_v2_common_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TagFamilyForWrite); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
-	file_banyandb_model_v2_common_proto_msgTypes[4].OneofWrappers = []interface{}{
-		(*TagValue_Null)(nil),
-		(*TagValue_Str)(nil),
-		(*TagValue_StrArray)(nil),
-		(*TagValue_Int)(nil),
-		(*TagValue_IntArray)(nil),
-		(*TagValue_BinaryData)(nil),
-	}
-	type x struct{}
-	out := protoimpl.TypeBuilder{
-		File: protoimpl.DescBuilder{
-			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
-			RawDescriptor: file_banyandb_model_v2_common_proto_rawDesc,
-			NumEnums:      0,
-			NumMessages:   6,
-			NumExtensions: 0,
-			NumServices:   0,
-		},
-		GoTypes:           file_banyandb_model_v2_common_proto_goTypes,
-		DependencyIndexes: file_banyandb_model_v2_common_proto_depIdxs,
-		MessageInfos:      file_banyandb_model_v2_common_proto_msgTypes,
-	}.Build()
-	File_banyandb_model_v2_common_proto = out.File
-	file_banyandb_model_v2_common_proto_rawDesc = nil
-	file_banyandb_model_v2_common_proto_goTypes = nil
-	file_banyandb_model_v2_common_proto_depIdxs = nil
-}
diff --git a/api/proto/banyandb/model/v2/common.proto b/api/proto/banyandb/model/v2/common.proto
deleted file mode 100644
index 5738520..0000000
--- a/api/proto/banyandb/model/v2/common.proto
+++ /dev/null
@@ -1,56 +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";
-
-package banyandb.model.v2;
-
-option java_package = "org.apache.skywalking.banyandb.model.v2";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v2";
-
-import "google/protobuf/struct.proto";
-
-message Str {
-    string value = 1;
-}
-
-message Int {
-    int64 value = 1;
-}
-
-message StrArray {
-    repeated string value = 1;
-}
-
-message IntArray {
-    repeated int64 value = 1;
-}
-
-message TagValue {
-    oneof value {
-        google.protobuf.NullValue null = 1;
-        Str str = 2;
-        StrArray str_array = 3;
-        Int int = 4;
-        IntArray int_array = 5;
-        bytes binary_data = 6;
-    }
-}
-
-message TagFamilyForWrite {
-    repeated TagValue tags = 1;
-}
diff --git a/api/proto/banyandb/model/v2/query.pb.go b/api/proto/banyandb/model/v2/query.pb.go
deleted file mode 100644
index c486d88..0000000
--- a/api/proto/banyandb/model/v2/query.pb.go
+++ /dev/null
@@ -1,791 +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/model/v2/query.proto
-
-package v2
-
-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 Condition_BinaryOp int32
-
-const (
-	Condition_BINARY_OP_UNSPECIFIED Condition_BinaryOp = 0
-	Condition_BINARY_OP_EQ          Condition_BinaryOp = 1
-	Condition_BINARY_OP_NE          Condition_BinaryOp = 2
-	Condition_BINARY_OP_LT          Condition_BinaryOp = 3
-	Condition_BINARY_OP_GT          Condition_BinaryOp = 4
-	Condition_BINARY_OP_LE          Condition_BinaryOp = 5
-	Condition_BINARY_OP_GE          Condition_BinaryOp = 6
-	Condition_BINARY_OP_HAVING      Condition_BinaryOp = 7
-	Condition_BINARY_OP_NOT_HAVING  Condition_BinaryOp = 8
-)
-
-// Enum value maps for Condition_BinaryOp.
-var (
-	Condition_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",
-	}
-	Condition_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 Condition_BinaryOp) Enum() *Condition_BinaryOp {
-	p := new(Condition_BinaryOp)
-	*p = x
-	return p
-}
-
-func (x Condition_BinaryOp) String() string {
-	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
-}
-
-func (Condition_BinaryOp) Descriptor() protoreflect.EnumDescriptor {
-	return file_banyandb_model_v2_query_proto_enumTypes[0].Descriptor()
-}
-
-func (Condition_BinaryOp) Type() protoreflect.EnumType {
-	return &file_banyandb_model_v2_query_proto_enumTypes[0]
-}
-
-func (x Condition_BinaryOp) Number() protoreflect.EnumNumber {
-	return protoreflect.EnumNumber(x)
-}
-
-// Deprecated: Use Condition_BinaryOp.Descriptor instead.
-func (Condition_BinaryOp) EnumDescriptor() ([]byte, []int) {
-	return file_banyandb_model_v2_query_proto_rawDescGZIP(), []int{2, 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_v2_query_proto_enumTypes[1].Descriptor()
-}
-
-func (QueryOrder_Sort) Type() protoreflect.EnumType {
-	return &file_banyandb_model_v2_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_v2_query_proto_rawDescGZIP(), []int{3, 0}
-}
-
-// Pair is the building block of a record which is equivalent to a key-value pair.
-// In the context of Trace, it could be metadata of a trace such as service_name, service_instance, etc.
-// Besides, other tags are organized in key-value pair in the underlying storage layer.
-// One should notice that the values can be a multi-value.
-type Tag struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Key   string    `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
-	Value *TagValue `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
-}
-
-func (x *Tag) Reset() {
-	*x = Tag{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_model_v2_query_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *Tag) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*Tag) ProtoMessage() {}
-
-func (x *Tag) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_model_v2_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 Tag.ProtoReflect.Descriptor instead.
-func (*Tag) Descriptor() ([]byte, []int) {
-	return file_banyandb_model_v2_query_proto_rawDescGZIP(), []int{0}
-}
-
-func (x *Tag) GetKey() string {
-	if x != nil {
-		return x.Key
-	}
-	return ""
-}
-
-func (x *Tag) GetValue() *TagValue {
-	if x != nil {
-		return x.Value
-	}
-	return nil
-}
-
-type TagFamily struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	Tags []*Tag `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty"`
-}
-
-func (x *TagFamily) Reset() {
-	*x = TagFamily{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_model_v2_query_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *TagFamily) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*TagFamily) ProtoMessage() {}
-
-func (x *TagFamily) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_model_v2_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 TagFamily.ProtoReflect.Descriptor instead.
-func (*TagFamily) Descriptor() ([]byte, []int) {
-	return file_banyandb_model_v2_query_proto_rawDescGZIP(), []int{1}
-}
-
-func (x *TagFamily) GetName() string {
-	if x != nil {
-		return x.Name
-	}
-	return ""
-}
-
-func (x *TagFamily) GetTags() []*Tag {
-	if x != nil {
-		return x.Tags
-	}
-	return nil
-}
-
-// Condition 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 Condition struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Name  string             `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	Op    Condition_BinaryOp `protobuf:"varint,2,opt,name=op,proto3,enum=banyandb.model.v2.Condition_BinaryOp" json:"op,omitempty"`
-	Value *TagValue          `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"`
-}
-
-func (x *Condition) Reset() {
-	*x = Condition{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_model_v2_query_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *Condition) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*Condition) ProtoMessage() {}
-
-func (x *Condition) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_model_v2_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 Condition.ProtoReflect.Descriptor instead.
-func (*Condition) Descriptor() ([]byte, []int) {
-	return file_banyandb_model_v2_query_proto_rawDescGZIP(), []int{2}
-}
-
-func (x *Condition) GetName() string {
-	if x != nil {
-		return x.Name
-	}
-	return ""
-}
-
-func (x *Condition) GetOp() Condition_BinaryOp {
-	if x != nil {
-		return x.Op
-	}
-	return Condition_BINARY_OP_UNSPECIFIED
-}
-
-func (x *Condition) GetValue() *TagValue {
-	if x != nil {
-		return x.Value
-	}
-	return nil
-}
-
-// QueryOrder means a Sort operation to be done for a given index rule.
-// The index_rule_name refers to the name of a index rule bound to the subject.
-type QueryOrder struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	IndexRuleName string          `protobuf:"bytes,1,opt,name=index_rule_name,json=indexRuleName,proto3" json:"index_rule_name,omitempty"`
-	Sort          QueryOrder_Sort `protobuf:"varint,2,opt,name=sort,proto3,enum=banyandb.model.v2.QueryOrder_Sort" json:"sort,omitempty"`
-}
-
-func (x *QueryOrder) Reset() {
-	*x = QueryOrder{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_model_v2_query_proto_msgTypes[3]
-		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_v2_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 QueryOrder.ProtoReflect.Descriptor instead.
-func (*QueryOrder) Descriptor() ([]byte, []int) {
-	return file_banyandb_model_v2_query_proto_rawDescGZIP(), []int{3}
-}
-
-func (x *QueryOrder) GetIndexRuleName() string {
-	if x != nil {
-		return x.IndexRuleName
-	}
-	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).
-	TagFamilies []*Projection_TagFamily `protobuf:"bytes,1,rep,name=tag_families,json=tagFamilies,proto3" json:"tag_families,omitempty"`
-}
-
-func (x *Projection) Reset() {
-	*x = Projection{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_model_v2_query_proto_msgTypes[4]
-		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_v2_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 Projection.ProtoReflect.Descriptor instead.
-func (*Projection) Descriptor() ([]byte, []int) {
-	return file_banyandb_model_v2_query_proto_rawDescGZIP(), []int{4}
-}
-
-func (x *Projection) GetTagFamilies() []*Projection_TagFamily {
-	if x != nil {
-		return x.TagFamilies
-	}
-	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_v2_query_proto_msgTypes[5]
-		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_v2_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 TimeRange.ProtoReflect.Descriptor instead.
-func (*TimeRange) Descriptor() ([]byte, []int) {
-	return file_banyandb_model_v2_query_proto_rawDescGZIP(), []int{5}
-}
-
-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
-}
-
-type Projection_TagFamily struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Name string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	Tags []string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty"`
-}
-
-func (x *Projection_TagFamily) Reset() {
-	*x = Projection_TagFamily{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_model_v2_query_proto_msgTypes[6]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *Projection_TagFamily) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*Projection_TagFamily) ProtoMessage() {}
-
-func (x *Projection_TagFamily) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_model_v2_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 Projection_TagFamily.ProtoReflect.Descriptor instead.
-func (*Projection_TagFamily) Descriptor() ([]byte, []int) {
-	return file_banyandb_model_v2_query_proto_rawDescGZIP(), []int{4, 0}
-}
-
-func (x *Projection_TagFamily) GetName() string {
-	if x != nil {
-		return x.Name
-	}
-	return ""
-}
-
-func (x *Projection_TagFamily) GetTags() []string {
-	if x != nil {
-		return x.Tags
-	}
-	return nil
-}
-
-var File_banyandb_model_v2_query_proto protoreflect.FileDescriptor
-
-var file_banyandb_model_v2_query_proto_rawDesc = []byte{
-	0x0a, 0x1d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c,
-	0x2f, 0x76, 0x32, 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, 0x32, 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, 0x1e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x6d, 0x6f,
-	0x64, 0x65, 0x6c, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x22, 0x4a, 0x0a, 0x03, 0x54, 0x61, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,
-	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x31, 0x0a, 0x05,
-	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x61,
-	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76, 0x32, 0x2e,
-	0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22,
-	0x4b, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04,
-	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
-	0x12, 0x2a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16,
-	0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e,
-	0x76, 0x32, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0xcd, 0x02, 0x0a,
-	0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
-	0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35,
-	0x0a, 0x02, 0x6f, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x62, 0x61, 0x6e,
-	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76, 0x32, 0x2e, 0x43,
-	0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x4f,
-	0x70, 0x52, 0x02, 0x6f, 0x70, 0x12, 0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 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, 0x32, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75,
-	0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 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, 0xa7, 0x01, 0x0a,
-	0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x69,
-	0x6e, 0x64, 0x65, 0x78, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 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, 0x32, 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, 0x8d, 0x01, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x6a, 0x65,
-	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x0c, 0x74, 0x61, 0x67, 0x5f, 0x66, 0x61, 0x6d,
-	0x69, 0x6c, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x61,
-	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76, 0x32, 0x2e,
-	0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x61, 0x67, 0x46, 0x61,
-	0x6d, 0x69, 0x6c, 0x79, 0x52, 0x0b, 0x74, 0x61, 0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65,
-	0x73, 0x1a, 0x33, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x12,
-	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
-	0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09,
-	0x52, 0x04, 0x74, 0x61, 0x67, 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, 0x32, 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,
-	0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
-}
-
-var (
-	file_banyandb_model_v2_query_proto_rawDescOnce sync.Once
-	file_banyandb_model_v2_query_proto_rawDescData = file_banyandb_model_v2_query_proto_rawDesc
-)
-
-func file_banyandb_model_v2_query_proto_rawDescGZIP() []byte {
-	file_banyandb_model_v2_query_proto_rawDescOnce.Do(func() {
-		file_banyandb_model_v2_query_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_model_v2_query_proto_rawDescData)
-	})
-	return file_banyandb_model_v2_query_proto_rawDescData
-}
-
-var file_banyandb_model_v2_query_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
-var file_banyandb_model_v2_query_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
-var file_banyandb_model_v2_query_proto_goTypes = []interface{}{
-	(Condition_BinaryOp)(0),       // 0: banyandb.model.v2.Condition.BinaryOp
-	(QueryOrder_Sort)(0),          // 1: banyandb.model.v2.QueryOrder.Sort
-	(*Tag)(nil),                   // 2: banyandb.model.v2.Tag
-	(*TagFamily)(nil),             // 3: banyandb.model.v2.TagFamily
-	(*Condition)(nil),             // 4: banyandb.model.v2.Condition
-	(*QueryOrder)(nil),            // 5: banyandb.model.v2.QueryOrder
-	(*Projection)(nil),            // 6: banyandb.model.v2.Projection
-	(*TimeRange)(nil),             // 7: banyandb.model.v2.TimeRange
-	(*Projection_TagFamily)(nil),  // 8: banyandb.model.v2.Projection.TagFamily
-	(*TagValue)(nil),              // 9: banyandb.model.v2.TagValue
-	(*timestamppb.Timestamp)(nil), // 10: google.protobuf.Timestamp
-}
-var file_banyandb_model_v2_query_proto_depIdxs = []int32{
-	9,  // 0: banyandb.model.v2.Tag.value:type_name -> banyandb.model.v2.TagValue
-	2,  // 1: banyandb.model.v2.TagFamily.tags:type_name -> banyandb.model.v2.Tag
-	0,  // 2: banyandb.model.v2.Condition.op:type_name -> banyandb.model.v2.Condition.BinaryOp
-	9,  // 3: banyandb.model.v2.Condition.value:type_name -> banyandb.model.v2.TagValue
-	1,  // 4: banyandb.model.v2.QueryOrder.sort:type_name -> banyandb.model.v2.QueryOrder.Sort
-	8,  // 5: banyandb.model.v2.Projection.tag_families:type_name -> banyandb.model.v2.Projection.TagFamily
-	10, // 6: banyandb.model.v2.TimeRange.begin:type_name -> google.protobuf.Timestamp
-	10, // 7: banyandb.model.v2.TimeRange.end:type_name -> google.protobuf.Timestamp
-	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_model_v2_query_proto_init() }
-func file_banyandb_model_v2_query_proto_init() {
-	if File_banyandb_model_v2_query_proto != nil {
-		return
-	}
-	file_banyandb_model_v2_common_proto_init()
-	if !protoimpl.UnsafeEnabled {
-		file_banyandb_model_v2_query_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Tag); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_model_v2_query_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TagFamily); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_model_v2_query_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Condition); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_banyandb_model_v2_query_proto_msgTypes[3].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_v2_query_proto_msgTypes[4].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_v2_query_proto_msgTypes[5].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_v2_query_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Projection_TagFamily); 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_model_v2_query_proto_rawDesc,
-			NumEnums:      2,
-			NumMessages:   7,
-			NumExtensions: 0,
-			NumServices:   0,
-		},
-		GoTypes:           file_banyandb_model_v2_query_proto_goTypes,
-		DependencyIndexes: file_banyandb_model_v2_query_proto_depIdxs,
-		EnumInfos:         file_banyandb_model_v2_query_proto_enumTypes,
-		MessageInfos:      file_banyandb_model_v2_query_proto_msgTypes,
-	}.Build()
-	File_banyandb_model_v2_query_proto = out.File
-	file_banyandb_model_v2_query_proto_rawDesc = nil
-	file_banyandb_model_v2_query_proto_goTypes = nil
-	file_banyandb_model_v2_query_proto_depIdxs = nil
-}
diff --git a/api/proto/banyandb/model/v2/query.proto b/api/proto/banyandb/model/v2/query.proto
deleted file mode 100644
index 5c93673..0000000
--- a/api/proto/banyandb/model/v2/query.proto
+++ /dev/null
@@ -1,93 +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.model.v2";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v2";
-
-package banyandb.model.v2;
-
-import "google/protobuf/timestamp.proto";
-import "banyandb/model/v2/common.proto";
-
-// Pair is the building block of a record which is equivalent to a key-value pair.
-// In the context of Trace, it could be metadata of a trace such as service_name, service_instance, etc.
-// Besides, other tags are organized in key-value pair in the underlying storage layer.
-// One should notice that the values can be a multi-value.
-message Tag {
-    string key = 1;
-    TagValue value = 2;
-}
-
-message TagFamily {
-    string name = 1;
-    repeated Tag tags = 2;
-}
-
-// Condition 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 Condition {
-    // 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;
-    }
-    string name = 1;
-    BinaryOp op = 2;
-    TagValue value = 3;
-}
-
-// QueryOrder means a Sort operation to be done for a given index rule.
-// The index_rule_name refers to the name of a index rule bound to the subject.
-message QueryOrder {
-    string index_rule_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 {
-    message TagFamily {
-        string name = 1;
-        repeated string tags = 2;
-    }
-    // The key_name refers to the key(s) of Pair(s).
-    repeated TagFamily tag_families = 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/stream/v2/query.pb.go b/api/proto/banyandb/stream/v1/query.pb.go
similarity index 73%
rename from api/proto/banyandb/stream/v2/query.pb.go
rename to api/proto/banyandb/stream/v1/query.pb.go
index 5ad9ae1..4175baa 100644
--- a/api/proto/banyandb/stream/v2/query.pb.go
+++ b/api/proto/banyandb/stream/v1/query.pb.go
@@ -19,9 +19,9 @@
 // versions:
 // 	protoc-gen-go v1.27.1
 // 	protoc        v3.17.3
-// source: banyandb/stream/v2/query.proto
+// source: banyandb/stream/v1/query.proto
 
-package v2
+package v1
 
 import (
 	reflect "reflect"
@@ -31,8 +31,8 @@ import (
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
 
-	v21 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v2"
-	v2 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v2"
+	v11 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
 )
 
 const (
@@ -62,13 +62,13 @@ type Element struct {
 	// - service_name
 	// - service_instance_id
 	// - end_time_nanoseconds
-	TagFamilies []*v2.TagFamily `protobuf:"bytes,3,rep,name=tag_families,json=tagFamilies,proto3" json:"tag_families,omitempty"`
+	TagFamilies []*v1.TagFamily `protobuf:"bytes,3,rep,name=tag_families,json=tagFamilies,proto3" json:"tag_families,omitempty"`
 }
 
 func (x *Element) Reset() {
 	*x = Element{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_stream_v2_query_proto_msgTypes[0]
+		mi := &file_banyandb_stream_v1_query_proto_msgTypes[0]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -81,7 +81,7 @@ func (x *Element) String() string {
 func (*Element) ProtoMessage() {}
 
 func (x *Element) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_stream_v2_query_proto_msgTypes[0]
+	mi := &file_banyandb_stream_v1_query_proto_msgTypes[0]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -94,7 +94,7 @@ func (x *Element) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Element.ProtoReflect.Descriptor instead.
 func (*Element) Descriptor() ([]byte, []int) {
-	return file_banyandb_stream_v2_query_proto_rawDescGZIP(), []int{0}
+	return file_banyandb_stream_v1_query_proto_rawDescGZIP(), []int{0}
 }
 
 func (x *Element) GetElementId() string {
@@ -111,7 +111,7 @@ func (x *Element) GetTimestamp() *timestamppb.Timestamp {
 	return nil
 }
 
-func (x *Element) GetTagFamilies() []*v2.TagFamily {
+func (x *Element) GetTagFamilies() []*v1.TagFamily {
 	if x != nil {
 		return x.TagFamilies
 	}
@@ -131,7 +131,7 @@ type QueryResponse struct {
 func (x *QueryResponse) Reset() {
 	*x = QueryResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_stream_v2_query_proto_msgTypes[1]
+		mi := &file_banyandb_stream_v1_query_proto_msgTypes[1]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -144,7 +144,7 @@ func (x *QueryResponse) String() string {
 func (*QueryResponse) ProtoMessage() {}
 
 func (x *QueryResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_stream_v2_query_proto_msgTypes[1]
+	mi := &file_banyandb_stream_v1_query_proto_msgTypes[1]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -157,7 +157,7 @@ func (x *QueryResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use QueryResponse.ProtoReflect.Descriptor instead.
 func (*QueryResponse) Descriptor() ([]byte, []int) {
-	return file_banyandb_stream_v2_query_proto_rawDescGZIP(), []int{1}
+	return file_banyandb_stream_v1_query_proto_rawDescGZIP(), []int{1}
 }
 
 func (x *QueryResponse) GetElements() []*Element {
@@ -174,27 +174,27 @@ type QueryRequest struct {
 	unknownFields protoimpl.UnknownFields
 
 	// metadata is required
-	Metadata *v21.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
+	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 stream, 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 *v2.TimeRange `protobuf:"bytes,2,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"`
+	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  *v2.QueryOrder           `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
+	OrderBy  *v1.QueryOrder           `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
 	Criteria []*QueryRequest_Criteria `protobuf:"bytes,6,rep,name=criteria,proto3" json:"criteria,omitempty"`
 	// projection can be used to select the key names of the element in the response
-	Projection *v2.Projection `protobuf:"bytes,7,opt,name=projection,proto3" json:"projection,omitempty"`
+	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_stream_v2_query_proto_msgTypes[2]
+		mi := &file_banyandb_stream_v1_query_proto_msgTypes[2]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -207,7 +207,7 @@ func (x *QueryRequest) String() string {
 func (*QueryRequest) ProtoMessage() {}
 
 func (x *QueryRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_stream_v2_query_proto_msgTypes[2]
+	mi := &file_banyandb_stream_v1_query_proto_msgTypes[2]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -220,17 +220,17 @@ func (x *QueryRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use QueryRequest.ProtoReflect.Descriptor instead.
 func (*QueryRequest) Descriptor() ([]byte, []int) {
-	return file_banyandb_stream_v2_query_proto_rawDescGZIP(), []int{2}
+	return file_banyandb_stream_v1_query_proto_rawDescGZIP(), []int{2}
 }
 
-func (x *QueryRequest) GetMetadata() *v21.Metadata {
+func (x *QueryRequest) GetMetadata() *v11.Metadata {
 	if x != nil {
 		return x.Metadata
 	}
 	return nil
 }
 
-func (x *QueryRequest) GetTimeRange() *v2.TimeRange {
+func (x *QueryRequest) GetTimeRange() *v1.TimeRange {
 	if x != nil {
 		return x.TimeRange
 	}
@@ -251,7 +251,7 @@ func (x *QueryRequest) GetLimit() uint32 {
 	return 0
 }
 
-func (x *QueryRequest) GetOrderBy() *v2.QueryOrder {
+func (x *QueryRequest) GetOrderBy() *v1.QueryOrder {
 	if x != nil {
 		return x.OrderBy
 	}
@@ -265,7 +265,7 @@ func (x *QueryRequest) GetCriteria() []*QueryRequest_Criteria {
 	return nil
 }
 
-func (x *QueryRequest) GetProjection() *v2.Projection {
+func (x *QueryRequest) GetProjection() *v1.Projection {
 	if x != nil {
 		return x.Projection
 	}
@@ -279,13 +279,13 @@ type QueryRequest_Criteria struct {
 	unknownFields protoimpl.UnknownFields
 
 	TagFamilyName string          `protobuf:"bytes,1,opt,name=tag_family_name,json=tagFamilyName,proto3" json:"tag_family_name,omitempty"`
-	Conditions    []*v2.Condition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"`
+	Conditions    []*v1.Condition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"`
 }
 
 func (x *QueryRequest_Criteria) Reset() {
 	*x = QueryRequest_Criteria{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_stream_v2_query_proto_msgTypes[3]
+		mi := &file_banyandb_stream_v1_query_proto_msgTypes[3]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -298,7 +298,7 @@ func (x *QueryRequest_Criteria) String() string {
 func (*QueryRequest_Criteria) ProtoMessage() {}
 
 func (x *QueryRequest_Criteria) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_stream_v2_query_proto_msgTypes[3]
+	mi := &file_banyandb_stream_v1_query_proto_msgTypes[3]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -311,7 +311,7 @@ func (x *QueryRequest_Criteria) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use QueryRequest_Criteria.ProtoReflect.Descriptor instead.
 func (*QueryRequest_Criteria) Descriptor() ([]byte, []int) {
-	return file_banyandb_stream_v2_query_proto_rawDescGZIP(), []int{2, 0}
+	return file_banyandb_stream_v1_query_proto_rawDescGZIP(), []int{2, 0}
 }
 
 func (x *QueryRequest_Criteria) GetTagFamilyName() string {
@@ -321,25 +321,25 @@ func (x *QueryRequest_Criteria) GetTagFamilyName() string {
 	return ""
 }
 
-func (x *QueryRequest_Criteria) GetConditions() []*v2.Condition {
+func (x *QueryRequest_Criteria) GetConditions() []*v1.Condition {
 	if x != nil {
 		return x.Conditions
 	}
 	return nil
 }
 
-var File_banyandb_stream_v2_query_proto protoreflect.FileDescriptor
+var File_banyandb_stream_v1_query_proto protoreflect.FileDescriptor
 
-var file_banyandb_stream_v2_query_proto_rawDesc = []byte{
+var file_banyandb_stream_v1_query_proto_rawDesc = []byte{
 	0x0a, 0x1e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61,
-	0x6d, 0x2f, 0x76, 0x32, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
 	0x12, 0x12, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61,
-	0x6d, 0x2e, 0x76, 0x32, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f,
+	0x6d, 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, 0x32, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+	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, 0x32, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e,
+	0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2f, 0x76, 0x31, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e,
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa3, 0x01, 0x0a, 0x07, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
 	0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18,
 	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64,
@@ -349,89 +349,89 @@ var file_banyandb_stream_v2_query_proto_rawDesc = []byte{
 	0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3f, 0x0a, 0x0c, 0x74, 0x61,
 	0x67, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b,
 	0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65,
-	0x6c, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x61, 0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x52, 0x0b,
+	0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x52, 0x0b,
 	0x74, 0x61, 0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x22, 0x48, 0x0a, 0x0d, 0x51,
 	0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x08,
 	0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b,
 	0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d,
-	0x2e, 0x76, 0x32, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x65, 0x6c, 0x65,
+	0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x65, 0x6c, 0x65,
 	0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xe5, 0x03, 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, 0x32, 0x2e, 0x4d, 0x65,
+	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, 0x32, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e,
+	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,
-	0x32, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x07, 0x6f, 0x72,
+	0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x07, 0x6f, 0x72,
 	0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x45, 0x0a, 0x08, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69,
 	0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
-	0x64, 0x62, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x32, 0x2e, 0x51, 0x75, 0x65,
+	0x64, 0x62, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65,
 	0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72,
 	0x69, 0x61, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 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, 0x32, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52,
+	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, 0x1a, 0x70, 0x0a, 0x08, 0x43,
 	0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x61, 0x67, 0x5f, 0x66,
 	0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
 	0x52, 0x0d, 0x74, 0x61, 0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12,
 	0x3c, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20,
 	0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x6d,
-	0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f,
+	0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f,
 	0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 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,
-	0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x32, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75,
+	0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 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, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2f, 0x76, 0x32, 0x62, 0x06, 0x70,
+	0x6e, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70,
 	0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
-	file_banyandb_stream_v2_query_proto_rawDescOnce sync.Once
-	file_banyandb_stream_v2_query_proto_rawDescData = file_banyandb_stream_v2_query_proto_rawDesc
+	file_banyandb_stream_v1_query_proto_rawDescOnce sync.Once
+	file_banyandb_stream_v1_query_proto_rawDescData = file_banyandb_stream_v1_query_proto_rawDesc
 )
 
-func file_banyandb_stream_v2_query_proto_rawDescGZIP() []byte {
-	file_banyandb_stream_v2_query_proto_rawDescOnce.Do(func() {
-		file_banyandb_stream_v2_query_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_stream_v2_query_proto_rawDescData)
+func file_banyandb_stream_v1_query_proto_rawDescGZIP() []byte {
+	file_banyandb_stream_v1_query_proto_rawDescOnce.Do(func() {
+		file_banyandb_stream_v1_query_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_stream_v1_query_proto_rawDescData)
 	})
-	return file_banyandb_stream_v2_query_proto_rawDescData
+	return file_banyandb_stream_v1_query_proto_rawDescData
 }
 
-var file_banyandb_stream_v2_query_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
-var file_banyandb_stream_v2_query_proto_goTypes = []interface{}{
-	(*Element)(nil),               // 0: banyandb.stream.v2.Element
-	(*QueryResponse)(nil),         // 1: banyandb.stream.v2.QueryResponse
-	(*QueryRequest)(nil),          // 2: banyandb.stream.v2.QueryRequest
-	(*QueryRequest_Criteria)(nil), // 3: banyandb.stream.v2.QueryRequest.Criteria
+var file_banyandb_stream_v1_query_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
+var file_banyandb_stream_v1_query_proto_goTypes = []interface{}{
+	(*Element)(nil),               // 0: banyandb.stream.v1.Element
+	(*QueryResponse)(nil),         // 1: banyandb.stream.v1.QueryResponse
+	(*QueryRequest)(nil),          // 2: banyandb.stream.v1.QueryRequest
+	(*QueryRequest_Criteria)(nil), // 3: banyandb.stream.v1.QueryRequest.Criteria
 	(*timestamppb.Timestamp)(nil), // 4: google.protobuf.Timestamp
-	(*v2.TagFamily)(nil),          // 5: banyandb.model.v2.TagFamily
-	(*v21.Metadata)(nil),          // 6: banyandb.common.v2.Metadata
-	(*v2.TimeRange)(nil),          // 7: banyandb.model.v2.TimeRange
-	(*v2.QueryOrder)(nil),         // 8: banyandb.model.v2.QueryOrder
-	(*v2.Projection)(nil),         // 9: banyandb.model.v2.Projection
-	(*v2.Condition)(nil),          // 10: banyandb.model.v2.Condition
-}
-var file_banyandb_stream_v2_query_proto_depIdxs = []int32{
-	4,  // 0: banyandb.stream.v2.Element.timestamp:type_name -> google.protobuf.Timestamp
-	5,  // 1: banyandb.stream.v2.Element.tag_families:type_name -> banyandb.model.v2.TagFamily
-	0,  // 2: banyandb.stream.v2.QueryResponse.elements:type_name -> banyandb.stream.v2.Element
-	6,  // 3: banyandb.stream.v2.QueryRequest.metadata:type_name -> banyandb.common.v2.Metadata
-	7,  // 4: banyandb.stream.v2.QueryRequest.time_range:type_name -> banyandb.model.v2.TimeRange
-	8,  // 5: banyandb.stream.v2.QueryRequest.order_by:type_name -> banyandb.model.v2.QueryOrder
-	3,  // 6: banyandb.stream.v2.QueryRequest.criteria:type_name -> banyandb.stream.v2.QueryRequest.Criteria
-	9,  // 7: banyandb.stream.v2.QueryRequest.projection:type_name -> banyandb.model.v2.Projection
-	10, // 8: banyandb.stream.v2.QueryRequest.Criteria.conditions:type_name -> banyandb.model.v2.Condition
+	(*v1.TagFamily)(nil),          // 5: banyandb.model.v1.TagFamily
+	(*v11.Metadata)(nil),          // 6: banyandb.common.v1.Metadata
+	(*v1.TimeRange)(nil),          // 7: banyandb.model.v1.TimeRange
+	(*v1.QueryOrder)(nil),         // 8: banyandb.model.v1.QueryOrder
+	(*v1.Projection)(nil),         // 9: banyandb.model.v1.Projection
+	(*v1.Condition)(nil),          // 10: banyandb.model.v1.Condition
+}
+var file_banyandb_stream_v1_query_proto_depIdxs = []int32{
+	4,  // 0: banyandb.stream.v1.Element.timestamp:type_name -> google.protobuf.Timestamp
+	5,  // 1: banyandb.stream.v1.Element.tag_families:type_name -> banyandb.model.v1.TagFamily
+	0,  // 2: banyandb.stream.v1.QueryResponse.elements:type_name -> banyandb.stream.v1.Element
+	6,  // 3: banyandb.stream.v1.QueryRequest.metadata:type_name -> banyandb.common.v1.Metadata
+	7,  // 4: banyandb.stream.v1.QueryRequest.time_range:type_name -> banyandb.model.v1.TimeRange
+	8,  // 5: banyandb.stream.v1.QueryRequest.order_by:type_name -> banyandb.model.v1.QueryOrder
+	3,  // 6: banyandb.stream.v1.QueryRequest.criteria:type_name -> banyandb.stream.v1.QueryRequest.Criteria
+	9,  // 7: banyandb.stream.v1.QueryRequest.projection:type_name -> banyandb.model.v1.Projection
+	10, // 8: banyandb.stream.v1.QueryRequest.Criteria.conditions:type_name -> banyandb.model.v1.Condition
 	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
@@ -439,13 +439,13 @@ var file_banyandb_stream_v2_query_proto_depIdxs = []int32{
 	0,  // [0:9] is the sub-list for field type_name
 }
 
-func init() { file_banyandb_stream_v2_query_proto_init() }
-func file_banyandb_stream_v2_query_proto_init() {
-	if File_banyandb_stream_v2_query_proto != nil {
+func init() { file_banyandb_stream_v1_query_proto_init() }
+func file_banyandb_stream_v1_query_proto_init() {
+	if File_banyandb_stream_v1_query_proto != nil {
 		return
 	}
 	if !protoimpl.UnsafeEnabled {
-		file_banyandb_stream_v2_query_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+		file_banyandb_stream_v1_query_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Element); i {
 			case 0:
 				return &v.state
@@ -457,7 +457,7 @@ func file_banyandb_stream_v2_query_proto_init() {
 				return nil
 			}
 		}
-		file_banyandb_stream_v2_query_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+		file_banyandb_stream_v1_query_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*QueryResponse); i {
 			case 0:
 				return &v.state
@@ -469,7 +469,7 @@ func file_banyandb_stream_v2_query_proto_init() {
 				return nil
 			}
 		}
-		file_banyandb_stream_v2_query_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+		file_banyandb_stream_v1_query_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*QueryRequest); i {
 			case 0:
 				return &v.state
@@ -481,7 +481,7 @@ func file_banyandb_stream_v2_query_proto_init() {
 				return nil
 			}
 		}
-		file_banyandb_stream_v2_query_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+		file_banyandb_stream_v1_query_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*QueryRequest_Criteria); i {
 			case 0:
 				return &v.state
@@ -498,18 +498,18 @@ func file_banyandb_stream_v2_query_proto_init() {
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
-			RawDescriptor: file_banyandb_stream_v2_query_proto_rawDesc,
+			RawDescriptor: file_banyandb_stream_v1_query_proto_rawDesc,
 			NumEnums:      0,
 			NumMessages:   4,
 			NumExtensions: 0,
 			NumServices:   0,
 		},
-		GoTypes:           file_banyandb_stream_v2_query_proto_goTypes,
-		DependencyIndexes: file_banyandb_stream_v2_query_proto_depIdxs,
-		MessageInfos:      file_banyandb_stream_v2_query_proto_msgTypes,
+		GoTypes:           file_banyandb_stream_v1_query_proto_goTypes,
+		DependencyIndexes: file_banyandb_stream_v1_query_proto_depIdxs,
+		MessageInfos:      file_banyandb_stream_v1_query_proto_msgTypes,
 	}.Build()
-	File_banyandb_stream_v2_query_proto = out.File
-	file_banyandb_stream_v2_query_proto_rawDesc = nil
-	file_banyandb_stream_v2_query_proto_goTypes = nil
-	file_banyandb_stream_v2_query_proto_depIdxs = nil
+	File_banyandb_stream_v1_query_proto = out.File
+	file_banyandb_stream_v1_query_proto_rawDesc = nil
+	file_banyandb_stream_v1_query_proto_goTypes = nil
+	file_banyandb_stream_v1_query_proto_depIdxs = nil
 }
diff --git a/api/proto/banyandb/stream/v2/query.proto b/api/proto/banyandb/stream/v1/query.proto
similarity index 85%
rename from api/proto/banyandb/stream/v2/query.proto
rename to api/proto/banyandb/stream/v1/query.proto
index 530de48..2dccd89 100644
--- a/api/proto/banyandb/stream/v2/query.proto
+++ b/api/proto/banyandb/stream/v1/query.proto
@@ -17,14 +17,14 @@
 
 syntax = "proto3";
 
-option java_package = "org.apache.skywalking.banyandb.stream.v2";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/stream/v2";
+option java_package = "org.apache.skywalking.banyandb.stream.v1";
+option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/stream/v1";
 
-package banyandb.stream.v2;
+package banyandb.stream.v1;
 
 import "google/protobuf/timestamp.proto";
-import "banyandb/common/v2/common.proto";
-import "banyandb/model/v2/query.proto";
+import "banyandb/common/v1/common.proto";
+import "banyandb/model/v1/query.proto";
 
 // Element represents
 // (stream context) a Span defined in Google Dapper paper or equivalently a Segment in Skywalking.
@@ -42,7 +42,7 @@ message Element {
   // - service_name
   // - service_instance_id
   // - end_time_nanoseconds
-  repeated model.v2.TagFamily tag_families = 3;
+  repeated model.v1.TagFamily tag_families = 3;
 }
 
 // QueryResponse is the response for a query to the Query module.
@@ -54,24 +54,24 @@ message QueryResponse {
 // QueryRequest is the request contract for query.
 message QueryRequest {
   // metadata is required
-  common.v2.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 stream, 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
-  model.v2.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
-  model.v2.QueryOrder order_by = 5;
+  model.v1.QueryOrder order_by = 5;
   // tag_families are indexed.
   message Criteria {
     string tag_family_name = 1;
-    repeated model.v2.Condition conditions = 2;
+    repeated model.v1.Condition conditions = 2;
   }
   repeated Criteria criteria = 6;
   // projection can be used to select the key names of the element in the response
-  model.v2.Projection projection = 7;
+  model.v1.Projection projection = 7;
 }
diff --git a/api/proto/banyandb/stream/v2/rpc.pb.go b/api/proto/banyandb/stream/v1/rpc.pb.go
similarity index 63%
rename from api/proto/banyandb/stream/v2/rpc.pb.go
rename to api/proto/banyandb/stream/v1/rpc.pb.go
index a34ae83..32d87f4 100644
--- a/api/proto/banyandb/stream/v2/rpc.pb.go
+++ b/api/proto/banyandb/stream/v1/rpc.pb.go
@@ -19,9 +19,9 @@
 // versions:
 // 	protoc-gen-go v1.27.1
 // 	protoc        v3.17.3
-// source: banyandb/stream/v2/rpc.proto
+// source: banyandb/stream/v1/rpc.proto
 
-package v2
+package v1
 
 import (
 	reflect "reflect"
@@ -37,48 +37,48 @@ const (
 	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 )
 
-var File_banyandb_stream_v2_rpc_proto protoreflect.FileDescriptor
+var File_banyandb_stream_v1_rpc_proto protoreflect.FileDescriptor
 
-var file_banyandb_stream_v2_rpc_proto_rawDesc = []byte{
+var file_banyandb_stream_v1_rpc_proto_rawDesc = []byte{
 	0x0a, 0x1c, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61,
-	0x6d, 0x2f, 0x76, 0x32, 0x2f, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12,
+	0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12,
 	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e,
-	0x76, 0x32, 0x1a, 0x1e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x72,
-	0x65, 0x61, 0x6d, 0x2f, 0x76, 0x32, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f,
+	0x76, 0x31, 0x1a, 0x1e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x72,
+	0x65, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f,
 	0x74, 0x6f, 0x1a, 0x1e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x72,
-	0x65, 0x61, 0x6d, 0x2f, 0x76, 0x32, 0x2f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x65, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f,
 	0x74, 0x6f, 0x32, 0xaf, 0x01, 0x0a, 0x0d, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x72,
 	0x76, 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x20, 0x2e,
 	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e,
-	0x76, 0x32, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
 	0x21, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61,
-	0x6d, 0x2e, 0x76, 0x32, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
 	0x73, 0x65, 0x12, 0x50, 0x0a, 0x05, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x62, 0x61,
-	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x32,
+	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x31,
 	0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e,
 	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e,
-	0x76, 0x32, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
 	0x28, 0x01, 0x30, 0x01, 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, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x32,
+	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 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, 0x73, 0x74, 0x72, 0x65, 0x61,
-	0x6d, 0x2f, 0x76, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x6d, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
-var file_banyandb_stream_v2_rpc_proto_goTypes = []interface{}{
-	(*QueryRequest)(nil),  // 0: banyandb.stream.v2.QueryRequest
-	(*WriteRequest)(nil),  // 1: banyandb.stream.v2.WriteRequest
-	(*QueryResponse)(nil), // 2: banyandb.stream.v2.QueryResponse
-	(*WriteResponse)(nil), // 3: banyandb.stream.v2.WriteResponse
+var file_banyandb_stream_v1_rpc_proto_goTypes = []interface{}{
+	(*QueryRequest)(nil),  // 0: banyandb.stream.v1.QueryRequest
+	(*WriteRequest)(nil),  // 1: banyandb.stream.v1.WriteRequest
+	(*QueryResponse)(nil), // 2: banyandb.stream.v1.QueryResponse
+	(*WriteResponse)(nil), // 3: banyandb.stream.v1.WriteResponse
 }
-var file_banyandb_stream_v2_rpc_proto_depIdxs = []int32{
-	0, // 0: banyandb.stream.v2.StreamService.Query:input_type -> banyandb.stream.v2.QueryRequest
-	1, // 1: banyandb.stream.v2.StreamService.Write:input_type -> banyandb.stream.v2.WriteRequest
-	2, // 2: banyandb.stream.v2.StreamService.Query:output_type -> banyandb.stream.v2.QueryResponse
-	3, // 3: banyandb.stream.v2.StreamService.Write:output_type -> banyandb.stream.v2.WriteResponse
+var file_banyandb_stream_v1_rpc_proto_depIdxs = []int32{
+	0, // 0: banyandb.stream.v1.StreamService.Query:input_type -> banyandb.stream.v1.QueryRequest
+	1, // 1: banyandb.stream.v1.StreamService.Write:input_type -> banyandb.stream.v1.WriteRequest
+	2, // 2: banyandb.stream.v1.StreamService.Query:output_type -> banyandb.stream.v1.QueryResponse
+	3, // 3: banyandb.stream.v1.StreamService.Write:output_type -> banyandb.stream.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
@@ -86,28 +86,28 @@ var file_banyandb_stream_v2_rpc_proto_depIdxs = []int32{
 	0, // [0:0] is the sub-list for field type_name
 }
 
-func init() { file_banyandb_stream_v2_rpc_proto_init() }
-func file_banyandb_stream_v2_rpc_proto_init() {
-	if File_banyandb_stream_v2_rpc_proto != nil {
+func init() { file_banyandb_stream_v1_rpc_proto_init() }
+func file_banyandb_stream_v1_rpc_proto_init() {
+	if File_banyandb_stream_v1_rpc_proto != nil {
 		return
 	}
-	file_banyandb_stream_v2_query_proto_init()
-	file_banyandb_stream_v2_write_proto_init()
+	file_banyandb_stream_v1_query_proto_init()
+	file_banyandb_stream_v1_write_proto_init()
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
-			RawDescriptor: file_banyandb_stream_v2_rpc_proto_rawDesc,
+			RawDescriptor: file_banyandb_stream_v1_rpc_proto_rawDesc,
 			NumEnums:      0,
 			NumMessages:   0,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
-		GoTypes:           file_banyandb_stream_v2_rpc_proto_goTypes,
-		DependencyIndexes: file_banyandb_stream_v2_rpc_proto_depIdxs,
+		GoTypes:           file_banyandb_stream_v1_rpc_proto_goTypes,
+		DependencyIndexes: file_banyandb_stream_v1_rpc_proto_depIdxs,
 	}.Build()
-	File_banyandb_stream_v2_rpc_proto = out.File
-	file_banyandb_stream_v2_rpc_proto_rawDesc = nil
-	file_banyandb_stream_v2_rpc_proto_goTypes = nil
-	file_banyandb_stream_v2_rpc_proto_depIdxs = nil
+	File_banyandb_stream_v1_rpc_proto = out.File
+	file_banyandb_stream_v1_rpc_proto_rawDesc = nil
+	file_banyandb_stream_v1_rpc_proto_goTypes = nil
+	file_banyandb_stream_v1_rpc_proto_depIdxs = nil
 }
diff --git a/api/proto/banyandb/stream/v2/rpc.proto b/api/proto/banyandb/stream/v1/rpc.proto
similarity index 70%
rename from api/proto/banyandb/stream/v2/rpc.proto
rename to api/proto/banyandb/stream/v1/rpc.proto
index e16d1bd..bc7d490 100644
--- a/api/proto/banyandb/stream/v2/rpc.proto
+++ b/api/proto/banyandb/stream/v1/rpc.proto
@@ -17,15 +17,15 @@
 
 syntax = "proto3";
 
-option java_package = "org.apache.skywalking.banyandb.stream.v2";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/stream/v2";
+option java_package = "org.apache.skywalking.banyandb.stream.v1";
+option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/stream/v1";
 
-package banyandb.stream.v2;
+package banyandb.stream.v1;
 
-import "banyandb/stream/v2/query.proto";
-import "banyandb/stream/v2/write.proto";
+import "banyandb/stream/v1/query.proto";
+import "banyandb/stream/v1/write.proto";
 
 service StreamService {
-  rpc Query(banyandb.stream.v2.QueryRequest) returns (banyandb.stream.v2.QueryResponse);
-  rpc Write(stream banyandb.stream.v2.WriteRequest) returns (stream banyandb.stream.v2.WriteResponse);
+  rpc Query(banyandb.stream.v1.QueryRequest) returns (banyandb.stream.v1.QueryResponse);
+  rpc Write(stream banyandb.stream.v1.WriteRequest) returns (stream banyandb.stream.v1.WriteResponse);
 }
\ No newline at end of file
diff --git a/api/proto/banyandb/stream/v2/rpc_grpc.pb.go b/api/proto/banyandb/stream/v1/rpc_grpc.pb.go
similarity index 94%
rename from api/proto/banyandb/stream/v2/rpc_grpc.pb.go
rename to api/proto/banyandb/stream/v1/rpc_grpc.pb.go
index 28988ca..3da4884 100644
--- a/api/proto/banyandb/stream/v2/rpc_grpc.pb.go
+++ b/api/proto/banyandb/stream/v1/rpc_grpc.pb.go
@@ -1,6 +1,6 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 
-package v2
+package v1
 
 import (
 	context "context"
@@ -33,7 +33,7 @@ func NewStreamServiceClient(cc grpc.ClientConnInterface) StreamServiceClient {
 
 func (c *streamServiceClient) Query(ctx context.Context, in *QueryRequest, opts ...grpc.CallOption) (*QueryResponse, error) {
 	out := new(QueryResponse)
-	err := c.cc.Invoke(ctx, "/banyandb.stream.v2.StreamService/Query", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/banyandb.stream.v1.StreamService/Query", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -41,7 +41,7 @@ func (c *streamServiceClient) Query(ctx context.Context, in *QueryRequest, opts
 }
 
 func (c *streamServiceClient) Write(ctx context.Context, opts ...grpc.CallOption) (StreamService_WriteClient, error) {
-	stream, err := c.cc.NewStream(ctx, &StreamService_ServiceDesc.Streams[0], "/banyandb.stream.v2.StreamService/Write", opts...)
+	stream, err := c.cc.NewStream(ctx, &StreamService_ServiceDesc.Streams[0], "/banyandb.stream.v1.StreamService/Write", opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -113,7 +113,7 @@ func _StreamService_Query_Handler(srv interface{}, ctx context.Context, dec func
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/banyandb.stream.v2.StreamService/Query",
+		FullMethod: "/banyandb.stream.v1.StreamService/Query",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(StreamServiceServer).Query(ctx, req.(*QueryRequest))
@@ -151,7 +151,7 @@ func (x *streamServiceWriteServer) 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 StreamService_ServiceDesc = grpc.ServiceDesc{
-	ServiceName: "banyandb.stream.v2.StreamService",
+	ServiceName: "banyandb.stream.v1.StreamService",
 	HandlerType: (*StreamServiceServer)(nil),
 	Methods: []grpc.MethodDesc{
 		{
@@ -167,5 +167,5 @@ var StreamService_ServiceDesc = grpc.ServiceDesc{
 			ClientStreams: true,
 		},
 	},
-	Metadata: "banyandb/stream/v2/rpc.proto",
+	Metadata: "banyandb/stream/v1/rpc.proto",
 }
diff --git a/api/proto/banyandb/stream/v2/write.pb.go b/api/proto/banyandb/stream/v1/write.pb.go
similarity index 74%
rename from api/proto/banyandb/stream/v2/write.pb.go
rename to api/proto/banyandb/stream/v1/write.pb.go
index c062805..8d268c8 100644
--- a/api/proto/banyandb/stream/v2/write.pb.go
+++ b/api/proto/banyandb/stream/v1/write.pb.go
@@ -19,9 +19,9 @@
 // versions:
 // 	protoc-gen-go v1.27.1
 // 	protoc        v3.17.3
-// source: banyandb/stream/v2/write.proto
+// source: banyandb/stream/v1/write.proto
 
-package v2
+package v1
 
 import (
 	reflect "reflect"
@@ -31,8 +31,8 @@ import (
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
 
-	v21 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v2"
-	v2 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v2"
+	v11 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
 )
 
 const (
@@ -54,13 +54,13 @@ type ElementValue struct {
 	// 2) or the timestamp of a log
 	Timestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
 	// the order of tag_families' items match the stream schema
-	TagFamilies []*v2.TagFamilyForWrite `protobuf:"bytes,3,rep,name=tag_families,json=tagFamilies,proto3" json:"tag_families,omitempty"`
+	TagFamilies []*v1.TagFamilyForWrite `protobuf:"bytes,3,rep,name=tag_families,json=tagFamilies,proto3" json:"tag_families,omitempty"`
 }
 
 func (x *ElementValue) Reset() {
 	*x = ElementValue{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_stream_v2_write_proto_msgTypes[0]
+		mi := &file_banyandb_stream_v1_write_proto_msgTypes[0]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -73,7 +73,7 @@ func (x *ElementValue) String() string {
 func (*ElementValue) ProtoMessage() {}
 
 func (x *ElementValue) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_stream_v2_write_proto_msgTypes[0]
+	mi := &file_banyandb_stream_v1_write_proto_msgTypes[0]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -86,7 +86,7 @@ func (x *ElementValue) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ElementValue.ProtoReflect.Descriptor instead.
 func (*ElementValue) Descriptor() ([]byte, []int) {
-	return file_banyandb_stream_v2_write_proto_rawDescGZIP(), []int{0}
+	return file_banyandb_stream_v1_write_proto_rawDescGZIP(), []int{0}
 }
 
 func (x *ElementValue) GetElementId() string {
@@ -103,7 +103,7 @@ func (x *ElementValue) GetTimestamp() *timestamppb.Timestamp {
 	return nil
 }
 
-func (x *ElementValue) GetTagFamilies() []*v2.TagFamilyForWrite {
+func (x *ElementValue) GetTagFamilies() []*v1.TagFamilyForWrite {
 	if x != nil {
 		return x.TagFamilies
 	}
@@ -116,7 +116,7 @@ type WriteRequest struct {
 	unknownFields protoimpl.UnknownFields
 
 	// the metadata is only required in the first write.
-	Metadata *v21.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
+	Metadata *v11.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
 	// the element is required.
 	Element *ElementValue `protobuf:"bytes,2,opt,name=element,proto3" json:"element,omitempty"`
 }
@@ -124,7 +124,7 @@ type WriteRequest struct {
 func (x *WriteRequest) Reset() {
 	*x = WriteRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_stream_v2_write_proto_msgTypes[1]
+		mi := &file_banyandb_stream_v1_write_proto_msgTypes[1]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -137,7 +137,7 @@ func (x *WriteRequest) String() string {
 func (*WriteRequest) ProtoMessage() {}
 
 func (x *WriteRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_stream_v2_write_proto_msgTypes[1]
+	mi := &file_banyandb_stream_v1_write_proto_msgTypes[1]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -150,10 +150,10 @@ func (x *WriteRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use WriteRequest.ProtoReflect.Descriptor instead.
 func (*WriteRequest) Descriptor() ([]byte, []int) {
-	return file_banyandb_stream_v2_write_proto_rawDescGZIP(), []int{1}
+	return file_banyandb_stream_v1_write_proto_rawDescGZIP(), []int{1}
 }
 
-func (x *WriteRequest) GetMetadata() *v21.Metadata {
+func (x *WriteRequest) GetMetadata() *v11.Metadata {
 	if x != nil {
 		return x.Metadata
 	}
@@ -176,7 +176,7 @@ type WriteResponse struct {
 func (x *WriteResponse) Reset() {
 	*x = WriteResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_stream_v2_write_proto_msgTypes[2]
+		mi := &file_banyandb_stream_v1_write_proto_msgTypes[2]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -189,7 +189,7 @@ func (x *WriteResponse) String() string {
 func (*WriteResponse) ProtoMessage() {}
 
 func (x *WriteResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_stream_v2_write_proto_msgTypes[2]
+	mi := &file_banyandb_stream_v1_write_proto_msgTypes[2]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -202,7 +202,7 @@ func (x *WriteResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use WriteResponse.ProtoReflect.Descriptor instead.
 func (*WriteResponse) Descriptor() ([]byte, []int) {
-	return file_banyandb_stream_v2_write_proto_rawDescGZIP(), []int{2}
+	return file_banyandb_stream_v1_write_proto_rawDescGZIP(), []int{2}
 }
 
 type InternalWriteRequest struct {
@@ -218,7 +218,7 @@ type InternalWriteRequest struct {
 func (x *InternalWriteRequest) Reset() {
 	*x = InternalWriteRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_banyandb_stream_v2_write_proto_msgTypes[3]
+		mi := &file_banyandb_stream_v1_write_proto_msgTypes[3]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -231,7 +231,7 @@ func (x *InternalWriteRequest) String() string {
 func (*InternalWriteRequest) ProtoMessage() {}
 
 func (x *InternalWriteRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_banyandb_stream_v2_write_proto_msgTypes[3]
+	mi := &file_banyandb_stream_v1_write_proto_msgTypes[3]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -244,7 +244,7 @@ func (x *InternalWriteRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use InternalWriteRequest.ProtoReflect.Descriptor instead.
 func (*InternalWriteRequest) Descriptor() ([]byte, []int) {
-	return file_banyandb_stream_v2_write_proto_rawDescGZIP(), []int{3}
+	return file_banyandb_stream_v1_write_proto_rawDescGZIP(), []int{3}
 }
 
 func (x *InternalWriteRequest) GetShardId() uint32 {
@@ -268,18 +268,18 @@ func (x *InternalWriteRequest) GetRequest() *WriteRequest {
 	return nil
 }
 
-var File_banyandb_stream_v2_write_proto protoreflect.FileDescriptor
+var File_banyandb_stream_v1_write_proto protoreflect.FileDescriptor
 
-var file_banyandb_stream_v2_write_proto_rawDesc = []byte{
+var file_banyandb_stream_v1_write_proto_rawDesc = []byte{
 	0x0a, 0x1e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61,
-	0x6d, 0x2f, 0x76, 0x32, 0x2f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
 	0x12, 0x12, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61,
-	0x6d, 0x2e, 0x76, 0x32, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f,
+	0x6d, 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, 0x32, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
 	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62,
-	0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+	0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
 	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb0, 0x01, 0x0a, 0x0c, 0x45, 0x6c, 0x65, 0x6d, 0x65,
 	0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6c, 0x65, 0x6d, 0x65,
 	0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6c, 0x65,
@@ -289,16 +289,16 @@ var file_banyandb_stream_v2_write_proto_rawDesc = []byte{
 	0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
 	0x12, 0x47, 0x0a, 0x0c, 0x74, 0x61, 0x67, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73,
 	0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
-	0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x61, 0x67, 0x46, 0x61,
+	0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x67, 0x46, 0x61,
 	0x6d, 0x69, 0x6c, 0x79, 0x46, 0x6f, 0x72, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x0b, 0x74, 0x61,
 	0x67, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x22, 0x84, 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,
-	0x32, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61,
+	0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61,
 	0x64, 0x61, 0x74, 0x61, 0x12, 0x3a, 0x0a, 0x07, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18,
 	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62,
-	0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65,
+	0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65,
 	0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
 	0x22, 0x0f, 0x0a, 0x0d, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
 	0x65, 0x22, 0x8e, 0x01, 0x0a, 0x14, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x57, 0x72,
@@ -308,46 +308,46 @@ var file_banyandb_stream_v2_write_proto_rawDesc = []byte{
 	0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x69,
 	0x65, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, 0x3a, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73,
 	0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
-	0x64, 0x62, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x72, 0x69,
+	0x64, 0x62, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69,
 	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65,
 	0x73, 0x74, 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, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x32, 0x5a, 0x42,
+	0x61, 0x6e, 0x64, 0x62, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 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, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2f,
-	0x76, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
-	file_banyandb_stream_v2_write_proto_rawDescOnce sync.Once
-	file_banyandb_stream_v2_write_proto_rawDescData = file_banyandb_stream_v2_write_proto_rawDesc
+	file_banyandb_stream_v1_write_proto_rawDescOnce sync.Once
+	file_banyandb_stream_v1_write_proto_rawDescData = file_banyandb_stream_v1_write_proto_rawDesc
 )
 
-func file_banyandb_stream_v2_write_proto_rawDescGZIP() []byte {
-	file_banyandb_stream_v2_write_proto_rawDescOnce.Do(func() {
-		file_banyandb_stream_v2_write_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_stream_v2_write_proto_rawDescData)
+func file_banyandb_stream_v1_write_proto_rawDescGZIP() []byte {
+	file_banyandb_stream_v1_write_proto_rawDescOnce.Do(func() {
+		file_banyandb_stream_v1_write_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_stream_v1_write_proto_rawDescData)
 	})
-	return file_banyandb_stream_v2_write_proto_rawDescData
+	return file_banyandb_stream_v1_write_proto_rawDescData
 }
 
-var file_banyandb_stream_v2_write_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
-var file_banyandb_stream_v2_write_proto_goTypes = []interface{}{
-	(*ElementValue)(nil),          // 0: banyandb.stream.v2.ElementValue
-	(*WriteRequest)(nil),          // 1: banyandb.stream.v2.WriteRequest
-	(*WriteResponse)(nil),         // 2: banyandb.stream.v2.WriteResponse
-	(*InternalWriteRequest)(nil),  // 3: banyandb.stream.v2.InternalWriteRequest
+var file_banyandb_stream_v1_write_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
+var file_banyandb_stream_v1_write_proto_goTypes = []interface{}{
+	(*ElementValue)(nil),          // 0: banyandb.stream.v1.ElementValue
+	(*WriteRequest)(nil),          // 1: banyandb.stream.v1.WriteRequest
+	(*WriteResponse)(nil),         // 2: banyandb.stream.v1.WriteResponse
+	(*InternalWriteRequest)(nil),  // 3: banyandb.stream.v1.InternalWriteRequest
 	(*timestamppb.Timestamp)(nil), // 4: google.protobuf.Timestamp
-	(*v2.TagFamilyForWrite)(nil),  // 5: banyandb.model.v2.TagFamilyForWrite
-	(*v21.Metadata)(nil),          // 6: banyandb.common.v2.Metadata
-}
-var file_banyandb_stream_v2_write_proto_depIdxs = []int32{
-	4, // 0: banyandb.stream.v2.ElementValue.timestamp:type_name -> google.protobuf.Timestamp
-	5, // 1: banyandb.stream.v2.ElementValue.tag_families:type_name -> banyandb.model.v2.TagFamilyForWrite
-	6, // 2: banyandb.stream.v2.WriteRequest.metadata:type_name -> banyandb.common.v2.Metadata
-	0, // 3: banyandb.stream.v2.WriteRequest.element:type_name -> banyandb.stream.v2.ElementValue
-	1, // 4: banyandb.stream.v2.InternalWriteRequest.request:type_name -> banyandb.stream.v2.WriteRequest
+	(*v1.TagFamilyForWrite)(nil),  // 5: banyandb.model.v1.TagFamilyForWrite
+	(*v11.Metadata)(nil),          // 6: banyandb.common.v1.Metadata
+}
+var file_banyandb_stream_v1_write_proto_depIdxs = []int32{
+	4, // 0: banyandb.stream.v1.ElementValue.timestamp:type_name -> google.protobuf.Timestamp
+	5, // 1: banyandb.stream.v1.ElementValue.tag_families:type_name -> banyandb.model.v1.TagFamilyForWrite
+	6, // 2: banyandb.stream.v1.WriteRequest.metadata:type_name -> banyandb.common.v1.Metadata
+	0, // 3: banyandb.stream.v1.WriteRequest.element:type_name -> banyandb.stream.v1.ElementValue
+	1, // 4: banyandb.stream.v1.InternalWriteRequest.request:type_name -> banyandb.stream.v1.WriteRequest
 	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
@@ -355,13 +355,13 @@ var file_banyandb_stream_v2_write_proto_depIdxs = []int32{
 	0, // [0:5] is the sub-list for field type_name
 }
 
-func init() { file_banyandb_stream_v2_write_proto_init() }
-func file_banyandb_stream_v2_write_proto_init() {
-	if File_banyandb_stream_v2_write_proto != nil {
+func init() { file_banyandb_stream_v1_write_proto_init() }
+func file_banyandb_stream_v1_write_proto_init() {
+	if File_banyandb_stream_v1_write_proto != nil {
 		return
 	}
 	if !protoimpl.UnsafeEnabled {
-		file_banyandb_stream_v2_write_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+		file_banyandb_stream_v1_write_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ElementValue); i {
 			case 0:
 				return &v.state
@@ -373,7 +373,7 @@ func file_banyandb_stream_v2_write_proto_init() {
 				return nil
 			}
 		}
-		file_banyandb_stream_v2_write_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+		file_banyandb_stream_v1_write_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*WriteRequest); i {
 			case 0:
 				return &v.state
@@ -385,7 +385,7 @@ func file_banyandb_stream_v2_write_proto_init() {
 				return nil
 			}
 		}
-		file_banyandb_stream_v2_write_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+		file_banyandb_stream_v1_write_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*WriteResponse); i {
 			case 0:
 				return &v.state
@@ -397,7 +397,7 @@ func file_banyandb_stream_v2_write_proto_init() {
 				return nil
 			}
 		}
-		file_banyandb_stream_v2_write_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+		file_banyandb_stream_v1_write_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*InternalWriteRequest); i {
 			case 0:
 				return &v.state
@@ -414,18 +414,18 @@ func file_banyandb_stream_v2_write_proto_init() {
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
-			RawDescriptor: file_banyandb_stream_v2_write_proto_rawDesc,
+			RawDescriptor: file_banyandb_stream_v1_write_proto_rawDesc,
 			NumEnums:      0,
 			NumMessages:   4,
 			NumExtensions: 0,
 			NumServices:   0,
 		},
-		GoTypes:           file_banyandb_stream_v2_write_proto_goTypes,
-		DependencyIndexes: file_banyandb_stream_v2_write_proto_depIdxs,
-		MessageInfos:      file_banyandb_stream_v2_write_proto_msgTypes,
+		GoTypes:           file_banyandb_stream_v1_write_proto_goTypes,
+		DependencyIndexes: file_banyandb_stream_v1_write_proto_depIdxs,
+		MessageInfos:      file_banyandb_stream_v1_write_proto_msgTypes,
 	}.Build()
-	File_banyandb_stream_v2_write_proto = out.File
-	file_banyandb_stream_v2_write_proto_rawDesc = nil
-	file_banyandb_stream_v2_write_proto_goTypes = nil
-	file_banyandb_stream_v2_write_proto_depIdxs = nil
+	File_banyandb_stream_v1_write_proto = out.File
+	file_banyandb_stream_v1_write_proto_rawDesc = nil
+	file_banyandb_stream_v1_write_proto_goTypes = nil
+	file_banyandb_stream_v1_write_proto_depIdxs = nil
 }
diff --git a/api/proto/banyandb/stream/v2/write.proto b/api/proto/banyandb/stream/v1/write.proto
similarity index 84%
rename from api/proto/banyandb/stream/v2/write.proto
rename to api/proto/banyandb/stream/v1/write.proto
index f671a6c..b30961e 100644
--- a/api/proto/banyandb/stream/v2/write.proto
+++ b/api/proto/banyandb/stream/v1/write.proto
@@ -17,14 +17,14 @@
 
 syntax = "proto3";
 
-option java_package = "org.apache.skywalking.banyandb.stream.v2";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/stream/v2";
+option java_package = "org.apache.skywalking.banyandb.stream.v1";
+option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/stream/v1";
 
-package banyandb.stream.v2;
+package banyandb.stream.v1;
 
 import "google/protobuf/timestamp.proto";
-import "banyandb/common/v2/common.proto";
-import "banyandb/model/v2/common.proto";
+import "banyandb/common/v1/common.proto";
+import "banyandb/model/v1/common.proto";
 
 message ElementValue {
   // element_id could be span_id of a Span or segment_id of a Segment in the context of stream
@@ -34,12 +34,12 @@ message ElementValue {
   // 2) or the timestamp of a log
   google.protobuf.Timestamp timestamp = 2;
   // the order of tag_families' items match the stream schema
-  repeated model.v2.TagFamilyForWrite tag_families = 3;
+  repeated model.v1.TagFamilyForWrite tag_families = 3;
 }
 
 message WriteRequest {
   // the metadata is only required in the first write.
-  common.v2.Metadata metadata = 1;
+  common.v1.Metadata metadata = 1;
   // the element is required.
   ElementValue element = 2;
 }
diff --git a/api/proto/banyandb/trace/v1/query.pb.go b/api/proto/banyandb/trace/v1/query.pb.go
deleted file mode 100644
index 2a637e8..0000000
--- a/api/proto/banyandb/trace/v1/query.pb.go
+++ /dev/null
@@ -1,449 +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/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/trace/v1/query.proto b/api/proto/banyandb/trace/v1/query.proto
deleted file mode 100644
index 2587b8c..0000000
--- a/api/proto/banyandb/trace/v1/query.proto
+++ /dev/null
@@ -1,77 +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.trace.v1";
-option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/trace/v1";
-
-package banyandb.trace.v1;
-
-import "google/protobuf/timestamp.proto";
-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.
-// (Log context) a log
-message Entity {
-  // entity_id could be span_id of a Span or segment_id of a Segment in the context of Trace
-  string entity_id = 1;
-  // timestamp represents
-  // 1) either the start time of a Span/Segment,
-  // 2) or the timestamp of a log
-  google.protobuf.Timestamp timestamp = 2;
-  // data_binary contains all un-indexed Tags and other key-value pairs
-  bytes data_binary = 3;
-  // fields contains all indexed Field. Some typical names,
-  // - trace_id
-  // - duration
-  // - service_name
-  // - service_instance_id
-  // - end_time_nanoseconds
-  repeated model.v1.TypedPair fields = 4;
-}
-
... 5532 lines suppressed ...