Skip to content

Commit

Permalink
Add node evaluator
Browse files Browse the repository at this point in the history
  • Loading branch information
andyfengHKU committed Jun 29, 2023
1 parent 7a6de1d commit 91439ca
Show file tree
Hide file tree
Showing 19 changed files with 210 additions and 203 deletions.
2 changes: 1 addition & 1 deletion src/common/types/value.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ std::string Value::toString() const {
return nestedTypeVal[0]->toString();
}
case LogicalTypeID::RECURSIVE_REL:
case LogicalTypeID::STRUCT:{
case LogicalTypeID::STRUCT: {
std::string result = "{";
auto fieldNames = StructType::getFieldNames(&dataType);
for (auto i = 0u; i < nestedTypeVal.size(); ++i) {
Expand Down
6 changes: 6 additions & 0 deletions src/include/binder/expression/node_expression.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@ class NodeExpression : public NodeOrRelExpression {
return internalIDExpression->getUniqueName();
}

expression_vector getChildren() const override {
auto result = NodeOrRelExpression::getChildren();
result.push_back(internalIDExpression->copy());
return result;
}

private:
std::unique_ptr<Expression> internalIDExpression;
};
Expand Down
2 changes: 1 addition & 1 deletion src/include/expression_evaluator/node_rel_evaluator.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class NodeExpressionEvaluator : public BaseExpressionEvaluator {

void evaluate() override;

bool select(common::SelectionVector &selVector) override {
bool select(common::SelectionVector& selVector) override {
throw common::NotImplementedException("NodeExpressionEvaluator::select");
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/query_result.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ void QueryResult::initResultTableAndIterator(
columnNames.push_back(columnName);
auto expressionsToCollect = expressionToCollectPerColumn[i];
std::unique_ptr<Value> value;
if (columnType.getLogicalTypeID() == common::LogicalTypeID::REL) {
if (columnType.getLogicalTypeID() == common::LogicalTypeID::REL) {
// first expression is src node ID.
assert(expressionsToCollect[0]->dataType.getLogicalTypeID() ==
common::LogicalTypeID::INTERNAL_ID);
Expand Down
2 changes: 1 addition & 1 deletion src/optimizer/agg_key_dependency_optimizer.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include "optimizer/agg_key_dependency_optimizer.h"

#include "binder/expression/property_expression.h"
#include "binder/expression/node_expression.h"
#include "binder/expression/property_expression.h"
#include "planner/logical_plan/logical_operator/logical_aggregate.h"
#include "planner/logical_plan/logical_operator/logical_distinct.h"

Expand Down
7 changes: 3 additions & 4 deletions src/optimizer/projection_push_down_optimizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -224,14 +224,13 @@ void ProjectionPushDownOptimizer::visitSetRelProperty(planner::LogicalOperator*
// See comments above this class for how to collect expressions in use.
void ProjectionPushDownOptimizer::collectExpressionsInUse(
std::shared_ptr<binder::Expression> expression) {
if (expression->expressionType == common::VARIABLE) {
variablesInUse.insert(std::move(expression));
return;
}
if (expression->expressionType == common::PROPERTY) {
propertiesInUse.insert(std::move(expression));
return;
}
if (expression->expressionType == common::VARIABLE) {
variablesInUse.insert(expression);
}
for (auto& child : expression->getChildren()) {
collectExpressionsInUse(child);
}
Expand Down
5 changes: 5 additions & 0 deletions src/planner/projection_planner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,11 @@ expression_vector ProjectionPlanner::getExpressionToGroupBy(
for (auto& expression : expressionsToProject) {
if (getSubAggregateExpressionsNotInScope(expression, schema).empty()) {
expressionsToGroupBy.push_back(expression);
if (expression->expressionType == common::VARIABLE &&
expression->dataType.getLogicalTypeID() == common::LogicalTypeID::NODE) {
auto node = (NodeExpression*)expression.get();
expressionsToGroupBy.push_back(node->getInternalIDProperty());
}
}
}
return expressionsToGroupBy;
Expand Down
2 changes: 1 addition & 1 deletion src/processor/mapper/expression_mapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
#include "expression_evaluator/case_evaluator.h"
#include "expression_evaluator/function_evaluator.h"
#include "expression_evaluator/literal_evaluator.h"
#include "expression_evaluator/node_rel_evaluator.h"
#include "expression_evaluator/reference_evaluator.h"
#include "planner/logical_plan/logical_operator/schema.h"
#include "expression_evaluator/node_rel_evaluator.h"

using namespace kuzu::binder;
using namespace kuzu::common;
Expand Down
3 changes: 1 addition & 2 deletions src/processor/operator/aggregate/aggregate_hash_table.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ void AggregateHashTable::initializeFT(
auto dataChunkPos = 0u;
std::unique_ptr<FactorizedTableSchema> tableSchema = std::make_unique<FactorizedTableSchema>();
aggStateColIdxInFT = keyDataTypes.size() + dependentKeyDataTypes.size();
compareFuncs.resize(aggStateColIdxInFT);
compareFuncs.resize(keyDataTypes.size());
auto colIdx = 0u;
for (auto& dataType : keyDataTypes) {
auto size = LogicalTypeUtils::getRowLayoutSize(dataType);
Expand All @@ -151,7 +151,6 @@ void AggregateHashTable::initializeFT(
auto size = LogicalTypeUtils::getRowLayoutSize(dataType);
tableSchema->appendColumn(std::make_unique<ColumnSchema>(isUnflat, dataChunkPos, size));
hasStrCol = hasStrCol || dataType.getLogicalTypeID() == LogicalTypeID::STRING;
getCompareEntryWithKeysFunc(dataType.getPhysicalType(), compareFuncs[colIdx]);
numBytesForDependentKeys += size;
colIdx++;
}
Expand Down
96 changes: 47 additions & 49 deletions test/c_api/value_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -520,13 +520,11 @@ TEST_F(CApiValueTest, GetInternalID) {
auto flatTuple = kuzu_query_result_get_next(result);
auto value = kuzu_flat_tuple_get_value(flatTuple, 0);
ASSERT_TRUE(value->_is_owned_by_cpp);
auto node = kuzu_value_get_node_val(value);
auto nodeIDVal = kuzu_node_val_get_id_val(node);
auto nodeIDVal = kuzu_value_get_struct_field_value(value, 0 /* internal ID field idx */);
auto internalID = kuzu_value_get_internal_id(nodeIDVal);
ASSERT_EQ(internalID.table_id, 0);
ASSERT_EQ(internalID.offset, 0);
kuzu_value_destroy(nodeIDVal);
kuzu_node_val_destroy(node);
kuzu_value_destroy(value);
kuzu_flat_tuple_destroy(flatTuple);
kuzu_query_result_destroy(result);
Expand Down Expand Up @@ -729,52 +727,52 @@ TEST_F(CApiValueTest, NodeValAddProperty) {
kuzu_node_val_destroy(nodeVal);
}

TEST_F(CApiValueTest, NodeValGetProperty) {
auto connection = getConnection();
auto result =
kuzu_connection_query(connection, (char*)"MATCH (a:person) RETURN a ORDER BY a.ID");
ASSERT_TRUE(kuzu_query_result_is_success(result));
ASSERT_TRUE(kuzu_query_result_has_next(result));
auto flatTuple = kuzu_query_result_get_next(result);
auto value = kuzu_flat_tuple_get_value(flatTuple, 0);
ASSERT_TRUE(value->_is_owned_by_cpp);
auto node = kuzu_value_get_node_val(value);
auto propertyName = kuzu_node_val_get_property_name_at(node, 0);
ASSERT_STREQ(propertyName, "ID");
free(propertyName);
propertyName = kuzu_node_val_get_property_name_at(node, 1);
ASSERT_STREQ(propertyName, "fName");
free(propertyName);
propertyName = kuzu_node_val_get_property_name_at(node, 2);
ASSERT_STREQ(propertyName, "gender");
free(propertyName);
propertyName = kuzu_node_val_get_property_name_at(node, 3);
ASSERT_STREQ(propertyName, "isStudent");
free(propertyName);

auto propertyValue = kuzu_node_val_get_property_value_at(node, 0);
auto propertyValueID = kuzu_value_get_int64(propertyValue);
ASSERT_EQ(propertyValueID, 0);
kuzu_value_destroy(propertyValue);
propertyValue = kuzu_node_val_get_property_value_at(node, 1);
auto propertyValuefName = kuzu_value_get_string(propertyValue);
ASSERT_STREQ(propertyValuefName, "Alice");
free(propertyValuefName);
kuzu_value_destroy(propertyValue);
propertyValue = kuzu_node_val_get_property_value_at(node, 2);
auto propertyValueGender = kuzu_value_get_int64(propertyValue);
ASSERT_EQ(propertyValueGender, 1);
kuzu_value_destroy(propertyValue);
propertyValue = kuzu_node_val_get_property_value_at(node, 3);
auto propertyValueIsStudent = kuzu_value_get_bool(propertyValue);
ASSERT_EQ(propertyValueIsStudent, true);
kuzu_value_destroy(propertyValue);

kuzu_node_val_destroy(node);
kuzu_value_destroy(value);
kuzu_flat_tuple_destroy(flatTuple);
kuzu_query_result_destroy(result);
}
//TEST_F(CApiValueTest, NodeValGetProperty) {
// auto connection = getConnection();
// auto result =
// kuzu_connection_query(connection, (char*)"MATCH (a:person) RETURN a ORDER BY a.ID");
// ASSERT_TRUE(kuzu_query_result_is_success(result));
// ASSERT_TRUE(kuzu_query_result_has_next(result));
// auto flatTuple = kuzu_query_result_get_next(result);
// auto value = kuzu_flat_tuple_get_value(flatTuple, 0);
// ASSERT_TRUE(value->_is_owned_by_cpp);
// auto node = kuzu_value_get_node_val(value);
// auto propertyName = kuzu_node_val_get_property_name_at(node, 0);
// ASSERT_STREQ(propertyName, "ID");
// free(propertyName);
// propertyName = kuzu_node_val_get_property_name_at(node, 1);
// ASSERT_STREQ(propertyName, "fName");
// free(propertyName);
// propertyName = kuzu_node_val_get_property_name_at(node, 2);
// ASSERT_STREQ(propertyName, "gender");
// free(propertyName);
// propertyName = kuzu_node_val_get_property_name_at(node, 3);
// ASSERT_STREQ(propertyName, "isStudent");
// free(propertyName);
//
// auto propertyValue = kuzu_node_val_get_property_value_at(node, 0);
// auto propertyValueID = kuzu_value_get_int64(propertyValue);
// ASSERT_EQ(propertyValueID, 0);
// kuzu_value_destroy(propertyValue);
// propertyValue = kuzu_node_val_get_property_value_at(node, 1);
// auto propertyValuefName = kuzu_value_get_string(propertyValue);
// ASSERT_STREQ(propertyValuefName, "Alice");
// free(propertyValuefName);
// kuzu_value_destroy(propertyValue);
// propertyValue = kuzu_node_val_get_property_value_at(node, 2);
// auto propertyValueGender = kuzu_value_get_int64(propertyValue);
// ASSERT_EQ(propertyValueGender, 1);
// kuzu_value_destroy(propertyValue);
// propertyValue = kuzu_node_val_get_property_value_at(node, 3);
// auto propertyValueIsStudent = kuzu_value_get_bool(propertyValue);
// ASSERT_EQ(propertyValueIsStudent, true);
// kuzu_value_destroy(propertyValue);
//
// kuzu_node_val_destroy(node);
// kuzu_value_destroy(value);
// kuzu_flat_tuple_destroy(flatTuple);
// kuzu_query_result_destroy(result);
//}

TEST_F(CApiValueTest, NodeValToString) {
auto internalID = kuzu_internal_id_t{1, 123};
Expand Down
10 changes: 5 additions & 5 deletions test/runner/e2e_ddl_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -209,11 +209,11 @@ class TinySnbDDLTest : public DBTest {
auto result = conn->query("MATCH (p:person) RETURN * ORDER BY p.ID LIMIT 1");
ASSERT_EQ(TestHelper::convertResultToString(*result),
std::vector<std::string>{
"(label:person, 0:0, {ID:0, fName:Alice, isStudent:True, isWorker:False, age:35, "
"eyeSight:5.000000, birthdate:1900-01-01, registerTime:2011-08-20 11:25:30, "
"lastJobDuration:3 years 2 days 13:02:00, workedHours:[10,5], "
"usedNames:[Aida], courseScoresPerTerm:[[10,8],[6,7,8]], grades:[96,54,86,92], "
"height:1.731000})"});
"{_ID: 0:0, _LABEL: person, ID: 0, FNAME: Alice, ISSTUDENT: True, ISWORKER: False, "
"AGE: 35, EYESIGHT: 5.000000, BIRTHDATE: 1900-01-01, REGISTERTIME: 2011-08-20 "
"11:25:30, LASTJOBDURATION: 3 years 2 days 13:02:00, WORKEDHOURS: [10,5], "
"USEDNAMES: [Aida], COURSESCORESPERTERM: [[10,8],[6,7,8]], GRADES: [96,54,86,92], "
"HEIGHT: 1.731000}"});
}

void dropRelTableProperty(TransactionTestType transactionTestType) {
Expand Down
14 changes: 7 additions & 7 deletions test/test_files/copy/copy_node_csv.test
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
-LOG SubsetTest
-STATEMENT MATCH (row:tableOfTypes) WHERE row.id >= 20 AND row.id <= 24 RETURN *;
---- 5
(label:tableOfTypes, 0:20, {id:20, int64Column:0, doubleColumn:57.579280, booleanColumn:True, dateColumn:1731-09-26, timestampColumn:1731-09-26 03:30:08, stringColumn:OdM})
(label:tableOfTypes, 0:21, {id:21, int64Column:7, doubleColumn:64.630960, booleanColumn:False, dateColumn:1307-01-26, timestampColumn:1307-01-26 03:31:08, stringColumn:AjbxHQThEtDDlOjbzMjCQSXlvGQEjcFLykESrnFHwPKX})
(label:tableOfTypes, 0:22, {id:22, int64Column:71, doubleColumn:37.963386, booleanColumn:True, dateColumn:1455-07-26, timestampColumn:1455-07-26 03:07:03, stringColumn:dRvHHdyNXYfSUcicaxBoQEKQUfgex})
(label:tableOfTypes, 0:23, {id:23, int64Column:58, doubleColumn:42.774957, booleanColumn:False, dateColumn:1181-10-16, timestampColumn:1181-10-16 18:19:43, stringColumn:ISImRVpUjynGMFRQyYmeIUVjM})
(label:tableOfTypes, 0:24, {id:24, int64Column:75, doubleColumn:53.813224, booleanColumn:False, dateColumn:1942-10-24, timestampColumn:1942-10-24 09:30:16, stringColumn:naDlQ})
{_ID: 0:20, _LABEL: tableOfTypes, ID: 20, INT64COLUMN: 0, DOUBLECOLUMN: 57.579280, BOOLEANCOLUMN: True, DATECOLUMN: 1731-09-26, TIMESTAMPCOLUMN: 1731-09-26 03:30:08, STRINGCOLUMN: OdM}
{_ID: 0:21, _LABEL: tableOfTypes, ID: 21, INT64COLUMN: 7, DOUBLECOLUMN: 64.630960, BOOLEANCOLUMN: False, DATECOLUMN: 1307-01-26, TIMESTAMPCOLUMN: 1307-01-26 03:31:08, STRINGCOLUMN: AjbxHQThEtDDlOjbzMjCQSXlvGQEjcFLykESrnFHwPKX}
{_ID: 0:22, _LABEL: tableOfTypes, ID: 22, INT64COLUMN: 71, DOUBLECOLUMN: 37.963386, BOOLEANCOLUMN: True, DATECOLUMN: 1455-07-26, TIMESTAMPCOLUMN: 1455-07-26 03:07:03, STRINGCOLUMN: dRvHHdyNXYfSUcicaxBoQEKQUfgex}
{_ID: 0:23, _LABEL: tableOfTypes, ID: 23, INT64COLUMN: 58, DOUBLECOLUMN: 42.774957, BOOLEANCOLUMN: False, DATECOLUMN: 1181-10-16, TIMESTAMPCOLUMN: 1181-10-16 18:19:43, STRINGCOLUMN: ISImRVpUjynGMFRQyYmeIUVjM}
{_ID: 0:24, _LABEL: tableOfTypes, ID: 24, INT64COLUMN: 75, DOUBLECOLUMN: 53.813224, BOOLEANCOLUMN: False, DATECOLUMN: 1942-10-24, TIMESTAMPCOLUMN: 1942-10-24 09:30:16, STRINGCOLUMN: naDlQ}

-LOG CheckNumLinesTest
-STATEMENT MATCH (row:tableOfTypes) RETURN count(*)
Expand All @@ -37,7 +37,7 @@
-LOG EmptyStringTest
-STATEMENT MATCH (row:tableOfTypes) WHERE row.id = 49992 RETURN *;
---- 1
(label:tableOfTypes, 0:49992, {id:49992, int64Column:50, doubleColumn:31.582059, booleanColumn:False, dateColumn:1551-07-19, timestampColumn:1551-07-19 16:28:31, stringColumn:})
{_ID: 0:49992, _LABEL: tableOfTypes, ID: 49992, INT64COLUMN: 50, DOUBLECOLUMN: 31.582059, BOOLEANCOLUMN: False, DATECOLUMN: 1551-07-19, TIMESTAMPCOLUMN: 1551-07-19 16:28:31, }

-LOG FloatTest
-STATEMENT MATCH (row:tableOfTypes) WHERE row.doubleColumn = 68.73718401556897 RETURN row.dateColumn;
Expand All @@ -47,7 +47,7 @@
-LOG DateTest
-STATEMENT MATCH (row:tableOfTypes) WHERE row.id = 25531 RETURN *;
---- 1
(label:tableOfTypes, 0:25531, {id:25531, int64Column:77, doubleColumn:28.417543, booleanColumn:False, dateColumn:1895-03-13, timestampColumn:1895-03-13 04:31:22, stringColumn:XB})
{_ID: 0:25531, _LABEL: tableOfTypes, ID: 25531, INT64COLUMN: 77, DOUBLECOLUMN: 28.417543, BOOLEANCOLUMN: False, DATECOLUMN: 1895-03-13, TIMESTAMPCOLUMN: 1895-03-13 04:31:22, STRINGCOLUMN: XB}

-LOG IntervalTest
-STATEMENT MATCH (row:tableOfTypes) WHERE 0 <= row.doubleColumn AND row.doubleColumn <= 10 AND 0 <= row.int64Column AND row.int64Column <= 10 RETURN count(*);
Expand Down
Loading

0 comments on commit 91439ca

Please sign in to comment.