SegmentInterface.h 3.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// Copyright (C) 2019-2020 Zilliz. All rights reserved.
//
// Licensed 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

#pragma once
#include "common/Types.h"
#include "common/Schema.h"
#include "query/Plan.h"
#include "common/Span.h"
17 18
#include "IndexingEntry.h"
#include <knowhere/index/vector_index/VecIndex.h>
19
#include "common/SystemProperty.h"
F
FluorineDog 已提交
20
#include "query/PlanNode.h"
21 22 23 24 25

namespace milvus::segcore {

class SegmentInterface {
 public:
26 27
    void
    FillTargetEntry(const query::Plan* plan, QueryResult& results) const;
28

F
FluorineDog 已提交
29
    QueryResult
30 31 32
    Search(const query::Plan* Plan,
           const query::PlaceholderGroup* placeholder_groups[],
           const Timestamp timestamps[],
F
FluorineDog 已提交
33
           int64_t num_groups) const;
34 35 36 37 38 39 40

    virtual int64_t
    GetMemoryUsageInBytes() const = 0;

    virtual int64_t
    get_row_count() const = 0;

C
cai.zhang 已提交
41 42 43
    virtual const Schema&
    get_schema() const = 0;

44
    virtual ~SegmentInterface() = default;
45 46 47 48 49 50 51

 protected:
    virtual void
    bulk_subscript(SystemFieldType system_type, const int64_t* seg_offsets, int64_t count, void* output) const = 0;

    virtual void
    bulk_subscript(FieldOffset field_offset, const int64_t* seg_offsets, int64_t count, void* output) const = 0;
52 53 54 55 56 57 58 59
};

// internal API for DSL calculation
class SegmentInternalInterface : public SegmentInterface {
 public:
    template <typename T>
    Span<T>
    chunk_data(FieldOffset field_offset, int64_t chunk_id) const {
60
        return static_cast<Span<T>>(chunk_data_impl(field_offset, chunk_id));
61 62
    }

63 64 65 66 67 68 69 70 71 72 73
    template <typename T>
    const knowhere::scalar::StructuredIndex<T>&
    chunk_scalar_index(FieldOffset field_offset, int64_t chunk_id) const {
        static_assert(IsScalar<T>);
        using IndexType = knowhere::scalar::StructuredIndex<T>;
        auto base_ptr = chunk_index_impl(field_offset, chunk_id);
        auto ptr = dynamic_cast<const IndexType*>(base_ptr);
        AssertInfo(ptr, "entry mismatch");
        return *ptr;
    }

C
cai.zhang 已提交
74
 public:
F
FluorineDog 已提交
75 76 77 78 79 80 81 82
    virtual void
    vector_search(int64_t vec_count,
                  query::QueryInfo query_info,
                  const void* query_data,
                  int64_t query_count,
                  const BitsetView& bitset,
                  QueryResult& output) const = 0;

C
cai.zhang 已提交
83 84 85 86 87 88 89
    virtual int64_t
    num_chunk_index_safe(FieldOffset field_offset) const = 0;

    virtual int64_t
    num_chunk_data() const = 0;

    // return chunk_size for each chunk, renaming against confusion
90
    virtual int64_t
C
cai.zhang 已提交
91
    size_per_chunk() const = 0;
92

93
 protected:
94
    // blob and row_count
95 96
    virtual SpanBase
    chunk_data_impl(FieldOffset field_offset, int64_t chunk_id) const = 0;
97 98 99

    virtual const knowhere::Index*
    chunk_index_impl(FieldOffset field_offset, int64_t chunk_id) const = 0;
100 101 102
};

}  // namespace milvus::segcore