Revision: 1820
http://zoolib.svn.sourceforge.net/zoolib/?rev=1820&view=rev
Author: agreen
Date: 2010-12-27 04:07:15 +0000 (Mon, 27 Dec 2010)
Log Message:
-----------
Source_Union, Source_SQLite and associated changes.
Modified Paths:
--------------
trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspaceTest.cpp
trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_Dataset.cpp
trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_Dataset.h
trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_SQLite.cpp
trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_SQLite.h
trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_Union.cpp
trunk/zoolib/source/cxx/more/zoolib/zqe/ZQE_Search.cpp
trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_Expr_Rel_Concrete.cpp
trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_Expr_Rel_Concrete.h
trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_RelHead.cpp
trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_RelHead.h
trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_RelName.h
trunk/zoolib/source/cxx/zoolib/ZValPred_T.h
Added Paths:
-----------
trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_AsSQL.cpp
trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_AsSQL.h
trunk/zoolib/source/cxx/zoolib/ZValPred_Rename_T.h
Removed Paths:
-------------
trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_SQL.cpp
trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_SQL.h
Modified: trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspaceTest.cpp
===================================================================
--- trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspaceTest.cpp 2010-12-27 04:06:25 UTC (rev 1819)
+++ trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspaceTest.cpp 2010-12-27 04:07:15 UTC (rev 1820)
@@ -1,6 +1,7 @@
#include "zoolib/dataspace/ZDataspace_Dataspace.h"
#include "zoolib/dataspace/ZDataspace_Source_Dataset.h"
+#include "zoolib/dataspace/ZDataspace_Source_SQLite.h"
#include "zoolib/dataspace/ZDataspace_Source_Union.h"
#include "zoolib/dataspace/ZDataspace_Util_Strim.h"
@@ -22,6 +23,9 @@
#include "zoolib/zra/ZRA_Util_Strim_RelHead.h"
+#include "zoolib/zqe/ZQE_Walker_Result.h"
+#include "zoolib/zqe/ZQE_Search.h"
+
using namespace ZooLib;
using namespace ZRA;
using namespace ZDataspace;
@@ -88,10 +92,27 @@
void spCallback(ZRef<Sieve> iSieve, bool)
{
+ ZRef<ZQE::Walker> theWalker = new ZQE::Walker_Result(iSieve->GetResult());
+ ZQE::sSearch(theWalker);
}
void sDataspaceTest(const ZStrimW& w)
{
+ ZRef<ZSQLite::DB> theDB = new ZSQLite::DB("/Users/ag/MedMan2.db");
+ ZRef<Source_SQLite> theSource_SQLite = new Source_SQLite(theDB);
+ Dataspace theDataspace(theSource_SQLite);
+
+ ZRef<Sieve_Callable::Callable> theCallable = MakeCallable(spCallback);
+ ZRef<Sieve> theSieve = new Sieve_Callable(theCallable);
+ ZRef<ZRA::Expr_Rel> theRel = sRel_People() * sRel_pscripts();
+ theRel &= CName("pscript_person_id") == CName("person_id");
+ theRel &= sRelHead_person();
+ theDataspace.Register(theSieve, theRel);
+ theDataspace.Update();
+ }
+
+void sDataspaceTest2(const ZStrimW& w)
+ {
ZRef<Source_Union> theSource_Union = new Source_Union;
Nombre theNombre;
Modified: trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_Dataset.cpp
===================================================================
--- trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_Dataset.cpp 2010-12-27 04:06:25 UTC (rev 1819)
+++ trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_Dataset.cpp 2010-12-27 04:07:15 UTC (rev 1820)
@@ -49,8 +49,6 @@
using std::set;
using std::vector;
-enum { kDebug = 1 };
-
/*
Minimally, keep an index of property names in contents -- that way we can efficiently
identify those entities that satisfy a RelHead.
@@ -181,9 +179,9 @@
// =================================================================================================
#pragma mark -
-#pragma mark * Source_Dataset::PQuery
+#pragma mark * Source_Dataset::PSearch
-class Source_Dataset::PQuery
+class Source_Dataset::PSearch
{
public:
int64 fRefcon;
@@ -218,17 +216,17 @@
while (iAddedCount--)
{
- PQuery* thePQuery = new PQuery;
- thePQuery->fRefcon = iAdded->GetRefcon();
- thePQuery->fRel = iAdded->GetRel();
+ PSearch* thePSearch = new PSearch;
+ thePSearch->fRefcon = iAdded->GetRefcon();
+ thePSearch->fRel = iAdded->GetRel();
ZUtil_STL::sInsertMustNotContain(kDebug,
- fMap_RefconToPQuery, thePQuery->fRefcon, thePQuery);
+ fMap_RefconToPSearch, thePSearch->fRefcon, thePSearch);
++iAdded;
}
while (iRemovedCount--)
- delete ZUtil_STL::sEraseAndReturn(kDebug, fMap_RefconToPQuery, *iRemoved++);
+ delete ZUtil_STL::sEraseAndReturn(kDebug, fMap_RefconToPSearch, *iRemoved++);
}
void Source_Dataset::CollectResults(vector<SearchResult>& oChanged)
@@ -244,13 +242,13 @@
if (anyChanges)
{
- for (map<int64, PQuery*>::iterator iter_RefconToPQuery = fMap_RefconToPQuery.begin();
- iter_RefconToPQuery != fMap_RefconToPQuery.end(); ++iter_RefconToPQuery)
+ for (map<int64, PSearch*>::iterator iter_RefconToPSearch = fMap_RefconToPSearch.begin();
+ iter_RefconToPSearch != fMap_RefconToPSearch.end(); ++iter_RefconToPSearch)
{
ZRef<ZQE::Walker> theWalker =
- Visitor_DoMakeWalker(this).Do(iter_RefconToPQuery->second->fRel);
+ Visitor_DoMakeWalker(this).Do(iter_RefconToPSearch->second->fRel);
- SearchResult theSearchResult(iter_RefconToPQuery->first, sSearch(theWalker), fEvent);
+ SearchResult theSearchResult(iter_RefconToPSearch->first, sSearch(theWalker), fEvent);
oChanged.push_back(theSearchResult);
}
@@ -432,16 +430,15 @@
iterStmts != endStmts; ++iterStmts)
{
const Daton& theDaton = iterStmts->first;
- const pair<NamedEvent, ZVal_Any> newPair(theNamedEvent, sAsVal(theDaton));
-
map<Daton, pair<NamedEvent, ZVal_Any> >::iterator iterMap = fMap.lower_bound(theDaton);
-
if (iterMap == fMap.end() || iterMap->first != theDaton)
{
if (iterStmts->second)
{
anyChanges = true;
- fMap.insert(iterMap, make_pair(theDaton, newPair));
+ fMap.insert(iterMap,
+ make_pair(theDaton,
+ pair<NamedEvent, ZVal_Any>(theNamedEvent, sAsVal(theDaton))));
}
}
else if (iterMap->second.first < theNamedEvent)
@@ -450,7 +447,7 @@
anyChanges = true;
if (iterStmts->second)
- iterMap->second = newPair;
+ iterMap->second = pair<NamedEvent, ZVal_Any>(theNamedEvent, sAsVal(theDaton));
else
fMap.erase(iterMap);
}
Modified: trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_Dataset.h
===================================================================
--- trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_Dataset.h 2010-12-27 04:06:25 UTC (rev 1819)
+++ trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_Dataset.h 2010-12-27 04:07:15 UTC (rev 1820)
@@ -62,6 +62,8 @@
class Source_Dataset : public Source
{
public:
+ enum { kDebug = 1 };
+
// Some kind of index specs to be passed in too.
Source_Dataset(ZRef<ZDataset::Dataset> iDataset);
virtual ~Source_Dataset();
@@ -122,9 +124,9 @@
std::vector<Map_Pending> fStack;
bool fStackChanged;
- class PQuery;
- // We could have the PQuery be an in-place value in the map.
- std::map<int64, PQuery*> fMap_RefconToPQuery;
+ class PSearch;
+ // We could have the PSearch be an in-place value in the map.
+ std::map<int64, PSearch*> fMap_RefconToPSearch;
};
} // namespace ZDataspace
Modified: trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_SQLite.cpp
===================================================================
--- trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_SQLite.cpp 2010-12-27 04:06:25 UTC (rev 1819)
+++ trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_SQLite.cpp 2010-12-27 04:07:15 UTC (rev 1820)
@@ -18,21 +18,22 @@
OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
------------------------------------------------------------------------------------------------- */
+#include "zoolib/ZCallable_PMF.h"
+#include "zoolib/ZLog.h"
#include "zoolib/ZString.h"
#include "zoolib/ZUtil_STL.h"
#include "zoolib/ZUtil_STL_set.h"
+#include "zoolib/ZWorker_Callable.h"
+#include "zoolib/ZWorkerRunner_CFRunLoop.h"
+
#include "zoolib/dataspace/ZDataspace_Source_SQLite.h"
#include "zoolib/dataspace/ZDataspace_Util_Strim.h"
-#include "zoolib/zra/ZRA_SQL.h"
+#include "zoolib/zra/ZRA_AsSQL.h"
+#include "zoolib/zra/ZRA_GetRelHead.h"
#include "zoolib/zra/ZRA_Util_Strim_RelHead.h"
-#include "zoolib/ZLog.h"
-#include "zoolib/ZCallable_PMF.h"
-#include "zoolib/ZWorker_Callable.h"
-#include "zoolib/ZWorkerRunner_CFRunLoop.h"
-
namespace ZooLib {
namespace ZDataspace {
@@ -42,14 +43,13 @@
using namespace ZSQLite;
-using ZRA::NameMap;
using ZRA::RelName;
-const ZStrimW& operator<<(const ZStrimW& w, const Rename_t& iRename)
+const ZStrimW& operator<<(const ZStrimW& w, const ZRA::Rename& iRename)
{
w << "(";
bool isSubsequent = false;
- for (Rename_t::const_iterator i = iRename.begin(); i != iRename.end(); ++i)
+ for (ZRA::Rename::const_iterator i = iRename.begin(); i != iRename.end(); ++i)
{
if (isSubsequent)
w << ", ";
@@ -62,19 +62,25 @@
// =================================================================================================
#pragma mark -
-#pragma mark * Source_SQLite::PQuery
+#pragma mark * Source_SQLite::PSearch
-class Source_SQLite::PQuery
+class Source_SQLite::PSearch
{
public:
- PQuery(int64 iRefcon, const string8& iSQL);
+ PSearch(int64 iRefcon,
+ const ZRef<ZRA::Expr_Rel>& iRel, const RelHead& iRelHead, const string8& iSQL);
const int64 fRefcon;
+ const ZRef<ZRA::Expr_Rel> fRel;
+ const RelHead fRelHead;
const string8 fSQL;
};
-Source_SQLite::PQuery::PQuery(int64 iRefcon, const string8& iSQL)
+Source_SQLite::PSearch::PSearch(int64 iRefcon,
+ const ZRef<ZRA::Expr_Rel>& iRel, const RelHead& iRelHead, const string8& iSQL)
: fRefcon(iRefcon)
+, fRel(iRel)
+, fRelHead(iRelHead)
, fSQL(iSQL)
{}
@@ -96,180 +102,96 @@
for (ZRef<Iter> iterTable = new Iter(fDB, "pragma table_info(" + theTableName + ");");
iterTable->HasValue(); iterTable->Advance())
{
- theRelHead.Insert(theTableName + "_" + iterTable->Get(1).Get<string8>());
+ theRelHead |= iterTable->Get(1).Get<string8>();
}
- theRelHead.Insert(theTableName + "_oid");
+ theRelHead |= "oid";
if (!theRelHead.empty())
- ZUtil_STL::sInsertMustNotContain(kDebug, fMap_NameToRelHead, theTableName, theRelHead);
+ ZUtil_STL::sInsertMustNotContain(kDebug, fMap_Tables, theTableName, theRelHead);
}
- ZRef<ZWorker> theWorker = MakeWorker(MakeCallable(this, &Source_SQLite::pCheck));
- ZWorkerRunner_CFRunLoop::sMain()->Attach(theWorker);
- theWorker->Wake();
+// ZRef<ZWorker> theWorker = MakeWorker(MakeCallable(this, &Source_SQLite::pCheck));
+// ZWorkerRunner_CFRunLoop::sMain()->Attach(theWorker);
+// theWorker->Wake();
}
Source_SQLite::~Source_SQLite()
{}
-set<RelHead> Source_SQLite::GetRelHeads()
+RelHead Source_SQLite::GetRelHead()
{
- set<RelHead> result;
- for (map<string8, RelHead>::const_iterator i = fMap_NameToRelHead.begin();
- i != fMap_NameToRelHead.end(); ++i)
+ RelHead result;
+ for (map<string8, RelHead>::const_iterator iterTables = fMap_Tables.begin();
+ iterTables != fMap_Tables.end(); ++iterTables)
{
- result.insert(i->second);
+ const string8& tableName = iterTables->first;
+ const RelHead& theRH = iterTables->second;
+ for (RelHead::const_iterator iterRH = theRH.begin(); iterRH != theRH.end(); ++iterRH)
+ result |= tableName + "_" + *iterRH;
}
return result;
}
-void Source_SQLite::Update(
- bool iLocalOnly,
+void Source_SQLite::ModifyRegistrations(
const AddedSearch* iAdded, size_t iAddedCount,
- const int64* iRemoved, size_t iRemovedCount,
- vector<SearchResult>& oChanged,
- ZRef<Event>& oEvent)
+ const int64* iRemoved, size_t iRemovedCount)
{
- oChanged.clear();
-
- while (iRemovedCount--)
+ if (iAddedCount || iRemovedCount)
{
- PQuery* thePQuery = ZUtil_STL::sEraseAndReturn(kDebug, fMap_RefconToPQuery, *iRemoved++);
- delete thePQuery;
+// fStackChanged = true;
+ this->pInvokeCallable_ResultsAvailable();
}
while (iAddedCount--)
{
- if (ZLOGF(s, eDebug))
- s << "\n" << iAdded->fSearchSpec;
-
- const string8 theSQL = this->pAsSQL(iAdded->fSearchSpec);
- PQuery* thePQuery = new PQuery(iAdded->fRefcon, theSQL);
- ZUtil_STL::sInsertMustNotContain(kDebug,
- fMap_RefconToPQuery, thePQuery->fRefcon, thePQuery);
+ ZRef<ZRA::Expr_Rel> theRel = iAdded->GetRel();
+ string8 asSQL;
+ if (ZRA::sWriteAsSQL(fMap_Tables, theRel, ZStrimW_String(asSQL)))
+ {
+ if (ZLOGF(s, eDebug))
+ s << asSQL;
+ PSearch* thePSearch =
+ new PSearch(iAdded->GetRefcon(), theRel, sGetRelHead(theRel), asSQL);
+ ZUtil_STL::sInsertMustNotContain(kDebug,
+ fMap_RefconToPSearch, thePSearch->fRefcon, thePSearch);
+ }
+
++iAdded;
}
- // For now, just regenerate everything every time. Later we'll only generate
- // newly added queries, or everything if the sqlite change count increments.
- for (map<int64, PQuery*>::iterator i = fMap_RefconToPQuery.begin();
- i != fMap_RefconToPQuery.end(); ++i)
+ while (iRemovedCount--)
{
- PQuery* thePQuery = i->second;
-
- ZRef<Iter> theIter = new Iter(fDB, thePQuery->fSQL);
- vector<string8> theRowHead;
- const size_t theCount = theIter->Count();
- for (size_t x = 0; x < theCount; ++x)
- theRowHead.push_back(theIter->NameOf(x));
-
- vector<ZRef<ZQE::Row> > theRows;
- for (/*no init*/;theIter->HasValue(); theIter->Advance())
+ if (ZQ<PSearch*> thePSearch =
+ ZUtil_STL::sEraseAndReturnIfContains(fMap_RefconToPSearch, *iRemoved++))
{
- vector<ZVal_Any> theVals;
- theVals.reserve(theCount);
- for (size_t x = 0; x < theCount; ++x)
- theVals.push_back(theIter->Get(x));
- ZRef<ZQE::Row> theRow = new ZQE::Row_Vector(&theVals);
- theRows.push_back(theRow);
+ delete thePSearch.Get();
}
-
- ZRef<ZQE::RowVector> theRowVector = new ZQE::RowVector(&theRows);
- ZRef<SearchRows> theSearchRows = new SearchRows(&theRowHead, theRowVector);
-
- SearchResult theSearchResult;
- theSearchResult.fRefcon = thePQuery->fRefcon;
- theSearchResult.fSearchRows = theSearchRows;
-
- oChanged.push_back(theSearchResult);
+// delete ZUtil_STL::sEraseAndReturn(kDebug, fMap_RefconToPSearch, *iRemoved++);
}
-
- sEvent(fClock);
-
- oEvent = fClock->GetEvent();
}
-bool Source_SQLite::pCheck(ZRef<ZWorker> iWorker)
+void Source_SQLite::CollectResults(std::vector<SearchResult>& oChanged)
{
- this->pInvokeCallable();
- iWorker->WakeIn(10);
- return true;
- }
+ oChanged.clear();
-string8 Source_SQLite::pAsSQL(const SearchSpec& iSearchSpec)
- {
- // Go through each NameMap. Use the from to identify which table it represents. Generate
- // a distinct name for the table, for use in an AS clause. Rewrite the from to reference
- // the distinct name.
-
- // We can then generate an SFW formed from the reworked NameMaps and the ValPredCompound, which
- // is written in terms of the Tos.
-
- // We should rewrite the ValPredCompound and the AS clauses using unqiue
- // names ("zoolib_unique_1",...) so we don't get bitten by SQL's case-insentivity
- // and clashes with column names.
- // We'll live with it for now.
-
- map<string8, int> theTableSuffixes;
- map<string8, string8> theRename;
- string8 theFields;
- for (vector<NameMap>::const_iterator i = iSearchSpec.fNameMaps.begin();
- i != iSearchSpec.fNameMaps.end(); ++i)
+ for (map<int64, PSearch*>::iterator iter_RefconToPSearch = fMap_RefconToPSearch.begin();
+ iter_RefconToPSearch != fMap_RefconToPSearch.end(); ++iter_RefconToPSearch)
{
- const NameMap& sourceNameMap = *i;
- const RelHead& theRH_From = sourceNameMap.GetRelHead_From();
- if (ZLOGF(s, eDebug))
- s << theRH_From;
-
- for (map<string8, RelHead>::const_iterator i = fMap_NameToRelHead.begin();
- i != fMap_NameToRelHead.end(); ++i)
+ vector<ZVal_Any> thePackedRows;
+ PSearch* thePSearch = iter_RefconToPSearch->second;
+ for (ZRef<Iter> theIter = new Iter(fDB, thePSearch->fSQL);
+ theIter->HasValue(); theIter->Advance())
{
- if (ZUtil_STL_set::sIncludes(i->second, theRH_From))
- {
- // Found a table.
- const RelName theTableName = i->first;
- const int theSuffix = theTableSuffixes[theTableName]++;
- const RelName newPrefix = theTableName + ZStringf("%d", theSuffix) + ".";
- const RelName oldPrefix = theTableName + "_";
-
- for (set<NameMap::Elem_t>::const_iterator i = sourceNameMap.GetElems().begin();
- i != sourceNameMap.GetElems().end(); ++i)
- {
- const RelName oldFrom = i->second;
- RelName newFrom = ZRA::sPrefixRemove(theTableName + "_", oldFrom);
- newFrom = ZRA::sPrefixAdd(newPrefix, newFrom);
- if (! theFields.empty())
- theFields += ", ";
- theFields += newFrom + " AS '" + i->first + "'";
- ZUtil_STL::sInsertMustNotContain(1, theRename, i->first, newFrom);
- }
- }
+ const size_t theCount = theIter->Count();
+ for (size_t x = 0; x < theCount; ++x)
+ thePackedRows.push_back(theIter->Get(x));
}
- }
- string8 theTables;
- for (map<string8, int>::const_iterator i = theTableSuffixes.begin();
- i != theTableSuffixes.end(); ++i)
- {
- for (int x = 0; x < i->second; ++x)
- {
- if (! theTables.empty())
- theTables += ", ";
- theTables += i->first + " AS '" + i->first + ZStringf("%d", x) + "'";
- }
+ ZRef<ZQE::Result> theResult =
+ new ZQE::Result(thePSearch->fRelHead, &thePackedRows, nullptr);
+ SearchResult theSearchResult(thePSearch->fRefcon, theResult, null);
+ oChanged.push_back(theSearchResult);
}
-
- string8 result = "SELECT " + theFields + " FROM " + theTables + " WHERE ";
-
- if (ZLOGF(s, eDebug))
- s << theRename;
-
- result += ZRA::SQL::sAsSQL(sAsExpr_Bool(iSearchSpec.fPredCompound.Renamed(theRename)));
-
- if (ZLOGF(s, eDebug))
- s << result;
-
- return result;
}
} // namespace ZDataspace
Modified: trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_SQLite.h
===================================================================
--- trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_SQLite.h 2010-12-27 04:06:25 UTC (rev 1819)
+++ trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_SQLite.h 2010-12-27 04:07:15 UTC (rev 1820)
@@ -54,15 +54,13 @@
private:
bool pCheck(ZRef<ZWorker> iWorker);
-// string8 pAsSQL(const SearchSpec& iSearchSpec);
-
ZRef<ZSQLite::DB> fDB;
int64 fChangeCount;
ZRef<Clock> fClock;
- class PQuery;
- std::map<int64, PQuery*> fMap_RefconToPQuery;
- std::map<string8, RelHead> fMap_NameToRelHead;
+ class PSearch;
+ std::map<int64, PSearch*> fMap_RefconToPSearch;
+ std::map<string8, RelHead> fMap_Tables;
};
} // namespace ZDataspace
Modified: trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_Union.cpp
===================================================================
--- trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_Union.cpp 2010-12-27 04:06:25 UTC (rev 1819)
+++ trunk/zoolib/source/cxx/more/zoolib/dataspace/ZDataspace_Source_Union.cpp 2010-12-27 04:07:15 UTC (rev 1820)
@@ -52,42 +52,6 @@
#pragma mark * Helpers (anonymous)
namespace { // anonymous
-
-set<string8> spRename(const map<string8,string8>& iRename, const set<string8>& iSet)
- {
- if (iRename.empty())
- return iSet;
-
- set<string8> result;
- for (set<string8>::const_iterator i = iSet.begin(); i != iSet.end(); ++i)
- {
- map<string8,string8>::const_iterator iter = iRename.find(*i);
- if (iRename.end() == iter)
- result.insert(*i);
- else
- result.insert(iter->second);
- }
- return result;
- }
-
-RelHead spPrefix(const string8& iPrefix, const RelHead& iRelHead)
- {
- if (iPrefix.empty())
- return iRelHead;
- RelHead result;
- for (RelHead::const_iterator i = iRelHead.begin(); i != iRelHead.end(); ++i)
- result |= iPrefix + *i;
- return result;
- }
-
-set<RelHead> spPrefix(const string8& iPrefix, const set<RelHead>& iRelHeads)
- {
- set<RelHead> result;
- for (set<RelHead>::const_iterator i = iRelHeads.begin(); i != iRelHeads.end(); ++i)
- result.insert(spPrefix(iPrefix, *i));
- return result;
- }
-
} // anonymous namespace
// =================================================================================================
@@ -258,7 +222,7 @@
// =================================================================================================
#pragma mark -
-#pragma mark * Visitor_DoMakeWalker
+#pragma mark * Source_Union::Visitor_DoMakeWalker
class Source_Union::Visitor_DoMakeWalker
: public virtual ZQE::Visitor_DoMakeWalker
@@ -289,6 +253,9 @@
class Source_Union::Analyze
: public virtual ZVisitor_Expr_Op_DoTransform_T<ZRA::Expr_Rel>
+, public virtual ZRA::Visitor_Expr_Rel_Embed
+, public virtual ZRA::Visitor_Expr_Rel_Calc
+, public virtual ZRA::Visitor_Expr_Rel_Const
, public virtual ZRA::Visitor_Expr_Rel_Project
, public virtual ZRA::Visitor_Expr_Rel_Rename
, public virtual ZRA::Visitor_Expr_Rel_Restrict_Any
@@ -303,6 +270,10 @@
virtual void Visit_Expr_Op2(ZRef<ZExpr_Op2_T<ZRA::Expr_Rel> > iExpr);
// From ZRA::Visitor_Expr_Rel_XXX
+ virtual void Visit_Expr_Rel_Embed(ZRef<ZRA::Expr_Rel_Embed> iExpr);
+
+ virtual void Visit_Expr_Rel_Calc(ZRef<ZRA::Expr_Rel_Calc> iExpr);
+ virtual void Visit_Expr_Rel_Const(ZRef<ZRA::Expr_Rel_Const> iExpr);
virtual void Visit_Expr_Rel_Project(ZRef<ZRA::Expr_Rel_Project> iExpr);
virtual void Visit_Expr_Rel_Rename(ZRef<ZRA::Expr_Rel_Rename> iExpr);
virtual void Visit_Expr_Rel_Restrict(ZRef<ZRA::Expr_Rel_Restrict_Any> iExpr);
@@ -314,7 +285,7 @@
Source_Union* fSource_Union;
PSearch* fPSearch;
- map<string8,string8> fRename;
+ ZRA::Rename fRename;
ZRA::RelHead fRelHead;
};
@@ -398,11 +369,29 @@
}
}
+void Source_Union::Analyze::Visit_Expr_Rel_Embed(ZRef<ZRA::Expr_Rel_Embed> iExpr)
+ {
+ ZRA::Visitor_Expr_Rel_Embed::Visit_Expr_Rel_Embed(iExpr);
+ fRelHead |= iExpr->GetRelName();
+ }
+
+void Source_Union::Analyze::Visit_Expr_Rel_Calc(ZRef<ZRA::Expr_Rel_Calc> iExpr)
+ {
+ ZRA::Visitor_Expr_Rel_Calc::Visit_Expr_Rel_Calc(iExpr);
+ fRelHead |= iExpr->GetRelName();
+ }
+
+void Source_Union::Analyze::Visit_Expr_Rel_Const(ZRef<ZRA::Expr_Rel_Const> iExpr)
+ {
+ ZRA::Visitor_Expr_Rel_Const::Visit_Expr_Rel_Const(iExpr);
+ fRelHead |= iExpr->GetRelName();
+ }
+
void Source_Union::Analyze::Visit_Expr_Rel_Project(ZRef<ZRA::Expr_Rel_Project> iExpr)
{
ZRA::Visitor_Expr_Rel_Project::Visit_Expr_Rel_Project(iExpr);
- fRelHead &= spRename(fRename, iExpr->GetProjectRelHead());
+ fRelHead &= ZRA::sRenamed(fRename, iExpr->GetProjectRelHead());
}
void Source_Union::Analyze::Visit_Expr_Rel_Rename(ZRef<ZRA::Expr_Rel_Rename> iExpr)
@@ -421,14 +410,14 @@
{
ZRA::Visitor_Expr_Rel_Restrict_Any::Visit_Expr_Rel_Restrict(iExpr);
- fRelHead |= spRename(fRename, iExpr->GetValPred().GetNames());
+ fRelHead |= ZRA::sRenamed(fRename, iExpr->GetValPred().GetNames());
}
void Source_Union::Analyze::Visit_Expr_Rel_Select(ZRef<ZRA::Expr_Rel_Select> iExpr)
{
ZRA::Visitor_Expr_Rel_Select::Visit_Expr_Rel_Select(iExpr);
- fRelHead |= spRename(fRename, sGetNames(iExpr->GetExpr_Bool()));
+ fRelHead |= ZRA::sRenamed(fRename, sGetNames(iExpr->GetExpr_Bool()));
}
void Source_Union::Analyze::Visit_Expr_Rel_Concrete(ZRef<ZRA::Expr_Rel_Concrete> iExpr)
@@ -469,7 +458,7 @@
// From ZRA::Visitor_Expr_Rel_Concrete
virtual void Visit_Expr_Rel_Concrete(ZRef<ZRA::Expr_Rel_Concrete> iExpr);
- string8 fPrefix;
+ const string8 fPrefix;
};
InsertPrefix::InsertPrefix(const string8& iPrefix)
@@ -480,25 +469,10 @@
{
const RelHead& theRelHead = iExpr->GetConcreteRelHead();
- const size_t prefixLength = fPrefix.length();
- RelHead newRelHead;
- for (RelHead::const_iterator i = theRelHead.begin(); i != theRelHead.end(); ++i)
- {
- const string8& oldName = *i;
- if (oldName.substr(0, prefixLength) == fPrefix)
- {
- newRelHead |= oldName.substr(prefixLength);
- }
- else
- {
- ZUnimplemented();
- newRelHead |= oldName;
- }
- }
-
+ const RelHead newRelHead = ZRA::sPrefixErase(fPrefix, theRelHead);
ZRef<ZRA::Expr_Rel> theRel = ZRA::sConcrete(newRelHead);
for (RelHead::const_iterator i = newRelHead.begin(); i != newRelHead.end(); ++i)
- theRel = sRename(theRel, fPrefix + *i, *i);
+ theRel = sRename(theRel, ZRA::sPrefixInsert(fPrefix, *i), *i);
this->pSetResult(theRel);
}
@@ -675,6 +649,7 @@
ZUtil_STL::sInsertMustNotContain(kDebug, fMap_RefconToPSearch, theRefcon, thePSearch);
thePSearch->fRel_Analyzed = Analyze(this, thePSearch).TopLevelDo(thePSearch->fRel);
+ fPSearchesThatNeedWork.insert(thePSearch);//??
if (ZLOGF(s, eDebug))
{
@@ -684,6 +659,7 @@
ZRA::Util_Strim_Rel::sToStrim(thePSearch->fRel_Analyzed, s);
}
}
+ this->pInvokeCallable_ResultsAvailable();
}
void Source_Union::CollectResults(vector<SearchResult>& oChanged)
@@ -709,6 +685,7 @@
delete thePIP;
}
theProxy->fProxyInPSources.clear();
+ ZUtil_STL::sEraseMustContain(kDebug, fProxies, theProxy);
}
else
{
@@ -834,7 +811,6 @@
ZUtil_STL::sInsertMustNotContain(kDebug, fPSources_ToRemove, thePSource);
}
-
ZRef<ZQE::Walker> Source_Union::pMakeWalker(ZRef<Proxy> iProxy)
{ return new Walker_Proxy(this, iProxy); }
Modified: trunk/zoolib/source/cxx/more/zoolib/zqe/ZQE_Search.cpp
===================================================================
--- trunk/zoolib/source/cxx/more/zoolib/zqe/ZQE_Search.cpp 2010-12-27 04:06:25 UTC (rev 1819)
+++ trunk/zoolib/source/cxx/more/zoolib/zqe/ZQE_Search.cpp 2010-12-27 04:07:15 UTC (rev 1820)
@@ -41,12 +41,8 @@
size_t baseOffset = 0;
iWalker->Prime(map<string8,size_t>(), offsets, baseOffset);
- RelHead theRelHead;
- for (map<string8,size_t>::iterator i = offsets.begin(); i != offsets.end(); ++i)
- theRelHead.insert(i->first);
+ ZLOGF(s, eDebug + 1);
- ZLOGF(s, eDebug);
-
s << "\n";
for (map<string8,size_t>::iterator i = offsets.begin(); i != offsets.end(); ++i)
{
@@ -79,6 +75,11 @@
if (int theAnnoCount = theAnnotations.size())
s.Writef("annotations: %d", theAnnoCount);
}
+
+ RelHead theRelHead;
+ for (map<string8,size_t>::iterator i = offsets.begin(); i != offsets.end(); ++i)
+ theRelHead.insert(i->first);
+
return new ZQE::Result(theRelHead, &thePackedRows, &theAnnotationsVector);
}
Added: trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_AsSQL.cpp
===================================================================
--- trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_AsSQL.cpp (rev 0)
+++ trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_AsSQL.cpp 2010-12-27 04:07:15 UTC (rev 1820)
@@ -0,0 +1,508 @@
+/* -------------------------------------------------------------------------------------------------
+Copyright (c) 2010 Andrew Green
+http://www.zoolib.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+and associated documentation files (the "Software"), to deal in the Software without restriction,
+including without limitation the rights to use, copy, modify, merge, publish, distribute,
+sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES
+OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+------------------------------------------------------------------------------------------------- */
+
+#include "zoolib/ZLog.h"
+//#include "zoolib/ZExpr_Bool_ValPred_Any.h"
+//#include "zoolib/ZStrim.h"
+#include "zoolib/ZStrim_Escaped.h"
+#include "zoolib/ZString.h"
+//#include "zoolib/ZTime.h"
+#include "zoolib/ZUtil_Strim.h"
+#include "zoolib/ZVisitor_Do_T.h"
+#include "zoolib/ZVisitor_Expr_Bool_ValPred_Any_DoToStrim.h"
+#include "zoolib/ZVisitor_Expr_Op_DoTransform_T.h"
+#include "zoolib/ZValPred_Rename_T.h"
+
+#include "zoolib/zra/ZRA_Util_Strim_RelHead.h"
+
+#include "zoolib/zra/ZRA_AsSQL.h"
+#include "zoolib/zra/ZRA_Expr_Rel_Concrete.h"
+#include "zoolib/zra/ZRA_Expr_Rel_Product.h"
+#include "zoolib/zra/ZRA_Expr_Rel_Project.h"
+#include "zoolib/zra/ZRA_Expr_Rel_Rename.h"
+#include "zoolib/zra/ZRA_Expr_Rel_Restrict_Any.h"
+#include "zoolib/zra/ZRA_Expr_Rel_Select.h"
+#include "zoolib/zra/ZRA_Util_RelOperators.h"
+
+#include <set>
+
+namespace ZooLib {
+namespace ZRA {
+
+using std::map;
+using std::set;
+using std::string;
+
+// =================================================================================================
+#pragma mark -
+#pragma mark * spRenamed (anonymous)
+
+namespace { // anonymous
+
+static ZValPred_Any spRenamed(const Rename& iRename, const ZValPred_Any& iValPred)
+ { return ZooLib::sRenamed(iRename, iValPred); }
+
+} // anonymous namespace
+
+// =================================================================================================
+#pragma mark -
+#pragma mark * DoRename (anonymous)
+
+namespace { // anonymous
+
+class DoRename
+: public virtual ZVisitor_Expr_Op_DoTransform_T<ZExpr_Bool>
+, public virtual ZVisitor_Expr_Bool_ValPred_Any
+ {
+public:
+ DoRename(const Rename& iRename);
+
+ virtual void Visit_Expr_Bool_ValPred(ZRef<ZExpr_Bool_ValPred_Any> iExpr);
+private:
+ const Rename& fRename;
+ };
+
+DoRename::DoRename(const Rename& iRename)
+: fRename(iRename)
+ {}
+
+void DoRename::Visit_Expr_Bool_ValPred(ZRef<ZExpr_Bool_ValPred_Any> iExpr)
+ { this->pSetResult(new ZExpr_Bool_ValPred_Any(spRenamed(fRename, iExpr->GetValPred()))); }
+
+static ZRef<ZExpr_Bool> spRenamed(const Rename& iRename, ZRef<ZExpr_Bool> iExpr_Bool)
+ { return DoRename(iRename).Do(iExpr_Bool); }
+
+} // anonymous namespace
+
+// =================================================================================================
+#pragma mark -
+#pragma mark * Thing (anonymous)
+
+namespace { // anonymous
+
+struct Thing
+ {
+ RelHead fRelHead_Physical;
+ Rename fRename;
+ Rename fRename_Inverse;
+ ZRef<ZExpr_Bool> fCondition;
+ };
+
+} // anonymous namespace
+
+// =================================================================================================
+#pragma mark -
+#pragma mark * ZRA::SQL::sAsSQL
+
+class MakeThing
+: public virtual ZVisitor_Do_T<Thing>
+, public virtual Visitor_Expr_Rel_Product
+, public virtual Visitor_Expr_Rel_Project
+, public virtual Visitor_Expr_Rel_Rename
+, public virtual Visitor_Expr_Rel_Restrict_Any
+, public virtual Visitor_Expr_Rel_Select
+, public virtual Visitor_Expr_Rel_Concrete
+ {
+public:
+ MakeThing(const map<string8,RelHead>& iTables);
+
+ virtual void Visit_Expr_Op1(ZRef<ZExpr_Op1_T<ZRef<Expr_Rel> > > iExpr);
+ virtual void Visit_Expr_Op2(ZRef<ZExpr_Op2_T<ZRef<Expr_Rel> > > iExpr);
+ virtual void Visit_Expr_Op0(ZRef<ZExpr_Op0_T<ZRef<Expr_Rel> > > iExpr);
+
+ virtual void Visit_Expr_Rel_Product(ZRef<Expr_Rel_Product> iExpr);
+
+ virtual void Visit_Expr_Rel_Project(ZRef<Expr_Rel_Project> iExpr);
+ virtual void Visit_Expr_Rel_Rename(ZRef<Expr_Rel_Rename> iExpr);
+ virtual void Visit_Expr_Rel_Restrict(ZRef<Expr_Rel_Restrict_Any> iExpr);
+ virtual void Visit_Expr_Rel_Select(ZRef<Expr_Rel_Select> iExpr);
+
+ virtual void Visit_Expr_Rel_Concrete(ZRef<Expr_Rel_Concrete> iExpr);
+
+ const map<string8,RelHead>& fTables;
+ map<string8,int> fTablesUsed;
+ };
+
+MakeThing::MakeThing(const map<string8,RelHead>& iTables)
+: fTables(iTables)
+ {}
+
+void MakeThing::Visit_Expr_Op2(ZRef<ZExpr_Op2_T<ZRef<Expr_Rel> > > iExpr)
+ { ZUnimplemented(); }
+
+void MakeThing::Visit_Expr_Op1(ZRef<ZExpr_Op1_T<ZRef<Expr_Rel> > > iExpr)
+ { ZUnimplemented(); }
+
+void MakeThing::Visit_Expr_Op0(ZRef<ZExpr_Op0_T<ZRef<Expr_Rel> > > iExpr)
+ { ZUnimplemented(); }
+
+void MakeThing::Visit_Expr_Rel_Product(ZRef<Expr_Rel_Product> iExpr)
+ {
+ Thing thing0 = this->Do(iExpr->GetOp0());
+ const Thing thing1 = this->Do(iExpr->GetOp1());
+
+ thing0.fRelHead_Physical |= thing1.fRelHead_Physical;
+ thing0.fRename.insert(thing1.fRename.begin(), thing1.fRename.end());
+ thing0.fRename_Inverse.insert(thing1.fRename_Inverse.begin(), thing1.fRename_Inverse.end());
+ thing0.fCondition &= thing1.fCondition;
+
+ this->pSetResult(thing0);
+ }
+
+void MakeThing::Visit_Expr_Rel_Project(ZRef<Expr_Rel_Project> iExpr)
+ {
+ Thing theThing = this->Do(iExpr->GetOp0());
+ const RelHead& theRH = iExpr->GetProjectRelHead();
+ RelHead newRelHead;
+ for (RelHead::iterator i = theThing.fRelHead_Physical.begin();
+ i != theThing.fRelHead_Physical.end(); ++i)
+ {
+ string theString1 = *i;
+ string theString2 = ZUtil_STL::sGetMustContain(1, theThing.fRename_Inverse, theString1);
+ if (ZUtil_STL::sContains(theRH, theString2))
+ newRelHead.insert(theString1);
+ }
+ theThing.fRelHead_Physical.swap(newRelHead);
+ this->pSetResult(theThing);
+ }
+
+void MakeThing::Visit_Expr_Rel_Restrict(ZRef<Expr_Rel_Restrict_Any> iExpr)
+ {
+ Thing theThing = this->Do(iExpr->GetOp0());
+ theThing.fCondition &= spRenamed(theThing.fRename, iExpr->GetValPred());
+ this->pSetResult(theThing);
+ }
+
+void MakeThing::Visit_Expr_Rel_Select(ZRef<Expr_Rel_Select> iExpr)
+ {
+ Thing theThing = this->Do(iExpr->GetOp0());
+ theThing.fCondition &= spRenamed(theThing.fRename, iExpr->GetExpr_Bool());
+ this->pSetResult(theThing);
+ }
+
+void MakeThing::Visit_Expr_Rel_Rename(ZRef<Expr_Rel_Rename> iExpr)
+ {
+ Thing theThing = this->Do(iExpr->GetOp0());
+ const RelName& oldName = iExpr->GetOld();
+ const RelName& newName = iExpr->GetNew();
+ const RelName orgName = ZUtil_STL::sEraseAndReturnIfContains(theThing.fRename, oldName).Get();
+ const RelName orgNameInverse = ZUtil_STL::sEraseAndReturnIfContains(theThing.fRename_Inverse, orgName).Get();
+ ZAssert(orgNameInverse == oldName);
+ ZUtil_STL::sInsertMustNotContain(1, theThing.fRename, newName, orgName);
+ ZUtil_STL::sInsertMustNotContain(1, theThing.fRename_Inverse, orgName, newName);
+
+ this->pSetResult(theThing);
+ }
+
+void MakeThing::Visit_Expr_Rel_Concrete(ZRef<Expr_Rel_Concrete> iExpr)
+ {
+ // Identify the table.
+ const RelHead& theRH = iExpr->GetConcreteRelHead();
+
+ ZQ<map<string8,RelHead>::const_iterator> found;
+ for (map<string8,RelHead>::const_iterator iter = fTables.begin(); iter != fTables.end(); ++iter)
+ {
+ if ((sPrefixInsert(iter->first + "_", iter->second) & theRH).size())
+ {
+ found = iter;
+ break;
+ }
+ }
+ if (!found)
+ throw std::runtime_error("Couldn't find table");
+
+ const string8 realTableName = found.Get()->first;
+ const string8 realTableNameUnderscore = realTableName + "_";
+ const int numericSuffix = fTablesUsed[realTableName]++;
+ const string8 usedTableName = realTableName + ZStringf("%d",numericSuffix);
+ const string8 usedTableNameDot = usedTableName + ".";
+
+ Thing theThing;
+ theThing.fCondition = sTrue();
+ for (RelHead::const_iterator iter = theRH.begin(); iter != theRH.end(); ++iter)
+ {
+ const string8 attrName = *iter;
+ const string8 fieldName = sPrefixErase(realTableNameUnderscore, attrName);
+ const string8 physicalFieldName = usedTableNameDot + fieldName;
+ theThing.fRelHead_Physical |= physicalFieldName;
+ ZUtil_STL::sInsertMustNotContain(1, theThing.fRename, attrName, physicalFieldName);
+ ZUtil_STL::sInsertMustNotContain(1, theThing.fRename_Inverse, physicalFieldName, attrName);
+ }
+
+ this->pSetResult(theThing);
+ }
+
+// =================================================================================================
+#pragma mark -
+#pragma mark * ToStrim_SQL (anonymous)
+
+namespace { // anonymous
+
+class ToStrim_SQL
+: public virtual ZVisitor_DoToStrim
+, public virtual ZVisitor_Expr_Bool_True
+, public virtual ZVisitor_Expr_Bool_False
+, public virtual ZVisitor_Expr_Bool_Not
+, public virtual ZVisitor_Expr_Bool_And
+, public virtual ZVisitor_Expr_Bool_Or
+, public virtual ZVisitor_Expr_Bool_ValPred_Any
+ {
+public:
+ virtual void Visit_Expr_Bool_True(ZRef<ZExpr_Bool_True> iRep);
+ virtual void Visit_Expr_Bool_False(ZRef<ZExpr_Bool_False> iRep);
+ virtual void Visit_Expr_Bool_Not(ZRef<ZExpr_Bool_Not> iRep);
+ virtual void Visit_Expr_Bool_And(ZRef<ZExpr_Bool_And> iRep);
+ virtual void Visit_Expr_Bool_Or(ZRef<ZExpr_Bool_Or> iRep);
+ virtual void Visit_Expr_Bool_ValPred(ZRef<ZExpr_Bool_ValPred_Any> iRep);
+ };
+
+void ToStrim_SQL::Visit_Expr_Bool_True(ZRef<ZExpr_Bool_True> iRep)
+ { pStrimW() << "1"; }
+
+void ToStrim_SQL::Visit_Expr_Bool_False(ZRef<ZExpr_Bool_False> iRep)
+ { pStrimW() << "0"; }
+
+void ToStrim_SQL::Visit_Expr_Bool_Not(ZRef<ZExpr_Bool_Not> iRep)
+ {
+ pStrimW() << " NOT (";
+ this->pDoToStrim(iRep->GetOp0());
+ pStrimW() << ")";
+ }
+
+void ToStrim_SQL::Visit_Expr_Bool_And(ZRef<ZExpr_Bool_And> iRep)
+ {
+ pStrimW() << "(";
+ this->pDoToStrim(iRep->GetOp0());
+ pStrimW() << " AND ";
+ this->pDoToStrim(iRep->GetOp1());
+ pStrimW() << ")";
+ }
+
+void ToStrim_SQL::Visit_Expr_Bool_Or(ZRef<ZExpr_Bool_Or> iRep)
+ {
+ pStrimW() << "(";
+ this->pDoToStrim(iRep->GetOp0());
+ pStrimW() << " OR ";
+ this->pDoToStrim(iRep->GetOp1());
+ pStrimW() << ")";
+ }
+
+typedef ZValComparator_Simple_T<ZVal_Any> ZValComparator_Simple;
+typedef ZValComparand_Name_T<ZVal_Any> ZValComparand_Name;
+typedef ZValComparand_Var_T<ZVal_Any> ZValComparand_Var;
+typedef ZValComparand_Const_T<ZVal_Any> ZValComparand_Const;
+
+static void spToStrim_SimpleValue(const ZStrimW& s, const ZAny& iAny)
+ {
+ int64 asInt64;
+
+ if (false)
+ {}
+ else if (!iAny)
+ {
+ s << "null";
+ }
+ else if (const string8* theValue = iAny.PGet<string8>())
+ {
+ ZStrimW_Escaped::Options theOptions;
+ theOptions.fQuoteQuotes = true;
+ theOptions.fEscapeHighUnicode = false;
+ s << "'";
+ ZStrimW_Escaped(theOptions, s).Write(*theValue);
+ s << "'";
+ }
+ else if (const bool* theValue = iAny.PGet<bool>())
+ {
+ if (*theValue)
+ s.Write("1");
+ else
+ s.Write("0");
+ }
+ else if (sQCoerceInt(iAny, asInt64))
+ {
+ s.Writef("%lld", asInt64);
+ }
+ else if (const float* asFloat = iAny.PGet<float>())
+ {
+ ZUtil_Strim::sWriteExact(s, *asFloat);
+ }
+ else if (const double* asDouble = iAny.PGet<double>())
+ {
+ ZUtil_Strim::sWriteExact(s, *asDouble);
+ }
+ else if (const ZTime* asTime = iAny.PGet<ZTime>())
+ {
+ ZUtil_Strim::sWriteExact(s, asTime->fVal);
+ }
+ else
+ {
+ s << "null /*!!Unhandled: " << iAny.Type().name() << "!!*/";
+ }
+ }
+
+static void spWrite_PropName(const string8& iName, const ZStrimW& s)
+ {
+ s << iName;
+ }
+
+static void spToStrim(const ZRef<ZValPred_Any::Comparand>& iCR, const ZStrimW& s)
+ {
+ if (!iCR)
+ {
+ s << "!!Null Comparand!!";
+ }
+ else if (ZRef<ZValComparand_Name> cr = iCR.DynamicCast<ZValComparand_Name>())
+ {
+ spWrite_PropName(cr->GetName(), s);
+ }
+ else if (ZRef<ZValComparand_Var> cr = iCR.DynamicCast<ZValComparand_Var>())
+ {
+ s << "$" << cr->GetVarName();
+ }
+ else if (ZRef<ZValComparand_Const> cr = iCR.DynamicCast<ZValComparand_Const>())
+ {
+ spToStrim_SimpleValue(s, cr->GetVal());
+ }
+ else
+ {
+ s << "!!Unknown Comparand!!";
+ }
+ }
+
+static void spToStrim(const ZRef<ZValPred_Any::Comparator>& iCR, const ZStrimW& s)
+ {
+ if (!iCR)
+ {
+ s << "!!Null Comparator!!";
+ }
+ else if (ZRef<ZValComparator_Simple> cr = iCR.DynamicCast<ZValComparator_Simple>())
+ {
+ switch (cr->GetEComparator())
+ {
+ case ZValComparator_Simple::eLT:
+ {
+ s << " < ";
+ break;
+ }
+ case ZValComparator_Simple::eLE:
+ {
+ s << " <= ";
+ break;
+ }
+ case ZValComparator_Simple::eEQ:
+ {
+ s << " = ";
+ break;
+ }
+ case ZValComparator_Simple::eGE:
+ {
+ s << " >= ";
+ break;
+ }
+ case ZValComparator_Simple::eGT:
+ {
+ s << " > ";
+ break;
+ }
+ }
+ }
+ else
+ {
+ s << "!!Unknown Comparator!!";
+ }
+ }
+
+void spToStrim(const ZValPred_Any& iValPred, const ZStrimW& s)
+ {
+ spToStrim(iValPred.GetLHS(), s);
+ spToStrim(iValPred.GetComparator(), s);
+ spToStrim(iValPred.GetRHS(), s);
+ }
+
+void ToStrim_SQL::Visit_Expr_Bool_ValPred(
+ ZRef<ZExpr_Bool_ValPred_Any> iRep)
+ { spToStrim(iRep->GetValPred(), pStrimW()); }
+
+} // anonymous namespace
+
+// =================================================================================================
+#pragma mark -
+#pragma mark * ZRA::SQL::sAsSQL
+
+bool sWriteAsSQL(const std::map<string8,RelHead>& iTables, ZRef<Expr_Rel> iRel, const ZStrimW& s)
+ {
+ try
+ {
+ MakeThing theMakeThing(iTables);
+ const Thing theThing = theMakeThing.Do(iRel);
+
+ s << "SELECT DISTINCT ";
+
+ {
+ RelHead theRHLogical;
+ for (RelHead::iterator i = theThing.fRelHead_Physical.begin();
+ i != theThing.fRelHead_Physical.end(); ++i)
+ {
+ theRHLogical |= ZUtil_STL::sGetMustContain(1, theThing.fRename_Inverse, *i);
+ }
+
+ bool isFirst = true;
+ for (RelHead::iterator i = theRHLogical.begin(); i != theRHLogical.end(); ++i)
+ {
+ if (!isFirst)
+ s << ",";
+ isFirst = false;
+ s << ZUtil_STL::sGetMustContain(1, theThing.fRename, *i);
+ }
+ }
+
+ s << " FROM ";
+
+ {
+ bool isFirst = true;
+
+ for (map<string8,int>::iterator i = theMakeThing.fTablesUsed.begin();
+ i != theMakeThing.fTablesUsed.end(); ++i)
+ {
+ for (int x = 0; x < i->second; ++x)
+ {
+ if (!isFirst)
+ s << ",";
+ isFirst = false;
+ s << i->first << " AS " << i->first << ZStringf("%d", x);
+ }
+ }
+ }
+
+ s << " WHERE ";
+
+ ToStrim_SQL().DoToStrim(ToStrim_SQL::Options(), s, theThing.fCondition);
+
+ s << ";\n";
+ return true;
+ }
+ catch (...)
+ {}
+
+ return false;
+ }
+
+} // namespace ZRA
+} // namespace ZooLib
Added: trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_AsSQL.h
===================================================================
--- trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_AsSQL.h (rev 0)
+++ trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_AsSQL.h 2010-12-27 04:07:15 UTC (rev 1820)
@@ -0,0 +1,45 @@
+/* -------------------------------------------------------------------------------------------------
+Copyright (c) 2010 Andrew Green
+http://www.zoolib.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+and associated documentation files (the "Software"), to deal in the Software without restriction,
+including without limitation the rights to use, copy, modify, merge, publish, distribute,
+sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES
+OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+------------------------------------------------------------------------------------------------- */
+
+#ifndef __ZRA_AsSQL__
+#define __ZRA_AsSQL__
+#include "zconfig.h"
+
+#include "zoolib/ZStrim.h"
+
+#include "zoolib/zra/ZRA_Expr_Rel.h"
+#include "zoolib/zra/ZRA_RelHead.h"
+
+#include <map>
+
+namespace ZooLib {
+namespace ZRA {
+
+// =================================================================================================
+#pragma mark -
+#pragma mark *
+
+bool sWriteAsSQL(const std::map<string8,RelHead>& iTables, ZRef<Expr_Rel> iRel, const ZStrimW& s);
+
+
+} // namespace ZRA
+} // namespace ZooLib
+
+#endif // __ZRA_AsSQL__
Modified: trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_Expr_Rel_Concrete.cpp
===================================================================
--- trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_Expr_Rel_Concrete.cpp 2010-12-27 04:06:25 UTC (rev 1819)
+++ trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_Expr_Rel_Concrete.cpp 2010-12-27 04:07:15 UTC (rev 1820)
@@ -25,18 +25,12 @@
// =================================================================================================
#pragma mark -
-#pragma mark * ConcreteDomain
+#pragma mark * Expr_Rel_Concrete
-ConcreteDomain::ConcreteDomain()
+Expr_Rel_Concrete::Expr_Rel_Concrete(const RelHead& iRelHead)
+: fRelHead(iRelHead)
{}
-ConcreteDomain::~ConcreteDomain()
- {}
-
-// =================================================================================================
-#pragma mark -
-#pragma mark * Expr_Rel_Concrete
-
void Expr_Rel_Concrete::Accept_Expr_Op0(ZVisitor_Expr_Op0_T<Expr_Rel>& iVisitor)
{
if (Visitor_Expr_Rel_Concrete* theVisitor =
@@ -50,24 +44,18 @@
}
}
-void Expr_Rel_Concrete::Accept_Expr_Rel_Concrete(Visitor_Expr_Rel_Concrete& iVisitor)
- { iVisitor.Visit_Expr_Rel_Concrete(this); }
-
ZRef<Expr_Rel> Expr_Rel_Concrete::Self()
{ return this; }
ZRef<Expr_Rel> Expr_Rel_Concrete::Clone()
{ return this; }
-ZRef<ConcreteDomain> Expr_Rel_Concrete::GetConcreteDomain()
- { return null; }
+void Expr_Rel_Concrete::Accept_Expr_Rel_Concrete(Visitor_Expr_Rel_Concrete& iVisitor)
+ { iVisitor.Visit_Expr_Rel_Concrete(this); }
-string8 Expr_Rel_Concrete::GetName()
- { return string8(); }
+RelHead Expr_Rel_Concrete::GetConcreteRelHead()
+ { return fRelHead; }
-string8 Expr_Rel_Concrete::GetDescription()
- { return string8(); }
-
// =================================================================================================
#pragma mark -
#pragma mark * Visitor_Expr_Rel_Concrete
@@ -77,34 +65,10 @@
// =================================================================================================
#pragma mark -
-#pragma mark * Expr_Rel_Concrete_Simple
-
-Expr_Rel_Concrete_Simple::Expr_Rel_Concrete_Simple(
- ZRef<ConcreteDomain> iConcreteDomain, const string8& iName, const RelHead& iRelHead)
-: fConcreteDomain(iConcreteDomain)
-, fName(iName)
-, fRelHead(iRelHead)
- {}
-
-RelHead Expr_Rel_Concrete_Simple::GetConcreteRelHead()
- { return fRelHead; }
-
-ZRef<ConcreteDomain> Expr_Rel_Concrete_Simple::GetConcreteDomain()
- { return fConcreteDomain; }
-
-string8 Expr_Rel_Concrete_Simple::GetName()
- { return fName; }
-
-// =================================================================================================
-#pragma mark -
#pragma mark * sConcrete
-ZRef<Expr_Rel> sConcrete(
- ZRef<ConcreteDomain> iConcreteDomain, const string8& iName, const RelHead& iRelHead)
- { return new Expr_Rel_Concrete_Simple(iConcreteDomain, iName, iRelHead); }
-
ZRef<Expr_Rel> sConcrete(const RelHead& iRelHead)
- { return new Expr_Rel_Concrete_Simple(null, string8(), iRelHead); }
+ { return new Expr_Rel_Concrete(iRelHead); }
} // namespace ZRA
} // namespace ZooLib
Modified: trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_Expr_Rel_Concrete.h
===================================================================
--- trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_Expr_Rel_Concrete.h 2010-12-27 04:06:25 UTC (rev 1819)
+++ trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_Expr_Rel_Concrete.h 2010-12-27 04:07:15 UTC (rev 1820)
@@ -34,17 +34,6 @@
// =================================================================================================
#pragma mark -
-#pragma mark * ConcreteDomain
-
-class ConcreteDomain : public ZCounted
- {
-public:
- ConcreteDomain();
- virtual ~ConcreteDomain();
- };
-
-// =================================================================================================
-#pragma mark -
#pragma mark * Expr_Rel_Concrete
class Expr_Rel_Concrete
@@ -53,6 +42,8 @@
{
typedef ZExpr_Op0_T<Expr_Rel> inherited;
public:
+ Expr_Rel_Concrete(const RelHead& iRelHead);
+
// From ZExpr_Op0_T<Expr_Rel>
virtual void Accept_Expr_Op0(ZVisitor_Expr_Op0_T<Expr_Rel>& iVisitor);
@@ -62,12 +53,10 @@
// Our protocol
virtual void Accept_Expr_Rel_Concrete(Visitor_Expr_Rel_Concrete& iVisitor);
- virtual RelHead GetConcreteRelHead() = 0;
- virtual ZRef<ConcreteDomain> GetConcreteDomain();
- virtual string8 GetName();
+ RelHead GetConcreteRelHead();
-// Experimental. Perhaps should be something we ask of the ConcreteDomain?
- virtual string8 GetDescription();
+private:
+ const RelHead fRelHead;
};
// =================================================================================================
@@ -84,28 +73,8 @@
// =================================================================================================
#pragma mark -
-#pragma mark * Expr_Rel_Concrete_Simple
+#pragma mark * Relational operators
-class Expr_Rel_Concrete_Simple : public Expr_Rel_Concrete
- {
-public:
- Expr_Rel_Concrete_Simple(
- ZRef<ConcreteDomain> iConcreteDomain, const string8& iName, const RelHead& iRelHead);
-
-// From Expr_Rel_Concrete
- virtual RelHead GetConcreteRelHead();
- virtual ZRef<ConcreteDomain> GetConcreteDomain();
- virtual string8 GetName();
-
-private:
- ZRef<ConcreteDomain> fConcreteDomain;
- const string8 fName;
- const RelHead fRelHead;
- };
-
-ZRef<Expr_Rel> sConcrete(
- ZRef<ConcreteDomain> iConcreteDomain, const string8& iName, const RelHead& iRelHead);
-
ZRef<Expr_Rel> sConcrete(const RelHead& iRelHead);
} // namespace ZRA
Modified: trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_RelHead.cpp
===================================================================
--- trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_RelHead.cpp 2010-12-27 04:06:25 UTC (rev 1819)
+++ trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_RelHead.cpp 2010-12-27 04:07:15 UTC (rev 1820)
@@ -32,60 +32,77 @@
ZMACRO_CompareRegistration_T(ZRA::RelHead)
+} // namespace ZooLib
+
+namespace ZooLib {
+namespace ZRA {
+
// =================================================================================================
#pragma mark -
-#pragma mark * Rename_t
+#pragma mark * Rename
-Rename_t sInverted(const Rename_t& iRename)
+Rename sInverted(const Rename& iRename)
{
- Rename_t result;
- for (Rename_t::const_iterator i = iRename.begin(); i != iRename.end(); ++i)
+ Rename result;
+ for (Rename::const_iterator i = iRename.begin(); i != iRename.end(); ++i)
result[i->second] = i->first;
return result;
}
-} // namespace ZooLib
-
-namespace ZooLib {
-namespace ZRA {
-
// =================================================================================================
#pragma mark -
#pragma mark * RelHead
-RelName sPrefixAdd(const RelName& iPrefix, const RelName& iRelName)
+RelName sPrefixInsert(const RelName& iPrefix, const RelName& iRelName)
{ return iPrefix + iRelName; }
-RelName sPrefixRemove(const RelName& iPrefix, const RelName& iRelName)
+RelName sPrefixErase(const RelName& iPrefix, const RelName& iRelName)
{
if (iRelName.substr(0, iPrefix.size()) == iPrefix)
return iRelName.substr(iPrefix.size(), RelName::npos);
return iRelName;
}
-RelHead sPrefixAdd(const RelName& iPrefix, const RelHead& iRelHead)
+RelHead sPrefixInsert(const RelName& iPrefix, const RelHead& iRelHead)
{
if (iPrefix.empty())
return iRelHead;
RelHead result;
for (RelHead::const_iterator i = iRelHead.begin(); i != iRelHead.end(); ++i)
- result.insert(sPrefixAdd(iPrefix, *i));
+ result.insert(sPrefixInsert(iPrefix, *i));
return result;
}
-RelHead sPrefixRemove(const RelName& iPrefix, const RelHead& iRelHead)
+RelHead sPrefixErase(const RelName& iPrefix, const RelHead& iRelHead)
{
if (iPrefix.empty())
return iRelHead;
RelHead result;
for (RelHead::const_iterator i = iRelHead.begin(); i != iRelHead.end(); ++i)
- result.insert(sPrefixRemove(iPrefix, *i));
+ result.insert(sPrefixErase(iPrefix, *i));
return result;
}
+RelHead sRenamed(const Rename& iRename, const RelHead& iRelHead)
+ {
+ if (iRename.empty())
+ return iRelHead;
+
+ RelHead result;
+ for (RelHead::const_iterator i = iRelHead.begin(); i != iRelHead.end(); ++i)
+ {
+ Rename::const_iterator iter = iRename.find(*i);
+ if (iRename.end() == iter)
+ result.insert(*i);
+ else
+ result.insert(iter->second);
+ }
+ return result;
+ }
+
} // namespace ZRA
} // namespace ZooLib
Modified: trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_RelHead.h
===================================================================
--- trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_RelHead.h 2010-12-27 04:06:25 UTC (rev 1819)
+++ trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_RelHead.h 2010-12-27 04:07:15 UTC (rev 1820)
@@ -22,7 +22,6 @@
#define __ZRA_RelHead__ 1
#include "zconfig.h"
-#include "zoolib/ZCompare_T.h"
#include "zoolib/ZSet_T.h"
#include "zoolib/zra/ZRA_RelName.h"
@@ -30,31 +29,30 @@
#include <set>
namespace ZooLib {
+namespace ZRA {
// =================================================================================================
#pragma mark -
-#pragma mark * Rename_t
+#pragma mark * Rename
-// This needs to be in ZooLib, or we get ambiguities with the one defined in ZValPred_T.h
+typedef std::map<RelName,RelName> Rename;
-typedef std::map<std::string, std::string> Rename_t;
+Rename sInverted(const Rename& iRename);
-Rename_t sInverted(const Rename_t& iRename);
-
-namespace ZRA {
-
// =================================================================================================
#pragma mark -
#pragma mark * RelHead
typedef ZSet_T<RelName> RelHead;
-RelName sPrefixAdd(const RelName& iPrefix, const RelName& iRelName);
-RelName sPrefixRemove(const RelName& iPrefix, const RelName& iRelName);
+RelName sPrefixInsert(const RelName& iPrefix, const RelName& iRelName);
+RelName sPrefixErase(const RelName& iPrefix, const RelName& iRelName);
-RelHead sPrefixAdd(const RelName& iPrefix, const RelHead& iRelHead);
-RelHead sPrefixRemove(const RelName& iPrefix, const RelHead& iRelHead);
+RelHead sPrefixInsert(const RelName& iPrefix, const RelHead& iRelHead);
+RelHead sPrefixErase(const RelName& iPrefix, const RelHead& iRelHead);
+RelHead sRenamed(const Rename& iRename, const RelHead& iRelHead);
+
// =================================================================================================
#pragma mark -
#pragma mark * RelHead operators
Modified: trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_RelName.h
===================================================================
--- trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_RelName.h 2010-12-27 04:06:25 UTC (rev 1819)
+++ trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_RelName.h 2010-12-27 04:07:15 UTC (rev 1820)
@@ -22,7 +22,7 @@
#define __ZRA_RelName__ 1
#include "zconfig.h"
-#include "zoolib/ZTrail.h"
+#include "zoolib/ZUnicodeString.h"
namespace ZooLib {
namespace ZRA {
Deleted: trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_SQL.cpp
===================================================================
--- trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_SQL.cpp 2010-12-27 04:06:25 UTC (rev 1819)
+++ trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_SQL.cpp 2010-12-27 04:07:15 UTC (rev 1820)
@@ -1,554 +0,0 @@
-/* -------------------------------------------------------------------------------------------------
-Copyright (c) 2010 Andrew Green
-http://www.zoolib.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-and associated documentation files (the "Software"), to deal in the Software without restriction,
-including without limitation the rights to use, copy, modify, merge, publish, distribute,
-sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES
-OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
-OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-------------------------------------------------------------------------------------------------- */
-
-#include "zoolib/ZExpr_Bool_ValPred_Any.h"
-#include "zoolib/ZStrim.h"
-#include "zoolib/ZStrim_Escaped.h"
-#include "zoolib/ZTime.h"
-#include "zoolib/ZUtil_Strim.h"
-#include "zoolib/ZVisitor_Expr_Bool_ValPred_Any_DoToStrim.h"
-#include "zoolib/ZVisitor_Expr_Op_DoTransform_T.h"
-
-#include "zoolib/zra/ZRA_Expr_Rel_Product.h"
-#include "zoolib/zra/ZRA_Expr_Rel_Project.h"
-#include "zoolib/zra/ZRA_Expr_Rel_Rename.h"
-#include "zoolib/zra/ZRA_Expr_Rel_Restrict_Any.h"
-#include "zoolib/zra/ZRA_Expr_Rel_Select.h"
-#include "zoolib/zra/ZRA_SQL.h"
-
-#include <map>
-
-namespace ZooLib {
-namespace ZRA {
-namespace SQL {
-
-using std::map;
-using std::set;
-using std::vector;
-
-// =================================================================================================
-#pragma mark -
-#pragma mark * DoRename (anonymous)
-
-namespace { // anonymous
-
-class DoRename
-: public virtual ZVisitor_Expr_Op_DoTransform_T<ZExpr_Bool>
-, public virtual ZVisitor_Expr_Bool_ValPred_Any
- {
-public:
- DoRename(const Rename_t& iRename);
-
- virtual void Visit_Expr_Bool_ValPred(ZRef<ZExpr_Bool_ValPred_Any> iExpr);
-private:
- const Rename_t& fRename;
- };
-
-DoRename::DoRename(const Rename_t& iRename)
-: fRename(iRename)
- {}
-
-void DoRename::Visit_Expr_Bool_ValPred(ZRef<ZExpr_Bool_ValPred_Any> iExpr)
- {
- ZValPred_Any result;
- if (iExpr->GetValPred().Renamed(fRename, result))
- this->pSetResult(new ZExpr_Bool_ValPred_Any(result));
- else
- this->pSetResult(iExpr);
- }
-
-} // anonymous namespace
-
-// =================================================================================================
-#pragma mark -
-#pragma mark * MakeSFW (anonymous)
-
-namespace { // anonymous
-
-class MakeSFW
-: public virtual ZVisitor_Expr_Op_DoTransform_T<Expr_Rel_SFW>
-, public virtual Visitor_Expr_Rel_Product
-, public virtual Visitor_Expr_Rel_Concrete
-, public virtual Visitor_Expr_Rel_Project
-, public virtual Visitor_Expr_Rel_Rename
-, public virtual Visitor_Expr_Rel_Restrict_Any
-, public virtual Visitor_Expr_Rel_Select
- {
-public:
- virtual void Visit_Expr_Op0(ZRef<ZExpr_Op0_T<ZRef<Expr_Rel_SFW> > > iExpr);
- virtual void Visit_Expr_Op1(ZRef<ZExpr_Op1_T<ZRef<Expr_Rel_SFW> > > iExpr);
- virtual void Visit_Expr_Op2(ZRef<ZExpr_Op2_T<ZRef<Expr_Rel_SFW> > > iExpr);
-
- virtual void Visit_Expr_Rel_Product(ZRef<Expr_Rel_Product> iExpr);
-
- virtual void Visit_Expr_Rel_Concrete(ZRef<Expr_Rel_Concrete> iExpr);
-
- virtual void Visit_Expr_Rel_Project(ZRef<Expr_Rel_Project> iExpr);
- virtual void Visit_Expr_Rel_Rename(ZRef<Expr_Rel_Rename> iExpr);
- virtual void Visit_Expr_Rel_Restrict(ZRef<Expr_Rel_Restrict_Any> iExpr);
- virtual void Visit_Expr_Rel_Select(ZRef<Expr_Rel_Select> iExpr);
- };
-
-void MakeSFW::Visit_Expr_Op0(ZRef<ZExpr_Op0_T<ZRef<Expr_Rel_SFW> > > iExpr)
- { ZUnimplemented(); }
-
-void MakeSFW::Visit_Expr_Op1(ZRef<ZExpr_Op1_T<ZRef<Expr_Rel_SFW> > > iExpr)
- { ZUnimplemented(); }
-
-void MakeSFW::Visit_Expr_Op2(ZRef<ZExpr_Op2_T<ZRef<Expr_Rel_SFW> > > iExpr)
- { ZUnimplemented(); }
-
-void MakeSFW::Visit_Expr_Rel_Product(ZRef<Expr_Rel_Product> iExpr)
- {
- ZRef<Expr_Rel_SFW> sfw0 = this->Do(iExpr->GetOp0());
- ZRef<Expr_Rel_SFW> sfw1 = this->Do(iExpr->GetOp1());
-
- Rename_t theRename = sfw0->GetRename();
- const Rename_t& theRename1 = sfw1->GetRename();
- theRename.insert(theRename1.begin(), theRename1.end());
-
- vector<ZRef<Expr_Rel_Concrete> > rels = sfw0->GetRels();
- const vector<ZRef<Expr_Rel_Concrete> > rels1 = sfw1->GetRels();
- rels.insert(rels.end(), rels1.begin(), rels1.end());
-
- ZRef<Expr_Rel_SFW> result = new Expr_Rel_SFW(
- theRename,
- sfw0->GetConcreteRelHead() | sfw1->GetConcreteRelHead(),
- sfw0->GetCondition() & sfw1->GetCondition(),
- rels);
-
- this->pSetResult(result);
- }
-
-void MakeSFW::Visit_Expr_Rel_Concrete(ZRef<Expr_Rel_Concrete> iExpr)
- {
- ZRef<Expr_Rel_SFW> result = new Expr_Rel_SFW(
- Rename_t(),
- iExpr->GetConcreteRelHead(),
- sTrue(),
- vector<ZRef<Expr_Rel_Concrete> >(1, iExpr));
-
- this->pSetResult(result);
- }
-
-void MakeSFW::Visit_Expr_Rel_Project(ZRef<Expr_Rel_Project> iExpr)
- {
- // Descend
- ZRef<Expr_Rel_SFW> sfw0 = this->Do(iExpr->GetOp0());
-
- ZRef<Expr_Rel_SFW> result = new Expr_Rel_SFW(
- sfw0->GetRename(),
- sfw0->GetConcreteRelHead() & iExpr->GetProjectRelHead(),
- sfw0->GetCondition(),
- sfw0->GetRels());
-
- this->pSetResult(result);
- }
-
-static RelHead spRenamed(RelHead iRelHead, const RelName& iOld, const RelName& iNew)
- {
- if (iRelHead.Contains(iOld))
- {
- iRelHead -= iOld;
- iRelHead |= iNew;
- }
- return iRelHead;
- }
-
-void MakeSFW::Visit_Expr_Rel_Rename(ZRef<Expr_Rel_Rename> iExpr)
- {
- ZRef<Expr_Rel_SFW> sfw0 = this->Do(iExpr->GetOp0());
-
- const RelName& oldName = iExpr->GetOld();
- const RelName& newName = iExpr->GetNew();
- Rename_t theRename = sfw0->GetRename();
- bool foundIt = false;
- for (Rename_t::iterator i = theRename.begin(); i != theRename.end(); /*no inc*/)
- {
- if (i->second == oldName)
- {
- i->second = newName;
- foundIt = true;
- }
- }
-
- if (!foundIt)
- theRename[oldName] = newName;
-
- ZRef<Expr_Rel_SFW> result = new Expr_Rel_SFW(
- theRename,
- spRenamed(sfw0->GetConcreteRelHead(), oldName, newName),
- sfw0->GetCondition(),
- sfw0->GetRels());
-
- this->pSetResult(result);
- }
-
-static ZValPred_Any spRenamedInverse(
- const ZValPred_Any& iValPred, const Rename_t& iRename)
- {
- ZValPred_Any result;
- if (iValPred.Renamed(sInverted(iRename), result))
- return result;
- return iValPred;
- }
-
-static ZRef<ZExpr_Bool> spRenamedInverse(
- ZRef<ZExpr_Bool> iExpr_Bool, const Rename_t& iRename)
- { return DoRename(sInverted(iRename)).Do(iExpr_Bool); }
-
-void MakeSFW::Visit_Expr_Rel_Restrict(ZRef<Expr_Rel_Restrict_Any> iExpr)
- {
- ZRef<Expr_Rel_SFW> sfw0 = this->Do(iExpr->GetOp0());
-
- const Rename_t& theRename = sfw0->GetRename();
- ZRef<Expr_Rel_SFW> result = new Expr_Rel_SFW(
- theRename,
- sfw0->GetConcreteRelHead(),
- sfw0->GetCondition() & spRenamedInverse(iExpr->GetValPred(), theRename),
- sfw0->GetRels());
-
- this->pSetResult(result);
- }
-
-void MakeSFW::Visit_Expr_Rel_Select(ZRef<Expr_Rel_Select> iExpr)
- {
- ZRef<Expr_Rel_SFW> sfw0 = this->Do(iExpr->GetOp0());
-
- const Rename_t& theRename = sfw0->GetRename();
- ZRef<Expr_Rel_SFW> result = new Expr_Rel_SFW(
- theRename,
- sfw0->GetConcreteRelHead(),
- sfw0->GetCondition() & spRenamedInverse(iExpr->GetExpr_Bool(), theRename),
- sfw0->GetRels());
-
- this->pSetResult(result);
- }
-
-} // anonymous namespace
-
-// =================================================================================================
-#pragma mark -
-#pragma mark * Expr_Rel_SFW
-
-Expr_Rel_SFW::Expr_Rel_SFW(const Rename_t& iRename,
- const RelHead& iRelHead,
- ZRef<ZExpr_Bool> iCondition,
- const vector<ZRef<Expr_Rel_Concrete> >& iRels)
-: fRename(iRename)
-, fRelHead(iRelHead)
-, fCondition(iCondition)
-, fRels(iRels)
- {}
-
-RelHead Expr_Rel_SFW::GetConcreteRelHead()
- { return fRelHead; }
-
-const Rename_t& Expr_Rel_SFW::GetRename()
- { return fRename; }
-
-ZRef<ZExpr_Bool> Expr_Rel_SFW::GetCondition()
- { return fCondition; }
-
-const vector<ZRef<Expr_Rel_Concrete> >& Expr_Rel_SFW::GetRels()
- { return fRels; }
-
-// =================================================================================================
-#pragma mark -
-#pragma mark * ZRA::SQL::sConvert
-
-ZRef<Expr_Rel_SFW> sConvert(ZRef<Expr_Rel> iExpr)
- { return MakeSFW().Do(iExpr); }
-
-// =================================================================================================
-#pragma mark -
-#pragma mark * ToStrim_SQL (anonymous)
-
-namespace { // anonymous
-
-class ToStrim_SQL
-: public virtual ZVisitor_DoToStrim
-, public virtual ZVisitor_Expr_Bool_True
-, public virtual ZVisitor_Expr_Bool_False
-, public virtual ZVisitor_Expr_Bool_Not
-, public virtual ZVisitor_Expr_Bool_And
-, public virtual ZVisitor_Expr_Bool_Or
-, public virtual ZVisitor_Expr_Bool_ValPred_Any
- {
-public:
- virtual void Visit_Expr_Bool_True(ZRef<ZExpr_Bool_True> iRep);
- virtual void Visit_Expr_Bool_False(ZRef<ZExpr_Bool_False> iRep);
- virtual void Visit_Expr_Bool_Not(ZRef<ZExpr_Bool_Not> iRep);
- virtual void Visit_Expr_Bool_And(ZRef<ZExpr_Bool_And> iRep);
- virtual void Visit_Expr_Bool_Or(ZRef<ZExpr_Bool_Or> iRep);
- virtual void Visit_Expr_Bool_ValPred(ZRef<ZExpr_Bool_ValPred_Any> iRep);
- };
-
-void ToStrim_SQL::Visit_Expr_Bool_True(ZRef<ZExpr_Bool_True> iRep)
- { pStrimW() << "1"; }
-
-void ToStrim_SQL::Visit_Expr_Bool_False(ZRef<ZExpr_Bool_False> iRep)
- { pStrimW() << "0"; }
-
-void ToStrim_SQL::Visit_Expr_Bool_Not(ZRef<ZExpr_Bool_Not> iRep)
- {
- pStrimW() << " NOT (";
- this->pDoToStrim(iRep->GetOp0());
- pStrimW() << ")";
- }
-
-void ToStrim_SQL::Visit_Expr_Bool_And(ZRef<ZExpr_Bool_And> iRep)
- {
- pStrimW() << "(";
- this->pDoToStrim(iRep->GetOp0());
- pStrimW() << " AND ";
- this->pDoToStrim(iRep->GetOp1());
- pStrimW() << ")";
- }
-
-void ToStrim_SQL::Visit_Expr_Bool_Or(ZRef<ZExpr_Bool_Or> iRep)
- {
- pStrimW() << "(";
- this->pDoToStrim(iRep->GetOp0());
- pStrimW() << " OR ";
- this->pDoToStrim(iRep->GetOp1());
- pStrimW() << ")";
- }
-
-typedef ZValComparator_Simple_T<ZVal_Any> ZValComparator_Simple;
-typedef ZValComparand_Name_T<ZVal_Any> ZValComparand_Name;
-typedef ZValComparand_Var_T<ZVal_Any> ZValComparand_Var;
-typedef ZValComparand_Const_T<ZVal_Any> ZValComparand_Const;
-
-// =================================================================================================
-#pragma mark -
-#pragma mark * Static helper functions
-
-static void spToStrim_SimpleValue(const ZStrimW& s, const ZAny& iAny)
- {
- int64 asInt64;
-
- if (false)
- {}
- else if (!iAny)
- {
- s << "null";
- }
- else if (const string8* theValue = iAny.PGet<string8>())
- {
- ZStrimW_Escaped::Options theOptions;
- theOptions.fQuoteQuotes = true;
- theOptions.fEscapeHighUnicode = false;
- s << "'";
- ZStrimW_Escaped(theOptions, s).Write(*theValue);
- s << "'";
- }
- else if (const bool* theValue = iAny.PGet<bool>())
- {
- if (*theValue)
- s.Write("1");
- else
- s.Write("0");
- }
- else if (sQCoerceInt(iAny, asInt64))
- {
- s.Writef("%lld", asInt64);
- }
- else if (const float* asFloat = iAny.PGet<float>())
- {
- ZUtil_Strim::sWriteExact(s, *asFloat);
- }
- else if (const double* asDouble = iAny.PGet<double>())
- {
- ZUtil_Strim::sWriteExact(s, *asDouble);
- }
- else if (const ZTime* asTime = iAny.PGet<ZTime>())
- {
- ZUtil_Strim::sWriteExact(s, asTime->fVal);
- }
- else
- {
- s << "null /*!!Unhandled: " << iAny.Type().name() << "!!*/";
- }
- }
-
-static void spWrite_PropName(const string8& iName, const ZStrimW& s)
- {
- s << iName;
- }
-
-static void spToStrim(const ZRef<ZValPred_Any::Comparand>& iCR, const ZStrimW& s)
- {
- if (!iCR)
- {
- s << "!!Null Comparand!!";
- }
- else if (ZRef<ZValComparand_Name> cr = iCR.DynamicCast<ZValComparand_Name>())
- {
- spWrite_PropName(cr->GetName(), s);
- }
- else if (ZRef<ZValComparand_Var> cr = iCR.DynamicCast<ZValComparand_Var>())
- {
- s << "$" << cr->GetVarName();
- }
- else if (ZRef<ZValComparand_Const> cr = iCR.DynamicCast<ZValComparand_Const>())
- {
- spToStrim_SimpleValue(s, cr->GetVal());
- }
- else
- {
- s << "!!Unknown Comparand!!";
- }
- }
-
-static void spToStrim(const ZRef<ZValPred_Any::Comparator>& iCR, const ZStrimW& s)
- {
- if (!iCR)
- {
- s << "!!Null Comparator!!";
- }
- else if (ZRef<ZValComparator_Simple> cr = iCR.DynamicCast<ZValComparator_Simple>())
- {
- switch (cr->GetEComparator())
- {
- case ZValComparator_Simple::eLT:
- {
- s << " < ";
- break;
- }
- case ZValComparator_Simple::eLE:
- {
- s << " <= ";
- break;
- }
- case ZValComparator_Simple::eEQ:
- {
- s << " = ";
- break;
- }
- case ZValComparator_Simple::eGE:
- {
- s << " >= ";
- break;
- }
- case ZValComparator_Simple::eGT:
- {
- s << " > ";
- break;
- }
- }
- }
- else
- {
- s << "!!Unknown Comparator!!";
- }
- }
-
-void spToStrim(const ZValPred_Any& iValPred, const ZStrimW& s)
- {
- spToStrim(iValPred.GetLHS(), s);
- spToStrim(iValPred.GetComparator(), s);
- spToStrim(iValPred.GetRHS(), s);
- }
-
-void ToStrim_SQL::Visit_Expr_Bool_ValPred(
- ZRef<ZExpr_Bool_ValPred_Any> iRep)
- { spToStrim(iRep->GetValPred(), pStrimW()); }
-
-} // anonymous namespace
-
-// =================================================================================================
-#pragma mark -
-#pragma mark * ZRA::SQL::sConvert
-
-void sAsSQL(ZRef<Expr_Rel_SFW> iSFW, const ZStrimW& s)
- {
- if (iSFW)
- {
- s << "SELECT";
- const RelHead& theRelHead = iSFW->GetConcreteRelHead();
-
- const Rename_t theRename = sInverted(iSFW->GetRename());
-
- const set<string8>& names = theRelHead.GetElems();
-
- bool isFirst = true;
- for (set<string8>::const_iterator i = names.begin(); i != names.end(); ++i)
- {
- if (!isFirst)
- s << ",";
- isFirst = false;
-
- const string8& theName = *i;
- Rename_t::const_iterator alias = theRename.find(theName);
- if (alias != theRename.end())
- {
- s << " " << (*alias).second << " AS '" << theName << "'";
- }
- else
- {
- s << " " << theName << " AS '" << theName << "'";
-// s << " " << theName;
- }
- }
-
- s << " FROM";
-
- {
- bool isFirst = true;
- const vector<ZRef<Expr_Rel_Concrete> >& theRels = iSFW->GetRels();
- for (vector<ZRef<Expr_Rel_Concrete> >::const_iterator i = theRels.begin();
- i != theRels.end(); ++i)
- {
- if (!isFirst)
- s << ",";
- isFirst = false;
- s << " " << (*i)->GetName();
- }
- }
-
- s << " WHERE ";
- sAsSQL(iSFW->GetCondition(), s);
- s << ";";
- }
- }
-
-string8 sAsSQL(ZRef<Expr_Rel_SFW> iSFW)
- {
- string8 result;
- sAsSQL(iSFW, ZStrimW_String(result));
- return result;
- }
-
-void sAsSQL(ZRef<ZExpr_Bool> iExpr, const ZStrimW& s)
- {
- ToStrim_SQL().DoToStrim(ToStrim_SQL::Options(), s, iExpr);
- }
-
-string8 sAsSQL(ZRef<ZExpr_Bool> iExpr)
- {
- string8 result;
- sAsSQL(iExpr, ZStrimW_String(result));
- return result;
- }
-
-} // namespace SQL
-} // namespace ZRA
-} // namespace ZooLib
Deleted: trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_SQL.h
===================================================================
--- trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_SQL.h 2010-12-27 04:06:25 UTC (rev 1819)
+++ trunk/zoolib/source/cxx/more/zoolib/zra/ZRA_SQL.h 2010-12-27 04:07:15 UTC (rev 1820)
@@ -1,78 +0,0 @@
-/* -------------------------------------------------------------------------------------------------
-Copyright (c) 2010 Andrew Green
-http://www.zoolib.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-and associated documentation files (the "Software"), to deal in the Software without restriction,
-including without limitation the rights to use, copy, modify, merge, publish, distribute,
-sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES
-OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
-OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-------------------------------------------------------------------------------------------------- */
-
-#ifndef __ZRA_SQL__
-#define __ZRA_SQL__
-#include "zconfig.h"
-
-#include "zoolib/ZStrim.h"
-#include "zoolib/zra/ZRA_Expr_Rel_Concrete.h"
-
-#include <map>
-#include <vector>
-
-namespace ZooLib {
-namespace ZRA {
-namespace SQL {
-
-// =================================================================================================
-#pragma mark -
-#pragma mark * ZRA::SQL::Expr_Rel_SFW
-
-class Expr_Rel_SFW : public Expr_Rel_Concrete
- {
-public:
- Expr_Rel_SFW(const Rename_t& iRename,
- const RelHead& iRelHead,
- ZRef<ZExpr_Bool> iCondition,
- const std::vector<ZRef<Expr_Rel_Concrete> >& iRels);
-
-// From Expr_Rel_Concrete
- virtual RelHead GetConcreteRelHead();
-
-// Our protocol
- const Rename_t& GetRename();
- ZRef<ZExpr_Bool> GetCondition();
- const std::vector<ZRef<Expr_Rel_Concrete> >& GetRels();
-
-public:
- const Rename_t fRename;
- const RelHead fRelHead;
- const ZRef<ZExpr_Bool> fCondition;
- const std::vector<ZRef<Expr_Rel_Concrete> > fRels;
- };
-
-// =================================================================================================
-#pragma mark -
-#pragma mark * ZRA::SQL::sConvert
-
-ZRef<Expr_Rel_SFW> sConvert(ZRef<Expr_Rel> iExpr);
-
-void sAsSQL(ZRef<Expr_Rel_SFW> iSFW, const ZStrimW& s);
-string8 sAsSQL(ZRef<Expr_Rel_SFW> iSFW);
-
-void sAsSQL(ZRef<ZExpr_Bool> iExpr, const ZStrimW& s);
-string8 sAsSQL(ZRef<ZExpr_Bool> iExpr);
-
-} // namespace SQL
-} // namespace ZRA
-} // namespace ZooLib
-
-#endif // __ZRA_SQL__
Added: trunk/zoolib/source/cxx/zoolib/ZValPred_Rename_T.h
===================================================================
--- trunk/zoolib/source/cxx/zoolib/ZValPred_Rename_T.h (rev 0)
+++ trunk/zoolib/source/cxx/zoolib/ZValPred_Rename_T.h 2010-12-27 04:07:15 UTC (rev 1820)
@@ -0,0 +1,55 @@
+/* -------------------------------------------------------------------------------------------------
+Copyright (c) 2010 Andrew Green
+http://www.zoolib.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+and associated documentation files (the "Software"), to deal in the Software without restriction,
+including without limitation the rights to use, copy, modify, merge, publish, distribute,
+sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES
+OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+------------------------------------------------------------------------------------------------- */
+
+#ifndef __ZValPred_Rename_T__
+#define __ZValPred_Rename_T__ 1
+#include "zconfig.h"
+
+#include "zoolib/ZValPred_T.h"
+
+#include <map>
+
+namespace ZooLib {
+
+template <class Val>
+ZRef<ZValComparand_T<Val> > sRenamed(
+ const std::map<std::string,std::string>& iRename,
+ const ZRef<ZValComparand_T<Val> >& iVal)
+ {
+ // For some reason ZRef::DynamicCast isn't usable here.
+ if (ZRef<ZValComparand_Name_T<Val> > as = dynamic_cast<ZValComparand_Name_T<Val>*>(iVal.Get()))
+ return new ZValComparand_Name_T<Val>(iRename.find(as->GetName())->second);
+ return iVal;
+ }
+
+template <class Val>
+ZValPred_T<Val> sRenamed(
+ const std::map<std::string,std::string>& iRename,
+ const ZValPred_T<Val>& iValPred)
+ {
+ return ZValPred_T<Val>(
+ sRenamed(iRename, iValPred.GetLHS()),
+ iValPred.GetComparator(),
+ sRenamed(iRename, iValPred.GetRHS()));
+ }
+
+} // namespace ZooLib
+
+#endif // __ZValPred_Rename_T__
Modified: trunk/zoolib/source/cxx/zoolib/ZValPred_T.h
===================================================================
--- trunk/zoolib/source/cxx/zoolib/ZValPred_T.h 2010-12-27 04:06:25 UTC (rev 1819)
+++ trunk/zoolib/source/cxx/zoolib/ZValPred_T.h 2010-12-27 04:07:15 UTC (rev 1820)
@@ -27,15 +27,10 @@
#include "zoolib/ZCounted.h"
#include "zoolib/ZUtil_STL_set.h"
-#include <map>
#include <string>
namespace ZooLib {
-// There is an equivalent typedef in ZRA_RelHead, and it's possible that it
-// should be promoted to its own file, but for now that seems excessive.
-typedef std::map<std::string, std::string> Rename_t;
-
class ZValContext
{};
@@ -245,7 +240,6 @@
virtual Val GetVal(ZValContext& iContext, const Val& iVal) = 0;
virtual std::set<std::string> GetNames();
- virtual ZRef<ZValComparand_T> Renamed(const Rename_t& iRename);
int Compare(ZRef<ZValComparand_T> iOther);
@@ -268,10 +262,6 @@
{ return std::set<std::string>(); }
template <class Val>
-ZRef<ZValComparand_T<Val> > ZValComparand_T<Val>::Renamed(const Rename_t& iRename)
- { return this; }
-
-template <class Val>
int ZValComparand_T<Val>::Compare(ZRef<ZValComparand_T> iOther)
{
// An extant node is greater than an absent node.
@@ -383,7 +373,6 @@
// From ZValComparand_T
virtual Val GetVal(ZValContext& iContext, const Val& iVal);
virtual std::set<std::string> GetNames();
- virtual ZRef<ZValComparand_T<Val> > Renamed(const Rename_t& iRename);
virtual int pRevCompare(ZValComparand_T<Val>* iOther);
virtual int pCompare_Name(ZValComparand_Name_T<Val>* iOther);
@@ -413,15 +402,6 @@
{ return fName; }
template <class Val>
-ZRef<ZValComparand_T<Val> > ZValComparand_Name_T<Val>::Renamed(const Rename_t& iRename)
- {
- Rename_t::const_iterator i = iRename.find(fName);
- if (i != iRename.end())
- return new ZValComparand_Name_T(i->second);
- return this;
- }
-
-template <class Val>
int ZValComparand_Name_T<Val>::pRevCompare(ZValComparand_T<Val>* iOther)
{ return iOther->pCompare_Name(this); }
@@ -505,10 +485,6 @@
std::set<std::string> GetNames() const;
- bool Renamed(const Rename_t& iRename, ZValPred_T& oResult) const;
-
- ZValPred_T Renamed(const Rename_t& iRename) const;
-
private:
ZRef<Comparand> fLHS;
ZRef<Comparator> fComparator;
@@ -573,21 +549,6 @@
std::set<std::string> ZValPred_T<Val>::GetNames() const
{ return ZUtil_STL_set::sOr(fLHS->GetNames(), fRHS->GetNames()); }
-template <class Val>
-bool ZValPred_T<Val>::Renamed(const Rename_t& iRename, ZValPred_T& oResult) const
- {
- ZRef<ZValComparand_T<Val> > newLHS = fLHS->Renamed(iRename);
- ZRef<ZValComparand_T<Val> > newRHS = fRHS->Renamed(iRename);
- if (newLHS == fLHS && newRHS == fRHS)
- return false;
- oResult = ZValPred_T(newLHS, fComparator, newRHS);
- return true;
- }
-
-template <class Val>
-ZValPred_T<Val> ZValPred_T<Val>::Renamed(const Rename_t& iRename) const
- { return ZValPred_T(fLHS->Renamed(iRename), fComparator, fRHS->Renamed(iRename)); }
-
// =================================================================================================
#pragma mark -
#pragma mark * ZValComparandPseudo_T
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|