Beispiel #1
0
        // Our QConPath objects are just placeholders to fields,
        // so the parents are reachable.
        // If we find a "real" constraint, we throw the QPath
        // out and replace it with the other constraint.
        private void Morph(BooleanByRef removeExisting, QCon newConstraint, IReflectClass
                           claxx)
        {
            bool mayMorph = true;

            if (claxx != null)
            {
                ClassMetadata yc = i_trans.Container().ProduceClassMetadata(claxx);
                if (yc != null)
                {
                    IEnumerator i = IterateChildren();
                    while (i.MoveNext())
                    {
                        QField qf = ((QCon)i.Current).GetField();
                        if (!yc.HasField(i_trans.Container(), qf.Name()))
                        {
                            mayMorph = false;
                            break;
                        }
                    }
                }
            }
            // }
            if (mayMorph)
            {
                IEnumerator j = IterateChildren();
                while (j.MoveNext())
                {
                    newConstraint.AddConstraint((QCon)j.Current);
                }
                if (HasJoins())
                {
                    IEnumerator k = IterateJoins();
                    while (k.MoveNext())
                    {
                        QConJoin qcj = (QConJoin)k.Current;
                        qcj.ExchangeConstraint(this, newConstraint);
                        newConstraint.AddJoin(qcj);
                    }
                }
                i_parent.ExchangeConstraint(this, newConstraint);
                removeExisting.value = true;
            }
            else
            {
                i_parent.AddConstraint(newConstraint);
            }
        }
Beispiel #2
0
        internal virtual IConstraint Join1(Db4objects.Db4o.Internal.Query.Processor.QCon
                                           a_with, bool a_and)
        {
            if (a_with is QConstraints)
            {
                int           j           = 0;
                Collection4   joinHooks   = new Collection4();
                IConstraint[] constraints = ((QConstraints)a_with).ToArray();
                for (j = 0; j < constraints.Length; j++)
                {
                    joinHooks.Ensure(((Db4objects.Db4o.Internal.Query.Processor.QCon)constraints[j]).
                                     JoinHook());
                }
                IConstraint[] joins = new IConstraint[joinHooks.Size()];
                j = 0;
                IEnumerator i = joinHooks.GetEnumerator();
                while (i.MoveNext())
                {
                    joins[j++] = Join((IConstraint)i.Current, a_and);
                }
                return(new QConstraints(i_trans, joins));
            }
            Db4objects.Db4o.Internal.Query.Processor.QCon myHook    = JoinHook();
            Db4objects.Db4o.Internal.Query.Processor.QCon otherHook = a_with.JoinHook();
            if (myHook == otherHook)
            {
                // You might like to check out, what happens, if you
                // remove this line. It seems to open a bug in an
                // StOr testcase.
                return(myHook);
            }
            QConJoin cj = new QConJoin(i_trans, myHook, otherHook, a_and);

            myHook.AddJoin(cj);
            otherHook.AddJoin(cj);
            return(cj);
        }
Beispiel #3
0
		// Our QConPath objects are just placeholders to fields,
		// so the parents are reachable.
		// If we find a "real" constraint, we throw the QPath
		// out and replace it with the other constraint. 
		private void Morph(BooleanByRef removeExisting, QCon newConstraint, IReflectClass
			 claxx)
		{
			bool mayMorph = true;
			if (claxx != null)
			{
				ClassMetadata yc = i_trans.Container().ProduceClassMetadata(claxx);
				if (yc != null)
				{
					IEnumerator i = IterateChildren();
					while (i.MoveNext())
					{
						QField qf = ((QCon)i.Current).GetField();
						if (!yc.HasField(i_trans.Container(), qf.Name()))
						{
							mayMorph = false;
							break;
						}
					}
				}
			}
			// }
			if (mayMorph)
			{
				IEnumerator j = IterateChildren();
				while (j.MoveNext())
				{
					newConstraint.AddConstraint((QCon)j.Current);
				}
				if (HasJoins())
				{
					IEnumerator k = IterateJoins();
					while (k.MoveNext())
					{
						QConJoin qcj = (QConJoin)k.Current;
						qcj.ExchangeConstraint(this, newConstraint);
						newConstraint.AddJoin(qcj);
					}
				}
				i_parent.ExchangeConstraint(this, newConstraint);
				removeExisting.value = true;
			}
			else
			{
				i_parent.AddConstraint(newConstraint);
			}
		}