relx 0.1.0
A Modern C++23 Type-Safe SQL Query Builder
Loading...
Searching...
No Matches
column_expression.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "core.hpp"
4
5#include <iostream>
6#include <memory>
7#include <optional>
8#include <sstream>
9#include <string>
10#include <vector>
11
12namespace relx::query {
13
14// Forward declarations
15class CaseExpr;
16
19public:
20 virtual ~ColumnExpression() = default;
21 virtual std::string column_name() const = 0;
22 virtual std::string table_name() const = 0;
23 virtual std::string qualified_name() const {
24 std::string qualified = column_name();
25 auto table = table_name();
26 if (!table.empty()) {
27 qualified = table + "." + qualified;
28 }
29 return qualified;
30 }
31};
32
35template <ColumnType Column>
37public:
38 using column_type = Column;
39 using value_type = typename Column::value_type;
40
41 explicit ColumnRef(const Column& col) : col_(col) {}
42
43 std::string to_sql() const override { return qualified_name(); }
44
45 std::vector<std::string> bind_params() const override { return {}; }
46
47 std::string column_name() const override { return std::string(Column::name); }
48
49 std::string table_name() const override {
50 // Get the table name from the parent table class
51 using parent_table = typename Column::table_type;
52 return std::string(parent_table::table_name);
53 }
54
55 const Column& column() const { return col_; }
56
57private:
58 const Column& col_;
59};
60
65template <ColumnType Column>
66auto column_ref(const Column& col) {
67 return ColumnRef<Column>(col);
68}
69
72template <SqlExpr Expr>
74public:
75 AliasedColumn(const Expr& expr, std::string alias)
76 : expr_(std::make_shared<Expr>(expr)), alias_(std::move(alias)) {}
77
78 AliasedColumn(Expr&& expr, std::string alias)
79 : expr_(std::make_shared<Expr>(std::move(expr))), alias_(std::move(alias)) {}
80
81 // Special constructor for non-copyable types
82 AliasedColumn(std::shared_ptr<Expr> expr, std::string alias)
83 : expr_(std::move(expr)), alias_(std::move(alias)) {}
84
85 std::string to_sql() const override { return expr_->to_sql() + " AS " + alias_; }
86
87 std::vector<std::string> bind_params() const override { return expr_->bind_params(); }
88
89 std::string column_name() const override { return alias_; }
90
91 std::string table_name() const override { return ""; }
92
93private:
94 std::shared_ptr<Expr> expr_;
95 std::string alias_;
96};
97
103template <SqlExpr Expr>
104auto as(const Expr& expr, std::string alias) {
105 return AliasedColumn<Expr>(expr, std::move(alias));
106}
107
113template <ColumnType Column>
114auto as(const Column& column, std::string alias) {
115 return AliasedColumn<ColumnRef<Column>>(column_ref(column), std::move(alias));
116}
117
118} // namespace relx::query
std::string column_name() const override
std::string table_name() const override
AliasedColumn(Expr &&expr, std::string alias)
std::vector< std::string > bind_params() const override
AliasedColumn(std::shared_ptr< Expr > expr, std::string alias)
std::string to_sql() const override
AliasedColumn(const Expr &expr, std::string alias)
Base class for column expressions.
virtual std::string qualified_name() const
virtual ~ColumnExpression()=default
virtual std::string column_name() const =0
virtual std::string table_name() const =0
Column reference expression.
typename Column::value_type value_type
const Column & column() const
std::string to_sql() const override
std::vector< std::string > bind_params() const override
std::string column_name() const override
ColumnRef(const Column &col)
std::string table_name() const override
Represents a column in a database table.
Definition column.hpp:217
auto column_ref(const Column &col)
Create a column reference expression.
auto as(const Expr &expr, std::string alias)
Create an aliased column expression.
STL namespace.
Base class for SQL expressions.
Definition core.hpp:61