From 2dbb209fd2edf72814c44d26df845fbcab893c50 Mon Sep 17 00:00:00 2001 From: cxl Date: Fri, 9 Dec 2011 12:42:37 +0000 Subject: [PATCH] Sql: SqlExp optimizations git-svn-id: svn://ultimatepp.org/upp/trunk@4279 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/Sql/Sql.upp | 2 +- uppsrc/Sql/SqlVal.cpp | 44 +++++++++++++++++++++++++++---------------- uppsrc/Sql/Sqlexp.h | 9 +++++---- 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/uppsrc/Sql/Sql.upp b/uppsrc/Sql/Sql.upp index 7a3694203..6bade26a1 100644 --- a/uppsrc/Sql/Sql.upp +++ b/uppsrc/Sql/Sql.upp @@ -10,8 +10,8 @@ uses file Sql.h, - Sqlexp.h, SqlCase.cpp optimize_speed, + Sqlexp.h, SqlVal.cpp optimize_speed, SqlBool.cpp optimize_speed, SqlSet.cpp optimize_speed, diff --git a/uppsrc/Sql/SqlVal.cpp b/uppsrc/Sql/SqlVal.cpp index 04bad4cd1..afa6110bf 100644 --- a/uppsrc/Sql/SqlVal.cpp +++ b/uppsrc/Sql/SqlVal.cpp @@ -4,22 +4,22 @@ NAMESPACE_UPP SqlId SqlId::Of(const char *of) const { - return of + ('.' + ToString()); + return String().Cat() << of << '.' << ToString(); } SqlId SqlId::Of(SqlId id) const { - return id.IsNull() ? ToString() : id.ToString() + '.' + ToString(); + return id.IsNull() ? ToString() : String().Cat() << id.ToString() << '.' << ToString(); } SqlId SqlId::operator[](const SqlId& id) const { - return id.IsNull() ? ToString() : ToString() + '.' + id.ToString(); + return Of(id); } SqlId SqlId::As(const char *as) const { - return id.IsNull() ? ToString() : ToString() + SqlCase(MSSQL | PGSQL, " as ")(" ") + as; + return id.IsNull() ? ToString() : String().Cat() << ToString() << SqlCase(MSSQL | PGSQL, " as ")(" ") << as; } SqlId SqlId::operator()(SqlId p) { @@ -57,19 +57,31 @@ String SqlS::operator()(int at, byte cond) const return out; } -SqlS::SqlS(const SqlS& a, const char *o, const SqlS& b, int pr, int prb) { - text << a(pr) << o << b(prb); - priority = pr; -} - -SqlS::SqlS(const SqlS& a, const char *o, const SqlS& b, int pr) { - text << a(pr) << o << b(pr); +void SqlS::Init(const SqlS& a, const char *o, int olen, const SqlS& b, int pr, int prb) +{ + StringBuffer s; + if(a.priority < pr) { + s.Cat('('); + s.Cat(~a); + s.Cat(')'); + } + else + s.Cat(~a); + s.Cat(o, olen); + if(b.priority < prb) { + s.Cat('('); + s.Cat(~b); + s.Cat(')'); + } + else + s.Cat(~b); + text = s; priority = pr; } SqlVal SqlVal::As(const char *as) const { SqlVal v; - v.SetHigh(text + ~SqlCase(MSSQL | PGSQL, " as ")(" ") + as); + v.SetHigh(String().Cat() << text << ~SqlCase(MSSQL | PGSQL, " as ")(" ") << as); return v; } @@ -186,19 +198,19 @@ SqlVal& operator%=(SqlVal& a, const SqlVal& b) { return a = a % b; } SqlVal& operator|=(SqlVal& a, const SqlVal& b) { return a = a | b; } SqlVal SqlFunc(const char *name, const SqlVal& a) { - return SqlVal(name + a(), SqlS::FN); + return SqlVal(String().Cat() << name << '(' << ~a << ')', SqlS::FN); } SqlVal SqlFunc(const char *n, const SqlVal& a, const SqlVal& b) { - return SqlVal(String(n) + '(' + ~a + ", " + ~b + ')', SqlS::FN); + return SqlVal(String(n).Cat() << '(' + ~a << ", " << ~b << ')', SqlS::FN); } SqlVal SqlFunc(const char *n, const SqlVal& a, const SqlVal& b, const SqlVal& c) { - return SqlVal(String(n) + '(' + ~a + ", " + ~b + ", " + ~c + ')', SqlS::FN); + return SqlVal(String(n).Cat() << '(' << ~a << ", " << ~b << ", " << ~c << ')', SqlS::FN); } SqlVal SqlFunc(const char *n, const SqlVal& a, const SqlVal& b, const SqlVal& c, const SqlVal& d) { - return SqlVal(String(n) + '(' + ~a + ", " + ~b + ", " + ~c + ", " + ~d + ')', SqlS::FN); + return SqlVal(String(n).Cat() << '(' << ~a << ", " << ~b << ", " << ~c << ", " << ~d << ')', SqlS::FN); } SqlVal SqlFunc(const char *name, const SqlSet& set) { diff --git a/uppsrc/Sql/Sqlexp.h b/uppsrc/Sql/Sqlexp.h index e484ac3f9..f22beab4a 100644 --- a/uppsrc/Sql/Sqlexp.h +++ b/uppsrc/Sql/Sqlexp.h @@ -99,7 +99,7 @@ public: operator const Id&() const { return id; } const String& ToString() const { return id.ToString(); } - String operator~() const { return ToString(); } + const String& operator~() const { return ToString(); } SqlId Of(SqlId id) const; SqlId Of(const char *of) const; @@ -142,7 +142,7 @@ protected: String text; byte priority; - void Put(const SqlS& a, int pr); + void Init(const SqlS& a, const char *o, int olen, const SqlS& b, int pr, int prb); public: enum PRIORITY { @@ -172,8 +172,9 @@ public: SqlS() : priority(EMPTY) {} SqlS(const char *s, int pr) : text(s), priority(pr) {} SqlS(const String& s, int pr) : text(s), priority(pr) {} - SqlS(const SqlS& a, const char *op, const SqlS& b, int pr, int prb); - SqlS(const SqlS& a, const char *op, const SqlS& b, int pr); + + force_inline SqlS(const SqlS& a, const char *op, const SqlS& b, int pr, int prb) { Init(a, op, strlen(op), b, pr, prb); } + force_inline SqlS(const SqlS& a, const char *op, const SqlS& b, int pr) { Init(a, op, strlen(op), b, pr, pr); } }; class SqlVal : public SqlS, Moveable {