Skip to content

Commit

Permalink
merge value and literal
Browse files Browse the repository at this point in the history
  • Loading branch information
andyfengHKU committed Jan 17, 2023
1 parent ce0b859 commit 7777c75
Show file tree
Hide file tree
Showing 62 changed files with 923 additions and 831 deletions.
4 changes: 2 additions & 2 deletions src/binder/bind/bind_copy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,15 @@ CSVReaderConfig Binder::bindParsingOptions(
"The value type of parsing csv option " + copyOptionName + " must be boolean.");
}
csvReaderConfig.hasHeader =
((LiteralExpression&)(*boundCopyOptionExpression)).literal->val.booleanVal;
((LiteralExpression&)(*boundCopyOptionExpression)).value->getValue<bool>();
} else if (boundCopyOptionExpression->dataType.typeID == STRING &&
isValidStringParsingOption) {
if (boundCopyOptionExpression->dataType.typeID != STRING) {
throw BinderException(
"The value type of parsing csv option " + copyOptionName + " must be string.");
}
auto copyOptionValue =
((LiteralExpression&)(*boundCopyOptionExpression)).literal->strVal;
((LiteralExpression&)(*boundCopyOptionExpression)).value->getValue<string>();
bindStringParsingOptions(csvReaderConfig, copyOptionName, copyOptionValue);
} else {
throw BinderException("Unrecognized parsing csv option: " + copyOptionName + ".");
Expand Down
2 changes: 1 addition & 1 deletion src/binder/bind/bind_projection_clause.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ uint64_t Binder::bindSkipLimitExpression(const ParsedExpression& expression) {
((LiteralExpression&)(*boundExpression)).getDataType().typeID != INT64) {
throw BinderException("The number of rows to skip/limit must be a non-negative integer.");
}
return ((LiteralExpression&)(*boundExpression)).literal->val.int64Val;
return ((LiteralExpression&)(*boundExpression)).value->getValue<int64_t>();
}

void Binder::addExpressionsToScope(const expression_vector& projectionExpressions) {
Expand Down
43 changes: 21 additions & 22 deletions src/binder/expression_binder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -284,19 +284,18 @@ shared_ptr<Expression> ExpressionBinder::bindAggregateFunctionExpression(

shared_ptr<Expression> ExpressionBinder::staticEvaluate(const string& functionName,
const ParsedExpression& parsedExpression, const expression_vector& children) {
assert(children[0]->expressionType == common::LITERAL);
auto strVal = ((LiteralExpression*)children[0].get())->getValue()->getValue<string>();
if (functionName == CAST_TO_DATE_FUNC_NAME) {
auto strVal = ((LiteralExpression*)children[0].get())->literal->strVal;
return make_shared<LiteralExpression>(DataType(DATE),
make_unique<Literal>(Date::FromCString(strVal.c_str(), strVal.length())));
return make_shared<LiteralExpression>(
make_unique<Value>(Date::FromCString(strVal.c_str(), strVal.length())));
} else if (functionName == CAST_TO_TIMESTAMP_FUNC_NAME) {
auto strVal = ((LiteralExpression*)children[0].get())->literal->strVal;
return make_shared<LiteralExpression>(DataType(TIMESTAMP),
make_unique<Literal>(Timestamp::FromCString(strVal.c_str(), strVal.length())));
return make_shared<LiteralExpression>(
make_unique<Value>(Timestamp::FromCString(strVal.c_str(), strVal.length())));
} else {
assert(functionName == CAST_TO_INTERVAL_FUNC_NAME);
auto strVal = ((LiteralExpression*)children[0].get())->literal->strVal;
return make_shared<LiteralExpression>(DataType(INTERVAL),
make_unique<Literal>(Interval::FromCString(strVal.c_str(), strVal.length())));
return make_shared<LiteralExpression>(
make_unique<Value>(Interval::FromCString(strVal.c_str(), strVal.length())));
}
}

Expand Down Expand Up @@ -342,26 +341,26 @@ shared_ptr<Expression> ExpressionBinder::bindNodeLabelFunction(const Expression&
auto& node = (NodeExpression&)expression;
if (!node.isMultiLabeled()) {
auto labelName = catalogContent->getTableName(node.getSingleTableID());
return make_shared<LiteralExpression>(STRING, make_unique<Literal>(labelName));
return make_shared<LiteralExpression>(make_unique<Value>(labelName));
}
// bind string node labels as list literal
auto nodeTableIDs = catalogContent->getNodeTableIDs();
table_id_t maxNodeTableID = *std::max_element(nodeTableIDs.begin(), nodeTableIDs.end());
vector<Literal> nodeLabels;
vector<unique_ptr<Value>> nodeLabels;
nodeLabels.resize(maxNodeTableID + 1);
for (auto i = 0; i < nodeLabels.size(); ++i) {
if (catalogContent->containNodeTable(i)) {
nodeLabels[i] = Literal(catalogContent->getTableName(i));
nodeLabels[i] = make_unique<Value>(catalogContent->getTableName(i));
} else {
// TODO(Xiyang/Guodong): change to null literal once we support null in LIST type.
nodeLabels[i] = Literal(string(""));
nodeLabels[i] = make_unique<Value>(string(""));
}
}
auto literalDataType = DataType(LIST, make_unique<DataType>(STRING));
expression_vector children;
children.push_back(node.getInternalIDProperty());
children.push_back(make_shared<LiteralExpression>(
literalDataType, make_unique<Literal>(nodeLabels, literalDataType)));
children.push_back(
make_shared<LiteralExpression>(make_unique<Value>(literalDataType, std::move(nodeLabels))));
auto execFunc = NodeLabelVectorOperation::execFunction;
auto uniqueExpressionName = ScalarFunctionExpression::getUniqueName(LABEL_FUNC_NAME, children);
return make_shared<ScalarFunctionExpression>(
Expand All @@ -375,25 +374,25 @@ shared_ptr<Expression> ExpressionBinder::bindParameterExpression(
if (parameterMap.contains(parameterName)) {
return make_shared<ParameterExpression>(parameterName, parameterMap.at(parameterName));
} else {
auto literal = make_shared<Literal>();
parameterMap.insert({parameterName, literal});
return make_shared<ParameterExpression>(parameterName, literal);
auto value = make_shared<Value>(Value::createNullValue());
parameterMap.insert({parameterName, value});
return make_shared<ParameterExpression>(parameterName, value);
}
}

shared_ptr<Expression> ExpressionBinder::bindLiteralExpression(
const ParsedExpression& parsedExpression) {
auto& literalExpression = (ParsedLiteralExpression&)parsedExpression;
auto literal = literalExpression.getLiteral();
if (literal->isNull()) {
auto value = literalExpression.getValue();
if (value->isNull()) {
return bindNullLiteralExpression();
}
return make_shared<LiteralExpression>(literal->dataType, make_unique<Literal>(*literal));
return make_shared<LiteralExpression>(value->copy());
}

shared_ptr<Expression> ExpressionBinder::bindNullLiteralExpression() {
return make_shared<LiteralExpression>(
DataType(ANY), make_unique<Literal>(), binder->getUniqueExpressionName("NULL"));
make_unique<Value>(Value::createNullValue()), binder->getUniqueExpressionName("NULL"));
}

shared_ptr<Expression> ExpressionBinder::bindVariableExpression(
Expand Down
26 changes: 14 additions & 12 deletions src/common/csv_reader/csv_reader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -266,51 +266,53 @@ interval_t CSVReader::getInterval() {
return retVal;
}

Literal CSVReader::getList(const DataType& dataType) {
Literal result(DataType(LIST, make_unique<DataType>(dataType)));
unique_ptr<Value> CSVReader::getList(const DataType& dataType) {
vector<unique_ptr<Value>> listVal;
// Move the linePtrStart one character forward, because hasNextToken() will first increment it.
CSVReader listCSVReader(line, linePtrEnd - 1, linePtrStart - 1, config);
while (listCSVReader.hasNextToken()) {
if (!listCSVReader.skipTokenIfNull()) {
unique_ptr<Value> val;
switch (dataType.typeID) {
case INT64: {
result.listVal.emplace_back(listCSVReader.getInt64());
val = make_unique<Value>(listCSVReader.getInt64());
} break;
case DOUBLE: {
result.listVal.emplace_back(listCSVReader.getDouble());
val = make_unique<Value>(listCSVReader.getDouble());
} break;
case BOOL: {
result.listVal.emplace_back((bool)listCSVReader.getBoolean());
val = make_unique<Value>((bool)listCSVReader.getBoolean());
} break;
case STRING: {
result.listVal.emplace_back(string(listCSVReader.getString()));
val = make_unique<Value>(string(listCSVReader.getString()));
} break;
case DATE: {
result.listVal.emplace_back(listCSVReader.getDate());
val = make_unique<Value>(listCSVReader.getDate());
} break;
case TIMESTAMP: {
result.listVal.emplace_back(listCSVReader.getTimestamp());
val = make_unique<Value>(listCSVReader.getTimestamp());
} break;
case INTERVAL: {
result.listVal.emplace_back(listCSVReader.getInterval());
val = make_unique<Value>(listCSVReader.getInterval());
} break;
case LIST: {
result.listVal.emplace_back(listCSVReader.getList(*dataType.childType));
val = listCSVReader.getList(*dataType.childType);
} break;
default:
throw ReaderException("Unsupported data type " +
Types::dataTypeToString(dataType.childType->typeID) +
" inside LIST");
}
listVal.push_back(std::move(val));
}
}
auto numBytesOfOverflow = result.listVal.size() * Types::getDataTypeSize(dataType.typeID);
auto numBytesOfOverflow = listVal.size() * Types::getDataTypeSize(dataType.typeID);
if (numBytesOfOverflow >= DEFAULT_PAGE_SIZE) {
throw ReaderException(StringUtils::string_format(
"Maximum num bytes of a LIST is %d. Input list's num bytes is %d.", DEFAULT_PAGE_SIZE,
numBytesOfOverflow));
}
return result;
return make_unique<Value>(DataType(LIST, make_unique<DataType>(dataType)), std::move(listVal));
}

void CSVReader::setNextTokenIsProcessed() {
Expand Down
39 changes: 0 additions & 39 deletions src/common/type_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,45 +93,6 @@ string TypeUtils::toString(const ku_list_t& val, const DataType& dataType) {
return result;
}

string TypeUtils::toString(const Literal& literal) {
if (literal.isNull()) {
return "NULL";
}
switch (literal.dataType.typeID) {
case BOOL:
return TypeUtils::toString(literal.val.booleanVal);
case INT64:
return TypeUtils::toString(literal.val.int64Val);
case DOUBLE:
return TypeUtils::toString(literal.val.doubleVal);
case NODE_ID:
return TypeUtils::toString(literal.val.nodeID);
case DATE:
return TypeUtils::toString(literal.val.dateVal);
case TIMESTAMP:
return TypeUtils::toString(literal.val.timestampVal);
case INTERVAL:
return TypeUtils::toString(literal.val.intervalVal);
case STRING:
return literal.strVal;
case LIST: {
if (literal.listVal.empty()) {
return "[]";
}
string result = "[";
for (auto i = 0u; i < literal.listVal.size() - 1; i++) {
result += toString(literal.listVal[i]) + ",";
}
result += toString(literal.listVal[literal.listVal.size() - 1]);
result += "]";
return result;
}
default:
throw RuntimeException("Invalid data type " + Types::dataTypeToString(literal.dataType) +
" for TypeUtils::toString.");
}
}

string TypeUtils::prefixConversionExceptionMessage(const char* data, DataTypeID dataTypeID) {
return "Cannot convert string " + string(data) + " to " + Types::dataTypeToString(dataTypeID) +
".";
Expand Down
2 changes: 1 addition & 1 deletion src/common/types/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ add_library(kuzu_common_types
interval_t.cpp
ku_list.cpp
ku_string.cpp
literal.cpp
value.cpp
timestamp_t.cpp
types.cpp)

Expand Down
78 changes: 0 additions & 78 deletions src/common/types/literal.cpp

This file was deleted.

Loading

0 comments on commit 7777c75

Please sign in to comment.