Sql: SqlExp optimizations

git-svn-id: svn://ultimatepp.org/upp/trunk@4279 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2011-12-09 12:42:37 +00:00
parent 37437e39db
commit 2dbb209fd2
3 changed files with 34 additions and 21 deletions

View file

@ -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,

View file

@ -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) {

View file

@ -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<SqlVal> {