Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions src/db/collection.cc
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,13 @@ class CollectionImpl : public Collection {
std::vector<SegmentTask::Ptr> build_drop_scalar_index_task(
const std::vector<Segment::Ptr> &segments, const std::string &column);

std::vector<SegmentTask::Ptr> build_create_fts_index_task(
const std::vector<Segment::Ptr> &segments, const std::string &column,
const IndexParams::Ptr &index_params);

std::vector<SegmentTask::Ptr> build_drop_fts_index_task(
const std::vector<Segment::Ptr> &segments, const std::string &column);

Status execute_tasks(std::vector<SegmentTask::Ptr> &tasks) const;

private:
Expand Down Expand Up @@ -471,6 +478,18 @@ Status CollectionImpl::CreateIndex(const std::string &column_name,
return Status::OK();
}

// Reject creating a non-vector index when the column already has a different
// non-vector index type (e.g. adding FTS when INVERT exists, or vice versa).
if (!field->is_vector_field() && field->index_params() != nullptr &&
field->index_params()->type() != index_params->type()) {
return Status::NotSupported(
"CreateIndex: column[", column_name, "] already has index type [",
IndexTypeCodeBook::AsString(field->index_params()->type()),
"], cannot create index type [",
IndexTypeCodeBook::AsString(index_params->type()),
"] on the same column");
}

// forbidden writing until index is ready
std::lock_guard write_lock(write_mtx_);

Expand Down Expand Up @@ -533,6 +552,9 @@ Status CollectionImpl::CreateIndex(const std::string &column_name,
} else if (index_params->type() == IndexType::INVERT) {
tasks = build_create_scalar_index_task(persist_segments, column_name,
index_params, options.concurrency_);
} else if (index_params->type() == IndexType::FTS) {
tasks = build_create_fts_index_task(persist_segments, column_name,
index_params);
} else {
return Status::NotSupported(
"CreateIndex: index type [",
Expand Down Expand Up @@ -570,6 +592,10 @@ Status CollectionImpl::CreateIndex(const std::string &column_name,
auto create_index_task = std::get<CreateScalarIndexTask>(task_info);
s = new_version.update_persisted_segment_meta(
create_index_task.output_segment_meta_);
} else if (std::holds_alternative<CreateFtsIndexTask>(task_info)) {
auto fts_task = std::get<CreateFtsIndexTask>(task_info);
s = new_version.update_persisted_segment_meta(
fts_task.output_segment_meta_);
}
CHECK_RETURN_STATUS(s);
}
Expand Down Expand Up @@ -597,6 +623,11 @@ Status CollectionImpl::CreateIndex(const std::string &column_name,
s = create_index_task.input_segment_->reload_scalar_index(
*new_schema, create_index_task.output_segment_meta_,
create_index_task.output_scalar_indexer_);
} else if (std::holds_alternative<CreateFtsIndexTask>(task_info)) {
auto fts_task = std::get<CreateFtsIndexTask>(task_info);
s = fts_task.input_segment_->reload_fts_index(
*new_schema, fts_task.output_segment_meta_,
fts_task.output_fts_indexer_);
}
CHECK_RETURN_STATUS(s);
}
Expand Down Expand Up @@ -630,6 +661,27 @@ std::vector<SegmentTask::Ptr> CollectionImpl::build_create_scalar_index_task(
return tasks;
}

std::vector<SegmentTask::Ptr> CollectionImpl::build_create_fts_index_task(
const std::vector<Segment::Ptr> &segments, const std::string &column,
const IndexParams::Ptr &index_params) {
std::vector<SegmentTask::Ptr> tasks;
for (auto &segment : segments) {
tasks.push_back(SegmentTask::CreateCreateFtsIndexTask(
CreateFtsIndexTask{segment, column, index_params}));
}
return tasks;
}

std::vector<SegmentTask::Ptr> CollectionImpl::build_drop_fts_index_task(
const std::vector<Segment::Ptr> &segments, const std::string &column) {
std::vector<SegmentTask::Ptr> tasks;
for (auto &segment : segments) {
tasks.push_back(
SegmentTask::CreateDropFtsIndexTask(DropFtsIndexTask{segment, column}));
}
return tasks;
}

Status CollectionImpl::execute_tasks(
std::vector<SegmentTask::Ptr> &tasks) const {
Status s;
Expand Down Expand Up @@ -723,6 +775,8 @@ Status CollectionImpl::DropIndex(const std::string &column_name) {
tasks = build_drop_vector_index_task(persist_segments, column_name);
} else if (field->index_params()->type() == IndexType::INVERT) {
tasks = build_drop_scalar_index_task(persist_segments, column_name);
} else if (field->index_params()->type() == IndexType::FTS) {
tasks = build_drop_fts_index_task(persist_segments, column_name);
} else {
return Status::NotSupported(
"DropIndex: index type [",
Expand Down Expand Up @@ -760,6 +814,10 @@ Status CollectionImpl::DropIndex(const std::string &column_name) {
auto drop_index_task = std::get<DropScalarIndexTask>(task_info);
s = new_version.update_persisted_segment_meta(
drop_index_task.output_segment_meta_);
} else if (std::holds_alternative<DropFtsIndexTask>(task_info)) {
auto fts_task = std::get<DropFtsIndexTask>(task_info);
s = new_version.update_persisted_segment_meta(
fts_task.output_segment_meta_);
}
CHECK_RETURN_STATUS(s);
}
Expand All @@ -785,6 +843,11 @@ Status CollectionImpl::DropIndex(const std::string &column_name) {
s = drop_index_task.input_segment_->reload_scalar_index(
*new_schema, drop_index_task.output_segment_meta_,
drop_index_task.output_scalar_indexer_);
} else if (std::holds_alternative<DropFtsIndexTask>(task_info)) {
auto fts_task = std::get<DropFtsIndexTask>(task_info);
s = fts_task.input_segment_->reload_fts_index(
*new_schema, fts_task.output_segment_meta_,
fts_task.output_fts_indexer_);
}
CHECK_RETURN_STATUS(s);
}
Expand Down
15 changes: 10 additions & 5 deletions src/db/common/file_helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,14 +139,19 @@ class FileHelper {
ailego::StringHelper::Concat("scalar.index.", block_id, ".rocksdb"));
}

// e.g.: **/seg1/fts.rocksdb
// e.g.: **/seg1/fts.0.rocksdb
static const std::string MakeFtsIndexPath(const std::string &path,
uint32_t seg_id) {
return ailego::FileHelper::PathJoin(path, seg_id, "fts.rocksdb");
uint32_t seg_id,
uint32_t block_id) {
return ailego::FileHelper::PathJoin(
path, seg_id,
ailego::StringHelper::Concat("fts.", block_id, ".rocksdb"));
}

static const std::string MakeFtsIndexPath(const std::string &seg_path) {
return ailego::FileHelper::PathJoin(seg_path, "fts.rocksdb");
static const std::string MakeFtsIndexPath(const std::string &seg_path,
uint32_t block_id) {
return ailego::FileHelper::PathJoin(
seg_path, ailego::StringHelper::Concat("fts.", block_id, ".rocksdb"));
}

static const std::string MakeVectorIndexPath(const std::string &path,
Expand Down
Loading
Loading