Kuzu C++ API
Loading...
Searching...
No Matches
expression.h
Go to the documentation of this file.
1#pragma once
2
3#include <functional>
4#include <memory>
5#include <unordered_map>
6#include <unordered_set>
7#include <vector>
8
9#include "assert.h"
10#include "cast.h"
11#include "copy_constructors.h"
12#include "expression_type.h"
13#include "internal.h"
14#include "types.h"
15
16namespace kuzu {
17namespace binder {
18
19class Expression;
20using expression_vector = std::vector<std::shared_ptr<Expression>>;
21using expression_pair = std::pair<std::shared_ptr<Expression>, std::shared_ptr<Expression>>;
22
23struct ExpressionHasher;
26 std::unordered_set<std::shared_ptr<Expression>, ExpressionHasher, ExpressionEquality>;
27template<typename T>
29 std::unordered_map<std::shared_ptr<Expression>, T, ExpressionHasher, ExpressionEquality>;
30
31class KUZU_API Expression : public std::enable_shared_from_this<Expression> {
33
34public:
39 // Create binary expression.
41 const std::shared_ptr<Expression>& left, const std::shared_ptr<Expression>& right,
42 std::string uniqueName)
43 : Expression{expressionType, std::move(dataType), expression_vector{left, right},
44 std::move(uniqueName)} {}
45 // Create unary expression.
47 const std::shared_ptr<Expression>& child, std::string uniqueName)
49 std::move(uniqueName)} {}
50 // Create leaf expression
56 virtual ~Expression() = default;
57
58 void setUniqueName(const std::string& name) { uniqueName = name; }
59 std::string getUniqueName() const {
60 KU_ASSERT(!uniqueName.empty());
61 return uniqueName;
62 }
63
64 virtual void cast(const common::LogicalType& type);
65 const common::LogicalType& getDataType() const { return dataType; }
66
67 void setAlias(const std::string& newAlias) { alias = newAlias; }
68 bool hasAlias() const { return !alias.empty(); }
69 std::string getAlias() const { return alias; }
70
71 common::idx_t getNumChildren() const { return children.size(); }
72 std::shared_ptr<Expression> getChild(common::idx_t idx) const {
73 KU_ASSERT(idx < children.size());
74 return children[idx];
75 }
77 void setChild(common::idx_t idx, std::shared_ptr<Expression> child) {
78 KU_ASSERT(idx < children.size());
79 children[idx] = std::move(child);
80 }
81
83
84 bool operator==(const Expression& rhs) const { return uniqueName == rhs.uniqueName; }
85
86 std::string toString() const { return hasAlias() ? alias : toStringInternal(); }
87
88 virtual std::unique_ptr<Expression> copy() const {
89 throw common::InternalException("Unimplemented expression copy().");
90 }
91
92 template<class TARGET>
93 TARGET& cast() {
95 }
96 template<class TARGET>
97 TARGET* ptrCast() {
99 }
100 template<class TARGET>
101 const TARGET& constCast() const {
103 }
104 template<class TARGET>
105 const TARGET* constPtrCast() const {
107 }
108
109protected:
110 virtual std::string toStringInternal() const = 0;
111
112public:
115
116protected:
117 // Name that serves as the unique identifier.
118 std::string uniqueName;
119 std::string alias;
121};
122
124 std::size_t operator()(const std::shared_ptr<Expression>& expression) const {
125 return std::hash<std::string>{}(expression->getUniqueName());
126 }
127};
128
130 bool operator()(const std::shared_ptr<Expression>& left,
131 const std::shared_ptr<Expression>& right) const {
132 return left->getUniqueName() == right->getUniqueName();
133 }
134};
135
136} // namespace binder
137} // namespace kuzu
#define KUZU_API
Definition api.h:25
#define KU_ASSERT(condition)
Definition assert.h:19
Definition expression.h:31
const TARGET * constPtrCast() const
Definition expression.h:105
bool operator==(const Expression &rhs) const
Definition expression.h:84
std::string uniqueName
Definition expression.h:118
std::string toString() const
Definition expression.h:86
expression_vector splitOnAND()
const common::LogicalType & getDataType() const
Definition expression.h:65
void setAlias(const std::string &newAlias)
Definition expression.h:67
std::shared_ptr< Expression > getChild(common::idx_t idx) const
Definition expression.h:72
common::ExpressionType expressionType
Definition expression.h:113
const TARGET & constCast() const
Definition expression.h:101
std::string getUniqueName() const
Definition expression.h:59
expression_vector children
Definition expression.h:120
virtual std::unique_ptr< Expression > copy() const
Definition expression.h:88
TARGET * ptrCast()
Definition expression.h:97
friend class ExpressionChildrenCollector
Definition expression.h:32
void setChild(common::idx_t idx, std::shared_ptr< Expression > child)
Definition expression.h:77
virtual ~Expression()=default
bool hasAlias() const
Definition expression.h:68
std::string getAlias() const
Definition expression.h:69
virtual std::string toStringInternal() const =0
common::idx_t getNumChildren() const
Definition expression.h:71
expression_vector getChildren() const
Definition expression.h:76
DELETE_COPY_DEFAULT_MOVE(Expression)
Expression(common::ExpressionType expressionType, common::LogicalType dataType, expression_vector children, std::string uniqueName)
Definition expression.h:35
void setUniqueName(const std::string &name)
Definition expression.h:58
virtual void cast(const common::LogicalType &type)
common::LogicalType dataType
Definition expression.h:114
std::string alias
Definition expression.h:119
TARGET & cast()
Definition expression.h:93
Expression(common::ExpressionType expressionType, common::LogicalType dataType, const std::shared_ptr< Expression > &left, const std::shared_ptr< Expression > &right, std::string uniqueName)
Definition expression.h:40
Expression(common::ExpressionType expressionType, common::LogicalType dataType, std::string uniqueName)
Definition expression.h:51
Expression(common::ExpressionType expressionType, common::LogicalType dataType, const std::shared_ptr< Expression > &child, std::string uniqueName)
Definition expression.h:46
Definition internal.h:9
Definition types.h:256
Definition bind_input.h:12
std::unordered_map< std::shared_ptr< Expression >, T, ExpressionHasher, ExpressionEquality > expression_map
Definition expression.h:28
std::unordered_set< std::shared_ptr< Expression >, ExpressionHasher, ExpressionEquality > expression_set
Definition expression.h:25
std::pair< std::shared_ptr< Expression >, std::shared_ptr< Expression > > expression_pair
Definition expression.h:21
std::vector< std::shared_ptr< Expression > > expression_vector
Definition expression.h:20
uint32_t idx_t
Definition types.h:45
ExpressionType
Definition expression_type.h:11
TO ku_dynamic_cast(FROM *old)
Definition cast.h:11
Definition array_utils.h:7
Definition expression.h:129
bool operator()(const std::shared_ptr< Expression > &left, const std::shared_ptr< Expression > &right) const
Definition expression.h:130
Definition expression.h:123
std::size_t operator()(const std::shared_ptr< Expression > &expression) const
Definition expression.h:124