@@ -40,6 +40,7 @@ class IndexMeta {
4040 DT_BINARY64 = 8 ,
4141 };
4242
43+
4344 /* ! Major Orders
4445 */
4546 enum MajorOrder {
@@ -77,6 +78,7 @@ class IndexMeta {
7778 dimension_ (rhs.dimension_),
7879 unit_size_ (rhs.unit_size_),
7980 element_size_ (rhs.element_size_),
81+ extra_meta_size_ (rhs.extra_meta_size_),
8082 space_id_ (rhs.space_id_),
8183 metric_revision_ (rhs.metric_revision_),
8284 converter_revision_ (rhs.converter_revision_),
@@ -112,6 +114,7 @@ class IndexMeta {
112114 dimension_ (rhs.dimension_),
113115 unit_size_ (rhs.unit_size_),
114116 element_size_ (rhs.element_size_),
117+ extra_meta_size_ (rhs.extra_meta_size_),
115118 space_id_ (rhs.space_id_),
116119 metric_revision_ (rhs.metric_revision_),
117120 converter_revision_ (rhs.converter_revision_),
@@ -173,6 +176,7 @@ class IndexMeta {
173176 searcher_params_ = std::move (rhs.searcher_params_ );
174177 streamer_params_ = std::move (rhs.streamer_params_ );
175178 attributes_ = std::move (rhs.attributes_ );
179+ extra_meta_size_ = rhs.extra_meta_size_ ;
176180
177181 return *this ;
178182 }
@@ -211,6 +215,7 @@ class IndexMeta {
211215 searcher_params_ = std::move (rhs.searcher_params_ );
212216 streamer_params_ = std::move (rhs.streamer_params_ );
213217 attributes_ = std::move (rhs.attributes_ );
218+ extra_meta_size_ = rhs.extra_meta_size_ ;
214219
215220 return *this ;
216221 }
@@ -249,6 +254,7 @@ class IndexMeta {
249254 searcher_params_.clear ();
250255 streamer_params_.clear ();
251256 attributes_.clear ();
257+ extra_meta_size_ = 0 ;
252258 }
253259
254260 // ! Retrieve major order information
@@ -281,6 +287,11 @@ class IndexMeta {
281287 return element_size_;
282288 }
283289
290+ // ! Retrieve extra meta size in bytes
291+ uint32_t extra_meta_size (void ) const {
292+ return extra_meta_size_;
293+ }
294+
284295 // ! Retrieve space id
285296 uint64_t space_id (void ) const {
286297 return space_id_;
@@ -429,7 +440,8 @@ class IndexMeta {
429440 // ! Set dimension of feature
430441 void set_dimension (uint32_t dim) {
431442 dimension_ = dim;
432- element_size_ = IndexMeta::ElementSizeof (data_type_, unit_size_, dim);
443+ element_size_ = IndexMeta::ElementSizeof (data_type_, unit_size_, dim) +
444+ extra_meta_size_;
433445 }
434446
435447 // ! Set meta information of feature
@@ -443,14 +455,21 @@ class IndexMeta {
443455 data_type_ = data_type;
444456 dimension_ = dim;
445457 unit_size_ = unit;
446- element_size_ = ElementSizeof (data_type, unit, dim);
458+ element_size_ = ElementSizeof (data_type, unit, dim) + extra_meta_size_ ;
447459 }
448460
449461 // ! Set meta information of feature
450462 void set_meta (DataType data_type, uint32_t dim) {
451463 this ->set_meta (data_type, UnitSizeof (data_type), dim);
452464 }
453465
466+ // ! Set extra meta size
467+ void set_extra_meta_size (uint32_t size) {
468+ extra_meta_size_ = size;
469+ element_size_ =
470+ ElementSizeof (data_type_, unit_size_, dimension_) + extra_meta_size_;
471+ }
472+
454473 // ! Set information of metric
455474 template <typename TName, typename TParams>
456475 void set_metric (TName &&name, uint32_t rev, TParams &¶ms) {
@@ -586,6 +605,7 @@ class IndexMeta {
586605 uint32_t dimension_{0 };
587606 uint32_t unit_size_{0 };
588607 uint32_t element_size_{0 };
608+ uint32_t extra_meta_size_{0 };
589609 uint64_t space_id_{0 };
590610 uint32_t metric_revision_{0 };
591611 uint32_t converter_revision_{0 };
@@ -632,6 +652,19 @@ class IndexQueryMeta {
632652 unit_size_(unit),
633653 element_size_(IndexMeta::ElementSizeof(data_type, unit, dim)) {}
634654
655+ // ! Constructor
656+ IndexQueryMeta (IndexMeta::MetaType meta_type, IndexMeta::DataType data_type,
657+ uint32_t unit, uint32_t dim, uint32_t quantize_type,
658+ uint32_t extra_meta_size)
659+ : meta_type_(meta_type),
660+ data_type_(data_type),
661+ dimension_(dim),
662+ unit_size_(unit),
663+ quantize_type_(quantize_type),
664+ extra_meta_size_(extra_meta_size),
665+ element_size_(IndexMeta::ElementSizeof(data_type, unit, dim) +
666+ extra_meta_size_) {}
667+
635668 // ! Constructor
636669 IndexQueryMeta (IndexMeta::DataType data_type, uint32_t dim)
637670 : IndexQueryMeta{IndexMeta::MetaType::MT_DENSE , data_type,
@@ -673,10 +706,21 @@ class IndexQueryMeta {
673706 return element_size_;
674707 }
675708
709+ // ! Retrieve quantize type
710+ uint32_t quantize_type (void ) const {
711+ return quantize_type_;
712+ }
713+
714+ // ! Retrieve extra meta size in bytes
715+ uint32_t extra_meta_size (void ) const {
716+ return extra_meta_size_;
717+ }
718+
676719 // ! Set dimension of feature
677720 void set_dimension (uint32_t dim) {
678721 dimension_ = dim;
679- element_size_ = IndexMeta::ElementSizeof (data_type_, unit_size_, dim);
722+ element_size_ = IndexMeta::ElementSizeof (data_type_, unit_size_, dim) +
723+ extra_meta_size_;
680724 }
681725
682726 // ! Set meta type
@@ -689,24 +733,47 @@ class IndexQueryMeta {
689733 data_type_ = data_type;
690734 }
691735
736+ // ! Set extra meta size
737+ void set_extra_meta_size (uint32_t size) {
738+ extra_meta_size_ = size;
739+ element_size_ =
740+ IndexMeta::ElementSizeof (data_type_, unit_size_, dimension_) +
741+ extra_meta_size_;
742+ }
743+
692744 // ! Set meta information of feature
693745 void set_meta (IndexMeta::DataType data_type, uint32_t unit, uint32_t dim) {
694746 data_type_ = data_type;
695747 dimension_ = dim;
696748 unit_size_ = unit;
697- element_size_ = IndexMeta::ElementSizeof (data_type, unit, dim);
749+ element_size_ =
750+ IndexMeta::ElementSizeof (data_type, unit, dim) + extra_meta_size_;
698751 }
699752
700753 // ! Set meta information of feature
701754 void set_meta (IndexMeta::DataType data_type, uint32_t dim) {
702755 this ->set_meta (data_type, IndexMeta::UnitSizeof (data_type), dim);
703756 }
704757
758+ // ! Set meta information of feature with quantize type and extra meta size
759+ void set_meta (IndexMeta::DataType data_type, uint32_t dim,
760+ uint32_t quantize_type, uint32_t extra_meta_size) {
761+ data_type_ = data_type;
762+ dimension_ = dim;
763+ unit_size_ = IndexMeta::UnitSizeof (data_type);
764+ quantize_type_ = quantize_type;
765+ extra_meta_size_ = extra_meta_size;
766+ element_size_ =
767+ IndexMeta::ElementSizeof (data_type, unit_size_, dim) + extra_meta_size_;
768+ }
769+
705770 private:
706771 IndexMeta::MetaType meta_type_{IndexMeta::MetaType::MT_DENSE };
707772 IndexMeta::DataType data_type_{IndexMeta::DataType::DT_UNDEFINED };
708773 uint32_t dimension_{0 };
709774 uint32_t unit_size_{0 };
775+ uint32_t quantize_type_{0 };
776+ uint32_t extra_meta_size_{0 };
710777 uint32_t element_size_{0 };
711778};
712779
0 commit comments