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:01 UTC

[skywalking-banyandb] branch v2tov1 created (now a30d5ad)

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

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


      at a30d5ad  Revert v2 api

This branch includes the following new commits:

     new a30d5ad  Revert v2 api

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


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

Posted by ha...@apache.org.
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 ...