ネタ元 → Where句の自動生成
昔むかしのかすかな記憶を頼りに書いてみよかね。
演算子の多重定義が得意なC++で遊ぶなり。
※ 鵜呑みにすんな、穴だらけだぞ!
#include <string>
namespace DB {
// 式
class Exp {
public:
virtual std::string phrase() const = 0;
virtual ~Exp() {}
};
// 二項演算
class BinaryOp : public Exp {
private:
std::string mnemonic_;
Exp* lhs_;
Exp* rhs_;
public:
BinaryOp(const std::string& m, Exp* lhs, Exp* rhs) : mnemonic_(m), lhs_(lhs), rhs_(rhs) {}
virtual std::string phrase() const
{ return lhs_->phrase() + ' ' + mnemonic_ + ' ' + rhs_->phrase(); }
};
// 演算子をいくつか用意
BinaryOp operator&&(Exp& lhs, Exp& rhs) { return BinaryOp("AND", &lhs, &rhs); }
BinaryOp operator||(Exp& lhs, Exp& rhs) { return BinaryOp(" OR ", &lhs, &rhs); }
BinaryOp operator==(Exp& lhs, Exp& rhs) { return BinaryOp("=", &lhs, &rhs); }
BinaryOp operator!=(Exp& lhs, Exp& rhs) { return BinaryOp("<>", &lhs, &rhs); }
// ストリームにしつりょくぅ
std::ostream& operator<<(std::ostream& stream, const Exp& exp)
{ return stream << exp.phrase(); }
// 文字列定数
class Str : public Exp {
private:
std::string value_;
public:
Str(const std::string& value) : value_(value) {}
virtual std::string phrase() const { return '\"' + value_ + '\"'; }
};
// DB-カラム
class Column : public Exp {
private:
std::string name_;
public:
Column(const std::string& name) : name_(name) {}
virtual std::string phrase() const { return name_; }
};
// DB-テーブル
class Table {
private:
std::string name_;
public:
Table(const std::string& name) : name_(name) {}
std::string name() const { return name_; }
Column operator[](const std::string& c) const {
return Column(name_+'.'+c);
}
};
}
/* おためしだよーん */
#include <iostream>
int main() {
DB::Table phone("phonebook");
DB::Table address("addressbook");
// 電話帳にある名前とアドレス帳にある名前が一致し、"えぴ"ではない。
std::cout << (phone["name"] == address["name"] && phone["name"] != DB::Str("えぴ"));
}
これ実行すると
phonebook.name = addressbook.name AND phonebook.name <> "えぴ"
って出力されるますよ♪