Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor storage index #3196

Merged
merged 47 commits into from
Nov 8, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
5e1867c
stash
cangfengzhs Sep 16, 2021
90e92c3
commit IndexEdge/VertexScanNode
cangfengzhs Sep 17, 2021
f8bf50c
commit IndexSelectionNode
cangfengzhs Sep 18, 2021
a7c93d2
commit Projection/Dedup Node
cangfengzhs Sep 18, 2021
f43ec57
commit IndexLimitNode
cangfengzhs Sep 18, 2021
3fb1792
stash
cangfengzhs Sep 24, 2021
e738d84
stash
cangfengzhs Sep 24, 2021
6efb958
stash
cangfengzhs Sep 28, 2021
9395f0a
stash
cangfengzhs Sep 29, 2021
1282dcd
add index int test
cangfengzhs Oct 11, 2021
97d5cdc
add double/string1 test
cangfengzhs Oct 13, 2021
7d4b275
add string2/string3 test
cangfengzhs Oct 14, 2021
f6b2e15
Merge remote-tracking branch 'vesoft/master' into reconsturct-storage…
cangfengzhs Oct 14, 2021
a1ef35a
finish index_scan_node unittest
cangfengzhs Oct 18, 2021
8942749
add index node test
cangfengzhs Oct 19, 2021
25d7173
pass lookupindex test
cangfengzhs Oct 20, 2021
8e66f10
Merge remote-tracking branch 'vesoft/master' into reconsturct-storage…
cangfengzhs Oct 20, 2021
48076d0
pass ttl test
cangfengzhs Oct 21, 2021
e9c9676
Merge remote-tracking branch 'vesoft/master' into reconsturct-storage…
cangfengzhs Oct 21, 2021
45006be
pass all unittest
cangfengzhs Oct 21, 2021
40ec7d0
remove debug log
cangfengzhs Oct 21, 2021
c428ea3
Merge remote-tracking branch 'vesoft/master' into reconsturct-storage…
cangfengzhs Oct 22, 2021
eab73be
fix bug
cangfengzhs Oct 22, 2021
4ec5d8a
fix bug
cangfengzhs Oct 23, 2021
2dcb1c0
Merge remote-tracking branch 'vesoft/master' into reconsturct-storage…
cangfengzhs Oct 25, 2021
8b9dc5d
fix bug
cangfengzhs Oct 25, 2021
c432c95
clear file
cangfengzhs Oct 25, 2021
c3d6734
clear some useless code
cangfengzhs Oct 25, 2021
4649285
add comments for IndexNode
cangfengzhs Oct 26, 2021
490a1be
add comments to IndexScanNode
cangfengzhs Oct 26, 2021
d6ebf10
ad comment to Selection/Projection/DedupNode
cangfengzhs Oct 26, 2021
27b15f9
fix some init bug
cangfengzhs Oct 27, 2021
5d8b86d
fix bug to support geo
cangfengzhs Oct 29, 2021
cd3c9cd
converge qualified strategy define together
cangfengzhs Oct 29, 2021
be050d0
Merge branch 'master' of https://github.com/vesoft-inc/nebula into re…
cangfengzhs Nov 1, 2021
bb26c9e
address comments
cangfengzhs Nov 1, 2021
4cc7506
address some comments; Modify IndexNode::next return Type
cangfengzhs Nov 1, 2021
e8edf14
fix bug
cangfengzhs Nov 2, 2021
ab06655
add some comments
cangfengzhs Nov 2, 2021
a0401b8
Merge remote-tracking branch 'vesoft/master' into reconsturct-storage…
cangfengzhs Nov 2, 2021
377655d
Add blank lines between function definitions
cangfengzhs Nov 3, 2021
8d7ed4f
fix compile error
cangfengzhs Nov 4, 2021
2958207
Merge remote-tracking branch 'vesoft/master' into reconsturct-storage…
cangfengzhs Nov 4, 2021
56bf441
modify new file license
cangfengzhs Nov 4, 2021
d4a6512
Modify test to avoid the bug mentioned in issue3191
cangfengzhs Nov 8, 2021
4c9aec4
Merge remote-tracking branch 'vesoft/master' into reconsturct-storage…
cangfengzhs Nov 8, 2021
2ff0617
modify license error
cangfengzhs Nov 8, 2021
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
55 changes: 28 additions & 27 deletions src/common/utils/IndexKeyUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,14 @@
#ifndef COMMON_UTILS_INDEXKEYUTILS_H_
#define COMMON_UTILS_INDEXKEYUTILS_H_

#include <cmath>

#include "codec/RowReader.h"
#include "common/base/Base.h"
#include "common/base/StatusOr.h"
#include "common/geo/GeoIndex.h"
#include "common/utils/Types.h"
#include "interface/gen-cpp2/meta_types.h"

namespace nebula {

using PropertyType = nebula::cpp2::PropertyType;
Expand Down Expand Up @@ -197,39 +198,39 @@ class IndexKeyUtils final {
*/

static std::string encodeDouble(double v) {
if (v < 0) {
/**
* TODO : now, the -(std::numeric_limits<double>::min())
* have a problem of precision overflow. current return value is -nan.
*/
auto* c1 = reinterpret_cast<const char*>(&v);
auto i = *reinterpret_cast<const int64_t*>(c1);
i = -(std::numeric_limits<int64_t>::max() + i);
auto* c2 = reinterpret_cast<const char*>(&i);
v = *reinterpret_cast<const double*>(c2);
if (std::isnan(v)) {
return std::string(sizeof(double), '\xFF');
} else if (v >= 0) {
auto val = folly::Endian::big(v);
auto* c = reinterpret_cast<char*>(&val);
c[0] |= 0x80;
std::string raw;
raw.reserve(sizeof(double));
raw.append(c, sizeof(double));
return raw;
} else {
int64_t* x = reinterpret_cast<int64_t*>(&v);
*x = ~(*x);
auto val = folly::Endian::big(v);
auto* c = reinterpret_cast<char*>(&val);
std::string raw;
raw.reserve(sizeof(double));
raw.append(c, sizeof(double));
return raw;
}
auto val = folly::Endian::big(v);
auto* c = reinterpret_cast<char*>(&val);
c[0] ^= 0x80;
std::string raw;
raw.reserve(sizeof(double));
raw.append(c, sizeof(double));
return raw;
}

static double decodeDouble(const folly::StringPiece& raw) {
char* v = const_cast<char*>(raw.data());
v[0] ^= 0x80;
auto val = *reinterpret_cast<const double*>(v);
int64_t val = *reinterpret_cast<const int64_t*>(raw.data());
val = folly::Endian::big(val);
if (val < 0) {
auto* c1 = reinterpret_cast<const char*>(&val);
auto i = *reinterpret_cast<const int64_t*>(c1);
i = -(std::numeric_limits<int64_t>::max() + i);
auto* c2 = reinterpret_cast<const char*>(&i);
val = *reinterpret_cast<const double*>(c2);
val &= 0x7fffffffffffffff;
} else {
val = ~val;
}
return val;
double ret;
::memcpy(&ret, &val, 8);
return ret;
}

static std::string encodeTime(const nebula::Time& t) {
Expand Down
3 changes: 3 additions & 0 deletions src/common/utils/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ nebula_add_test(
$<TARGET_OBJECTS:wkt_wkb_io_obj>
$<TARGET_OBJECTS:meta_thrift_obj>
$<TARGET_OBJECTS:common_thrift_obj>
$<TARGET_OBJECTS:storage_thrift_obj>
$<TARGET_OBJECTS:geo_index_obj>
LIBRARIES
gtest
Expand All @@ -30,6 +31,7 @@ nebula_add_test(
$<TARGET_OBJECTS:wkt_wkb_io_obj>
$<TARGET_OBJECTS:meta_thrift_obj>
$<TARGET_OBJECTS:common_thrift_obj>
$<TARGET_OBJECTS:storage_thrift_obj>
$<TARGET_OBJECTS:geo_index_obj>
LIBRARIES
gtest
Expand All @@ -52,6 +54,7 @@ nebula_add_test(
$<TARGET_OBJECTS:wkt_wkb_io_obj>
$<TARGET_OBJECTS:meta_thrift_obj>
$<TARGET_OBJECTS:common_thrift_obj>
$<TARGET_OBJECTS:storage_thrift_obj>
$<TARGET_OBJECTS:geo_index_obj>
LIBRARIES
gtest
Expand Down
2 changes: 2 additions & 0 deletions src/daemons/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ set(storage_meta_deps
$<TARGET_OBJECTS:raftex_thrift_obj>
$<TARGET_OBJECTS:hdfs_helper_obj>
$<TARGET_OBJECTS:ft_es_storage_adapter_obj>
$<TARGET_OBJECTS:storage_thrift_obj>
$<TARGET_OBJECTS:geo_index_obj>
)

Expand Down Expand Up @@ -128,6 +129,7 @@ nebula_add_executable(
$<TARGET_OBJECTS:charset_obj>
$<TARGET_OBJECTS:graph_obj>
$<TARGET_OBJECTS:ft_es_graph_adapter_obj>
$<TARGET_OBJECTS:storage_thrift_obj>
$<TARGET_OBJECTS:geo_index_obj>
${common_deps}
LIBRARIES
Expand Down
13 changes: 1 addition & 12 deletions src/graph/optimizer/OptimizerUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -464,18 +464,7 @@ Value OptimizerUtils::normalizeValue(const meta::cpp2::ColumnDef& col, const Val
if (!col.type.type_length_ref().has_value()) {
return Value::kNullBadType;
}
if (!v.isStr()) {
return v;
}
auto len = static_cast<size_t>(*col.get_type().get_type_length());
if (v.getStr().size() > len) {
return Value(v.getStr().substr(0, len));
} else {
std::string s;
s.reserve(len);
s.append(v.getStr()).append(len - v.getStr().size(), '\0');
return Value(std::move(s));
}
return v;
}
case Value::Type::__EMPTY__:
case Value::Type::NULLVALUE:
Expand Down
4 changes: 4 additions & 0 deletions src/interface/storage.thrift
Original file line number Diff line number Diff line change
Expand Up @@ -506,6 +506,10 @@ struct IndexColumnHint {
2: ScanType scan_type,
3: common.Value begin_value,
4: common.Value end_value,
// When `columnhint` means ` >= begin_value`, `include_begin` is true
// and include_end is similar
5: bool include_begin = true,
6: bool include_end = false,
cangfengzhs marked this conversation as resolved.
Show resolved Hide resolved
}

struct IndexQueryContext {
Expand Down
1 change: 1 addition & 0 deletions src/kvstore/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ set(KVSTORE_TEST_LIBS
$<TARGET_OBJECTS:ft_es_storage_adapter_obj>
$<TARGET_OBJECTS:version_obj>
$<TARGET_OBJECTS:ssl_obj>
$<TARGET_OBJECTS:storage_thrift_obj>
$<TARGET_OBJECTS:geo_index_obj>
)

Expand Down
9 changes: 9 additions & 0 deletions src/storage/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ nebula_add_library(
nebula_add_library(
graph_storage_service_handler OBJECT
GraphStorageServiceHandler.cpp
ExprVisitorBase.cpp
context/StorageExpressionContext.cpp
mutate/AddVerticesProcessor.cpp
mutate/DeleteVerticesProcessor.cpp
Expand All @@ -40,6 +41,14 @@ nebula_add_library(
query/ScanVertexProcessor.cpp
query/ScanEdgeProcessor.cpp
index/LookupProcessor.cpp
exec/IndexNode.cpp
exec/IndexDedupNode.cpp
exec/IndexEdgeScanNode.cpp
exec/IndexLimitNode.cpp
exec/IndexProjectionNode.cpp
exec/IndexScanNode.cpp
exec/IndexSelectionNode.cpp
exec/IndexVertexScanNode.cpp
)

nebula_add_library(
Expand Down
3 changes: 3 additions & 0 deletions src/storage/CommonUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,9 @@ struct RuntimeContext {
ObjectPool* objPool() { return &planContext_->objPool_; }

bool isPlanKilled() {
if (env() == nullptr) {
return false;
}
return env()->metaClient_ &&
env()->metaClient_->checkIsPlanKilled(planContext_->sessionId_, planContext_->planId_);
}
Expand Down
85 changes: 85 additions & 0 deletions src/storage/ExprVisitorBase.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/* Copyright (c) 2021 vesoft inc. All rights reserved.
*
* This source code is licensed under Apache 2.0 License.
*/
#include "storage/ExprVisitorBase.h"
namespace nebula {
namespace storage {
void ExprVisitorBase::visit(ConstantExpression *expr) { UNUSED(expr); }
void ExprVisitorBase::visit(UnaryExpression *expr) { expr->operand()->accept(this); }
void ExprVisitorBase::visit(TypeCastingExpression *expr) { expr->operand()->accept(this); }
void ExprVisitorBase::visit(LabelExpression *expr) { fatal(expr); }
void ExprVisitorBase::visit(LabelAttributeExpression *expr) { fatal(expr); }
// binary expression
void ExprVisitorBase::visit(ArithmeticExpression *expr) {
expr->left()->accept(this);
expr->right()->accept(this);
}
void ExprVisitorBase::visit(RelationalExpression *expr) {
expr->left()->accept(this);
expr->right()->accept(this);
}
void ExprVisitorBase::visit(SubscriptExpression *expr) {
expr->left()->accept(this);
expr->right()->accept(this);
}
void ExprVisitorBase::visit(AttributeExpression *expr) { fatal(expr); }
void ExprVisitorBase::visit(LogicalExpression *expr) {
for (auto operand : expr->operands()) {
operand->accept(this);
}
}
// function call
void ExprVisitorBase::visit(FunctionCallExpression *expr) {
for (auto arg : expr->args()->args()) {
arg->accept(this);
}
}
void ExprVisitorBase::visit(AggregateExpression *expr) { fatal(expr); }
void ExprVisitorBase::visit(UUIDExpression *expr) { UNUSED(expr); }
// variable expression
void ExprVisitorBase::visit(VariableExpression *expr) { fatal(expr); }
void ExprVisitorBase::visit(VersionedVariableExpression *expr) { fatal(expr); }
// container expression
void ExprVisitorBase::visit(ListExpression *expr) {
for (auto item : expr->items()) {
item->accept(this);
}
}
void ExprVisitorBase::visit(SetExpression *expr) {
for (auto item : expr->items()) {
item->accept(this);
}
}
void ExprVisitorBase::visit(MapExpression *expr) { UNUSED(expr); }
// property Expression
void ExprVisitorBase::visit(TagPropertyExpression *expr) { UNUSED(expr); }
void ExprVisitorBase::visit(EdgePropertyExpression *expr) { UNUSED(expr); }
void ExprVisitorBase::visit(InputPropertyExpression *expr) { UNUSED(expr); }
void ExprVisitorBase::visit(VariablePropertyExpression *expr) { UNUSED(expr); }
void ExprVisitorBase::visit(DestPropertyExpression *expr) { UNUSED(expr); }
void ExprVisitorBase::visit(SourcePropertyExpression *expr) { UNUSED(expr); }
void ExprVisitorBase::visit(EdgeSrcIdExpression *expr) { UNUSED(expr); }
void ExprVisitorBase::visit(EdgeTypeExpression *expr) { UNUSED(expr); }
void ExprVisitorBase::visit(EdgeRankExpression *expr) { UNUSED(expr); }
void ExprVisitorBase::visit(EdgeDstIdExpression *expr) { UNUSED(expr); }
// vertex/edge expression
void ExprVisitorBase::visit(VertexExpression *expr) { UNUSED(expr); }
void ExprVisitorBase::visit(EdgeExpression *expr) { UNUSED(expr); }
// case expression
void ExprVisitorBase::visit(CaseExpression *expr) { UNUSED(expr); }
// path build expression
void ExprVisitorBase::visit(PathBuildExpression *expr) { fatal(expr); }
// column expression
void ExprVisitorBase::visit(ColumnExpression *expr) { fatal(expr); }
// predicate expression
void ExprVisitorBase::visit(PredicateExpression *expr) { fatal(expr); }
// list comprehension expression
void ExprVisitorBase::visit(ListComprehensionExpression *expr) { fatal(expr); }
// reduce expression
void ExprVisitorBase::visit(ReduceExpression *expr) { fatal(expr); }
// subscript range expression
void ExprVisitorBase::visit(SubscriptRangeExpression *expr) { fatal(expr); }

} // namespace storage
} // namespace nebula
71 changes: 71 additions & 0 deletions src/storage/ExprVisitorBase.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/* Copyright (c) 2021 vesoft inc. All rights reserved.
*
* This source code is licensed under Apache 2.0 License.
*/

#pragma once
#include "common/expression/ExprVisitor.h"
namespace nebula {
namespace storage {

class ExprVisitorBase : public ::nebula::ExprVisitor {
public:
void visit(ConstantExpression *expr) override;
void visit(UnaryExpression *expr) override;
void visit(TypeCastingExpression *expr) override;
void visit(LabelExpression *expr) override;
void visit(LabelAttributeExpression *expr) override;
// binary expression
void visit(ArithmeticExpression *expr) override;
void visit(RelationalExpression *expr) override;
void visit(SubscriptExpression *expr) override;
void visit(AttributeExpression *expr) override;
void visit(LogicalExpression *expr) override;
// function call
void visit(FunctionCallExpression *expr) override;
void visit(AggregateExpression *expr) override;
void visit(UUIDExpression *expr) override;
// variable expression
void visit(VariableExpression *expr) override;
void visit(VersionedVariableExpression *expr) override;
// container expression
void visit(ListExpression *expr) override;
void visit(SetExpression *expr) override;
void visit(MapExpression *expr) override;
// property Expression
void visit(TagPropertyExpression *expr) override;
void visit(EdgePropertyExpression *expr) override;
void visit(InputPropertyExpression *expr) override;
void visit(VariablePropertyExpression *expr) override;
void visit(DestPropertyExpression *expr) override;
void visit(SourcePropertyExpression *expr) override;
void visit(EdgeSrcIdExpression *expr) override;
void visit(EdgeTypeExpression *expr) override;
void visit(EdgeRankExpression *expr) override;
void visit(EdgeDstIdExpression *expr) override;
// vertex/edge expression
void visit(VertexExpression *expr) override;
void visit(EdgeExpression *expr) override;
// case expression
void visit(CaseExpression *expr) override;
// path build expression
void visit(PathBuildExpression *expr) override;
// column expression
void visit(ColumnExpression *expr) override;
// predicate expression
void visit(PredicateExpression *expr) override;
// list comprehension expression
void visit(ListComprehensionExpression *expr) override;
// reduce expression
void visit(ReduceExpression *expr) override;
// subscript range expression
void visit(SubscriptRangeExpression *expr) override;

private:
using ::nebula::ExprVisitor::visit;
inline void fatal(Expression *expr) {
LOG(FATAL) << "Unexpect expression kind " << static_cast<int>(expr->kind()) << " at storage";
}
};
} // namespace storage
} // namespace nebula
Loading