Example #1
0
static ZRef<ZTBQueryNode> sNodeFromTuple(const ZTuple& iTuple)
	{
	string nodeKind = iTuple.GetString("Kind");
	if (false)
		{}
	else if (nodeKind == "All")
		{
		return new ZTBQueryNode_All;
		}
	else if (nodeKind == "Combo")
		{
		vector<ZTBQuery::SortSpec> theSort;
		const vector<ZTupleValue>& vectorSort = iTuple.GetVector("Sort");
		for (vector<ZTupleValue>::const_iterator i = vectorSort.begin(); i != vectorSort.end(); ++i)
			{
			const ZTuple& temp = (*i).GetTuple();
			theSort.push_back(ZTBQuery::SortSpec(
				temp.GetString("PropName"), temp.GetBool("Ascending"), temp.GetInt32("Strength")));
			}

		const vector<ZTupleValue>& sourceSect = iTuple.GetVector("Intersections");
		vector<ZTBQueryNode_Combo::Intersection> theIntersections;
		for (vector<ZTupleValue>::const_iterator i = sourceSect.begin(); i != sourceSect.end(); ++i)
			theIntersections.push_back(ZTBQueryNode_Combo::Intersection((*i).GetTuple()));

		return new ZTBQueryNode_Combo(theSort, theIntersections);
		}
	else if (nodeKind == "Difference")
		{
		ZRef<ZTBQueryNode> leftNode = sNodeFromTuple(iTuple.GetTuple("LeftNode"));
		ZRef<ZTBQueryNode> rightNode = sNodeFromTuple(iTuple.GetTuple("RightNode"));
		return new ZTBQueryNode_Difference(leftNode, rightNode);
		}
	else if (nodeKind == "First")
		{
		string propName = iTuple.GetString("PropName");
		ZRef<ZTBQueryNode> sourceNode = sNodeFromTuple(iTuple.GetTuple("SourceNode"));
		return new ZTBQueryNode_First(propName, sourceNode);
		}
	else if (nodeKind == "ID_Constant")
		{
		vector<uint64> theIDs;
		iTuple.GetVector_T("IDs", back_inserter(theIDs), uint64());
		return new ZTBQueryNode_ID_Constant(theIDs, true);
		}
	else if (nodeKind == "ID_FromSource")
		{
		ZRef<ZTBQueryNode> sourceNode = sNodeFromTuple(iTuple.GetTuple("SourceNode"));
		string sourcePropName = iTuple.GetString("SourcePropName");
		return new ZTBQueryNode_ID_FromSource(sourceNode, sourcePropName);
		}
	else if (nodeKind == "Property")
		{
		string propName = iTuple.GetString("PropName");
		ZRef<ZTBQueryNode> sourceNode = sNodeFromTuple(iTuple.GetTuple("SourceNode"));
		return new ZTBQueryNode_Property(propName, sourceNode);
		}
	throw runtime_error(string("ZTBQuery, sNodeFromTuple, unknown nodeKind: " + nodeKind));
	}
Example #2
0
ZTBQueryNode_Combo::Intersection::Intersection(const ZTuple& iTuple)
	{
	fFilter = ZTBSpec(iTuple.GetTuple("Filter"));
	const vector<ZTupleValue>& nodes = iTuple.GetVector("Nodes");
	for (vector<ZTupleValue>::const_iterator i = nodes.begin(); i != nodes.end(); ++i)
		{
		if (ZRef<ZTBQueryNode> aNode = sNodeFromTuple((*i).GetTuple()))
			fNodes.push_back(aNode);
		}
	}
Example #3
0
static bool sGetStringAt(const ZTuple& iTuple, const string& iName, string& oString)
	{
	if (iTuple.GetString(iName, oString))
		return true;

	const vector<ZTupleValue>& theVector = iTuple.GetVector(iName);
	if (!theVector.empty())
		return theVector[0].GetString(oString);

	return false;
	}
Example #4
0
static void sCriterionUnionFromTuple(
	const ZTuple& iTuple, ZTBSpec::CriterionUnion& ioCriterionUnion)
	{
	const vector<ZTupleValue>& outerVector = iTuple.GetVector("Criteria");

	ioCriterionUnion.resize(outerVector.size());
	ZTBSpec::CriterionUnion::iterator critListIter = ioCriterionUnion.begin();

	for (vector<ZTupleValue>::const_iterator outerIter = outerVector.begin();
		outerIter != outerVector.end(); ++outerIter, ++critListIter)
		{
		const vector<ZTupleValue>& innerVector = (*outerIter).GetVector();
		for (vector<ZTupleValue>::const_iterator inner = innerVector.begin();
			inner != innerVector.end(); ++inner)
			{
			(*critListIter).push_back(ZTBSpec::Criterion((*inner).GetTuple()));
			}
		}
	}
Example #5
0
bool ZTBSpec::Criterion::Matches(const ZTuple& iTuple) const
	{
	ZTuple::const_iterator propIter = iTuple.IteratorOf(this->GetPropName());
	if (propIter == iTuple.end())
		{
		// iTuple does not have a property named fPropName. For
		// 'Lacks' and 'LacksOfType' relationships that means
		// we match iTuple, for all other relationships we don't.
		return this->GetComparator().fRel == eRel_Lacks
			|| this->GetComparator().fRel == eRel_LacksOfType;
		}

	switch (this->GetComparator().fRel)
		{
		case eRel_Has:
			{
			return true;
			}
		case eRel_HasOfType:
			{
			return iTuple.TypeOf(propIter) == this->GetTupleValue().GetType();
			}
		case eRel_Lacks:
			{
			// iTuple has a property named fPropName,
			// so it doesn't lack a property named fPropName.
			return false;
			}
		case eRel_LacksOfType:
			{
			return iTuple.TypeOf(propIter) != this->GetTupleValue().GetType();			
			}
		case eRel_VectorContains:
			{
			if (iTuple.TypeOf(propIter) != eZType_Vector)
				return false;

			const vector<ZTupleValue>& theVector = iTuple.GetVector(propIter);
			for (vector<ZTupleValue>::const_iterator i = theVector.begin();
				i != theVector.end(); ++i)
				{
				if (*i == this->GetTupleValue())
					return true;
#if 0 //##
				if ((*i).TypeOf() == this->GetTupleValue().TypeOf())
					{
					if ((*i).UncheckedEqual(this->GetTupleValue()))
						return true;
					}
#endif
				}
			return false;			
			}
		case eRel_StringContains:
			{
			string pattern;
			if (!this->GetTupleValue().GetString(pattern) || pattern.empty())
				return true;

			string target;
			if (!iTuple.GetString(propIter, target) || target.empty())
				return false;

			if (!fRep->fTextCollator)
				{
				fRep->fTextCollator =
					ZTextCollator(this->GetComparator().fStrength);
				}

			return fRep->fTextCollator.Contains(pattern, target);
			}
		case eRel_Regex:
			{
			#if ZCONFIG_API_Enabled(Regex)
				string target;
				if (!iTuple.GetString(propIter, target) || target.empty())
					return false;

				if (!fRep->fRegex)
					{
					fRep->fRegex =
						ZRegex(this->GetTupleValue().GetString(), this->GetComparator().fStrength);
					}

				if (!fRep->fRegex)
					return false;

				return fRep->fRegex.Matches(target);
			#else
				return false;
			#endif
			}
		default:
			{
			const ZTupleValue& leftValue = iTuple.GetValue(propIter);
			ZType leftType = leftValue.TypeOf();
			ZType rightType = this->GetTupleValue().TypeOf();
			if (this->GetComparator().fRel == eRel_Equal)
				{
				if (leftType != rightType)
					{
					return false;
					}
				else
					{
					if (leftType == eZType_String && this->GetComparator().fStrength != 0)
						{
						// We're doing string compares where the strength is non zero and
						// so we need to use a collator to do the comparison.
						if (!fRep->fTextCollator)
							{
							fRep->fTextCollator =
								ZTextCollator(this->GetComparator().fStrength);
							}

						return fRep->fTextCollator.Equals(
							leftValue.GetString(), this->GetTupleValue().GetString());
						}
					else
						{
						// The type matches, so do the appropriate comparison.
						// return leftValue.pUncheckedEqual(this->GetTupleValue());
						return leftValue == this->GetTupleValue();
						}
					}
				}
			else
				{
				int compare;
				if (leftType != rightType)
					{
					compare = int(leftType) - int(rightType);
					}
				else
					{
					if (leftType == eZType_String && this->GetComparator().fStrength != 0)
						{
						// We're doing string compares where the strength is non zero and
						// so we need to use a collator to do the comparison.
						if (!fRep->fTextCollator)
							{
							fRep->fTextCollator =
								ZTextCollator(this->GetComparator().fStrength);
							}

						compare = fRep->fTextCollator.Compare(
							leftValue.GetString(), this->GetTupleValue().GetString());
						}
					else
						{
						// The type matches, so do the appropriate comparison.
						// compare = leftValue.pUncheckedCompare(this->GetTupleValue());
						compare = leftValue.Compare(this->GetTupleValue());
						}
					}
				switch (this->GetComparator().fRel)
					{
					case eRel_Less: return compare < 0;
					case eRel_LessEqual: return compare <= 0;
					case eRel_GreaterEqual: return compare >= 0;
					case eRel_Greater: return compare > 0;
					}
				}
			}
		}
	// Can't get here.
	ZUnimplemented();
	return false;
	}