Beispiel #1
0
		internal QCandidates(LocalTransaction a_trans, ClassMetadata a_classMetadata, QField
			 a_field)
		{
			// Transaction necessary as reference to stream
			// root of the QCandidate tree
			// collection of all constraints
			// possible class information
			// possible field information
			// current executing constraint, only set where needed
			i_trans = a_trans;
			i_classMetadata = a_classMetadata;
			_field = a_field;
			if (a_field == null || a_field._fieldMetadata == null || !(a_field._fieldMetadata
				.GetHandler() is StandardReferenceTypeHandler))
			{
				return;
			}
			ClassMetadata yc = ((StandardReferenceTypeHandler)a_field._fieldMetadata.GetHandler
				()).ClassMetadata();
			if (i_classMetadata == null)
			{
				i_classMetadata = yc;
			}
			else
			{
				yc = i_classMetadata.GetHigherOrCommonHierarchy(yc);
				if (yc != null)
				{
					i_classMetadata = yc;
				}
			}
		}
Beispiel #2
0
		internal QConClass(Transaction trans, QCon parent, QField field, IReflectClass claxx
			) : base(trans, parent, field, null)
		{
			// C/S
			if (claxx != null)
			{
				ObjectContainerBase container = trans.Container();
				_classMetadata = container.ClassMetadataForReflectClass(claxx);
				if (_classMetadata == null)
				{
					// could be an aliased class, try to resolve.
					string className = claxx.GetName();
					string aliasRunTimeName = container.Config().ResolveAliasStoredName(className);
					if (!className.Equals(aliasRunTimeName))
					{
						_classMetadata = container.ClassMetadataForName(aliasRunTimeName);
					}
				}
				if (claxx.Equals(container._handlers.IclassObject))
				{
					_classMetadata = (ClassMetadata)_classMetadata.TypeHandler();
				}
			}
			_claxx = claxx;
		}
Beispiel #3
0
		internal QCandidates(LocalTransaction a_trans, ClassMetadata a_classMetadata, QField
			 a_field, bool isTopLevel)
		{
			// Transaction necessary as reference to stream
			// collection of all constraints
			// possible class information
			// possible field information
			// current executing constraint, only set where needed
			_result = new QueryResultCandidates(this);
			_isTopLevel = isTopLevel;
			i_trans = a_trans;
			_classMetadata = a_classMetadata;
			_field = a_field;
			if (a_field == null || a_field._fieldMetadata == null || !(a_field._fieldMetadata
				.GetHandler() is StandardReferenceTypeHandler))
			{
				return;
			}
			ClassMetadata yc = ((StandardReferenceTypeHandler)a_field._fieldMetadata.GetHandler
				()).ClassMetadata();
			if (_classMetadata == null)
			{
				_classMetadata = yc;
			}
			else
			{
				yc = _classMetadata.GetHigherOrCommonHierarchy(yc);
				if (yc != null)
				{
					_classMetadata = yc;
				}
			}
		}
Beispiel #4
0
		internal QConPath(Transaction a_trans, QCon a_parent, QField a_field) : base(a_trans
			, a_parent, a_field, null)
		{
			if (a_field != null)
			{
				_classMetadata = a_field.GetFieldType();
			}
		}
		internal QConClass(Transaction a_trans, QCon a_parent, QField a_field, IReflectClass
			 claxx) : base(a_trans, a_parent, a_field, null)
		{
			// C/S
			if (claxx != null)
			{
				_classMetadata = a_trans.Container().ProduceClassMetadata(claxx);
				if (claxx.Equals(a_trans.Container()._handlers.IclassObject))
				{
					_classMetadata = (ClassMetadata)_classMetadata.TypeHandler();
				}
			}
			_claxx = claxx;
		}
Beispiel #6
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 #7
0
        //    public void visit(Object a_tree) {
        //      final QCandidate parent = (QCandidate) a_tree;
        //      if (parent.createChild(this)) {
        //          return;
        //      }
        //
        //      // No object found.
        //      // All children constraints are necessarily false.
        //      // Check immediately.
        //		Iterator4 i = iterateConstraints();
        //		while(i.moveNext()){
        //			((QCon)i.current()).visitOnNull(parent.getRoot());
        //		}
        //
        //    }
        public void Filter(QField field, IParentCandidate parent)
        {
            if (parent.CreateChild(field, this))
            {
                return;
            }
            // No object found.
            // All children constraints are necessarily false.
            // Check immediately.
            IEnumerator i = IterateConstraints();

            while (i.MoveNext())
            {
                ((QCon)i.Current).VisitOnNull(parent.GetRoot());
            }
        }
Beispiel #8
0
 public QConObject(Transaction a_trans, QCon a_parent, QField a_field, object a_object
                   ) : base(a_trans)
 {
     // the constraining object
     // cache for the db4o object ID
     // the YapClass
     // needed for marshalling the request
     // C/S only
     i_parent = a_parent;
     if (a_object is ICompare)
     {
         a_object = ((ICompare)a_object).Compare();
     }
     i_object = a_object;
     i_field  = a_field;
 }
Beispiel #9
0
		public QConObject(Transaction a_trans, QCon a_parent, QField a_field, object a_object
			) : base(a_trans)
		{
			// the constraining object
			// cache for the db4o object ID
			// the YapClass
			// needed for marshalling the request
			// C/S only
			i_parent = a_parent;
			if (a_object is ICompare)
			{
				a_object = ((ICompare)a_object).Compare();
			}
			i_object = a_object;
			i_field = a_field;
		}
Beispiel #10
0
        private FieldMetadata FieldMetadataFrom(QField qField, ClassMetadata
                                                type)
        {
            var existingField = qField.GetFieldMetadata();

            if (existingField != null)
            {
                return(existingField);
            }
            var field = type.FieldMetadataForName(qField.Name());

            if (field != null)
            {
                field.Alive();
            }
            return(field);
        }
Beispiel #11
0
        private FieldMetadata FieldMetadataFrom(QField qField, Db4objects.Db4o.Internal.ClassMetadata
                                                type)
        {
            FieldMetadata existingField = qField.GetFieldMetadata();

            if (existingField != null)
            {
                return(existingField);
            }
            FieldMetadata field = type.FieldMetadataForName(qField.Name());

            if (field != null)
            {
                field.Alive();
            }
            return(field);
        }
Beispiel #12
0
        public virtual void Filter(QField field, IParentCandidate candidate)
        {
            candidate.UseField(field);
            bool res       = true;
            bool processed = false;

            if (_checkClassMetadataOnly)
            {
                ClassMetadata classMetadata = candidate.ClassMetadata();
                if (classMetadata != null)
                {
                    res = i_evaluator.Not(_classMetadata.GetHigherHierarchy(classMetadata) == _classMetadata
                                          );
                    processed = true;
                }
            }
            if (!processed)
            {
                res = Evaluate(candidate);
            }
            Visit1(candidate.GetRoot(), this, res);
        }
Beispiel #13
0
        internal virtual void UseField(QField a_field)
        {
            Read();
            if (_bytes == null)
            {
                _fieldMetadata = null;
                return;
            }
            ReadClassMetadata();
            _member = null;
            if (a_field == null)
            {
                _fieldMetadata = null;
                return;
            }
            if (_classMetadata == null)
            {
                _fieldMetadata = null;
                return;
            }
            _fieldMetadata = FieldMetadataFrom(a_field, _classMetadata);
            if (_fieldMetadata == null)
            {
                FieldNotFound();
                return;
            }
            HandlerVersion handlerVersion = _classMetadata.SeekToField(Transaction(), _bytes,
                                                                       _fieldMetadata);

            if (handlerVersion == HandlerVersion.Invalid)
            {
                FieldNotFound();
                return;
            }
            _handlerVersion = handlerVersion._number;
        }
Beispiel #14
0
		internal bool Filter(QField field, IFieldFilterable filterable)
		{
			return _result.Filter(field, filterable);
		}
Beispiel #15
0
 private FieldMetadata FieldMetadataFrom(QField qField, ClassMetadata
     type)
 {
     var existingField = qField.GetFieldMetadata();
     if (existingField != null)
     {
         return existingField;
     }
     var field = type.FieldMetadataForName(qField.Name());
     if (field != null)
     {
         field.Alive();
     }
     return field;
 }
Beispiel #16
0
 internal virtual void UseField(QField a_field)
 {
     Read();
     if (_bytes == null)
     {
         _fieldMetadata = null;
         return;
     }
     ReadClassMetadata();
     _member = null;
     if (a_field == null)
     {
         _fieldMetadata = null;
         return;
     }
     if (_classMetadata == null)
     {
         _fieldMetadata = null;
         return;
     }
     _fieldMetadata = FieldMetadataFrom(a_field, _classMetadata);
     if (_fieldMetadata == null)
     {
         FieldNotFound();
         return;
     }
     var handlerVersion = _classMetadata.SeekToField(Transaction(), _bytes,
         _fieldMetadata);
     if (handlerVersion == HandlerVersion.Invalid)
     {
         FieldNotFound();
         return;
     }
     _handlerVersion = handlerVersion._number;
 }
Beispiel #17
0
 public _IVisitor4_68(IFieldFilterable filterable, QField field)
 {
     this.filterable = filterable;
     this.field      = field;
 }
Beispiel #18
0
        internal QCandidates(LocalTransaction a_trans, ClassMetadata a_classMetadata, QField
                             a_field)
        {
            // Transaction necessary as reference to stream
            // root of the QCandidate tree
            // collection of all constraints
            // possible class information
            // possible field information
            // current executing constraint, only set where needed
            i_trans         = a_trans;
            i_classMetadata = a_classMetadata;
            _field          = a_field;
            if (a_field == null || a_field._fieldMetadata == null || !(a_field._fieldMetadata
                                                                       .GetHandler() is StandardReferenceTypeHandler))
            {
                return;
            }
            ClassMetadata yc = ((StandardReferenceTypeHandler)a_field._fieldMetadata.GetHandler
                                    ()).ClassMetadata();

            if (i_classMetadata == null)
            {
                i_classMetadata = yc;
            }
            else
            {
                yc = i_classMetadata.GetHigherOrCommonHierarchy(yc);
                if (yc != null)
                {
                    i_classMetadata = yc;
                }
            }
        }
Beispiel #19
0
		internal virtual void PrepareComparison(QField a_field)
		{
			if (IsNullConstraint() & !a_field.IsArray())
			{
				_preparedComparison = Null.Instance;
			}
			else
			{
				_preparedComparison = a_field.PrepareComparison(Context(), i_object);
			}
		}
Beispiel #20
0
			public _IVisitor4_68(IFieldFilterable filterable, QField field)
			{
				this.filterable = filterable;
				this.field = field;
			}
Beispiel #21
0
 internal virtual QCon AddSharedConstraint
     (QField a_field, object a_object)
 {
     var newConstraint = new QConObject(i_trans, this, a_field, a_object);
     AddConstraint(newConstraint);
     return newConstraint;
 }
Beispiel #22
0
		internal virtual bool Filter(QField field, IFieldFilterable filterable)
		{
			ToQCandidates();
			if (_candidates != null)
			{
				_candidates.Traverse(new _IVisitor4_68(filterable, field));
				_candidates = (QCandidateBase)_candidates.Filter(new _IPredicate4_73());
			}
			return _candidates != null;
		}
Beispiel #23
0
 internal bool Filter(QField field, IFieldFilterable filterable)
 {
     return(_result.Filter(field, filterable));
 }
Beispiel #24
0
        internal QCandidates(LocalTransaction a_trans, ClassMetadata a_classMetadata, QField
                             a_field, bool isTopLevel)
        {
            // Transaction necessary as reference to stream
            // collection of all constraints
            // possible class information
            // possible field information
            // current executing constraint, only set where needed
            _result        = new QueryResultCandidates(this);
            _isTopLevel    = isTopLevel;
            i_trans        = a_trans;
            _classMetadata = a_classMetadata;
            _field         = a_field;
            if (a_field == null || a_field._fieldMetadata == null || !(a_field._fieldMetadata
                                                                       .GetHandler() is StandardReferenceTypeHandler))
            {
                return;
            }
            ClassMetadata yc = ((StandardReferenceTypeHandler)a_field._fieldMetadata.GetHandler
                                    ()).ClassMetadata();

            if (_classMetadata == null)
            {
                _classMetadata = yc;
            }
            else
            {
                yc = _classMetadata.GetHigherOrCommonHierarchy(yc);
                if (yc != null)
                {
                    _classMetadata = yc;
                }
            }
        }
Beispiel #25
0
		internal virtual bool Attach(QQuery query, string a_field)
		{
			Db4objects.Db4o.Internal.Query.Processor.QCon qcon = this;
			ClassMetadata yc = GetYapClass();
			bool[] foundField = new bool[] { false };
			ForEachChildField(a_field, new _IVisitor4_101(foundField, query));
			if (foundField[0])
			{
				return true;
			}
			QField qf = null;
			if (yc == null || yc.HoldsAnyClass())
			{
				int[] count = new int[] { 0 };
				FieldMetadata[] yfs = new FieldMetadata[] { null };
				i_trans.Container().ClassCollection().AttachQueryNode(a_field, new _IVisitor4_119
					(yfs, count));
				if (count[0] == 0)
				{
					return false;
				}
				if (count[0] == 1)
				{
					qf = yfs[0].QField(i_trans);
				}
				else
				{
					qf = new QField(i_trans, a_field, null, 0, 0);
				}
			}
			else
			{
				if (yc.IsTranslated())
				{
					i_trans.Container()._handlers.DiagnosticProcessor().DescendIntoTranslator(yc, a_field
						);
				}
				FieldMetadata yf = yc.FieldMetadataForName(a_field);
				if (yf != null)
				{
					qf = yf.QField(i_trans);
				}
				if (qf == null)
				{
					qf = new QField(i_trans, a_field, null, 0, 0);
				}
			}
			QConPath qcp = new QConPath(i_trans, qcon, qf);
			query.AddConstraint(qcp);
			qcon.AddConstraint(qcp);
			return true;
		}
Beispiel #26
0
		//    public void visit(Object a_tree) {
		//    	final QCandidate parent = (QCandidate) a_tree;
		//    	if (parent.createChild(this)) {
		//    		return;
		//    	}
		//    	
		//    	// No object found.
		//    	// All children constraints are necessarily false.
		//    	// Check immediately.
		//		Iterator4 i = iterateConstraints();
		//		while(i.moveNext()){
		//			((QCon)i.current()).visitOnNull(parent.getRoot());
		//		}
		//    		
		//    }
		public void Filter(QField field, IParentCandidate parent)
		{
			if (parent.CreateChild(field, this))
			{
				return;
			}
			// No object found.
			// All children constraints are necessarily false.
			// Check immediately.
			IEnumerator i = IterateConstraints();
			while (i.MoveNext())
			{
				((QCon)i.Current).VisitOnNull(parent.GetRoot());
			}
		}
Beispiel #27
0
		internal virtual Db4objects.Db4o.Internal.Query.Processor.QCon AddSharedConstraint
			(QField a_field, object a_object)
		{
			QConObject newConstraint = new QConObject(i_trans, this, a_field, a_object);
			AddConstraint(newConstraint);
			return newConstraint;
		}
Beispiel #28
0
 internal virtual bool CreateChild(QCandidates a_candidates)
 {
     if (!_include)
     {
         return(false);
     }
     if (_fieldMetadata != null)
     {
         ITypeHandler4 handler = _fieldMetadata.GetHandler();
         if (handler != null)
         {
             QueryingReadContext queryingReadContext = new QueryingReadContext(Transaction(),
                                                                               MarshallerFamily().HandlerVersion(), _bytes, _key);
             ITypeHandler4 arrayElementHandler = Handlers4.ArrayElementHandler(handler, queryingReadContext
                                                                               );
             if (arrayElementHandler != null)
             {
                 int  offset   = queryingReadContext.Offset();
                 bool outerRes = true;
                 // The following construct is worse than not ideal.
                 // For each constraint it completely reads the
                 // underlying structure again. The structure could b
                 // kept fairly easy. TODO: Optimize!
                 IEnumerator i = a_candidates.IterateConstraints();
                 while (i.MoveNext())
                 {
                     QCon   qcon = (QCon)i.Current;
                     QField qf   = qcon.GetField();
                     if (qf == null || qf.Name().Equals(_fieldMetadata.GetName()))
                     {
                         QCon tempParent = qcon.Parent();
                         qcon.SetParent(null);
                         QCandidates candidates = new QCandidates(a_candidates.i_trans, null, qf);
                         candidates.AddConstraint(qcon);
                         qcon.SetCandidates(candidates);
                         ReadArrayCandidates(handler, queryingReadContext.Buffer(), arrayElementHandler, candidates
                                             );
                         queryingReadContext.Seek(offset);
                         bool isNot = qcon.IsNot();
                         if (isNot)
                         {
                             qcon.RemoveNot();
                         }
                         candidates.Evaluate();
                         ByRef  pending  = ByRef.NewInstance();
                         bool[] innerRes = new bool[] { isNot };
                         candidates.Traverse(new _IVisitor4_160(innerRes, isNot, pending));
                         // Collect all pending subresults.
                         // We need to change
                         // the
                         // constraint here, so
                         // our
                         // pending collector
                         // uses
                         // the right
                         // comparator.
                         // We only keep one
                         // pending result
                         // for
                         // all array
                         // elements.
                         // and memorize,
                         // whether we had a
                         // true or a false
                         // result.
                         // or both.
                         if (isNot)
                         {
                             qcon.Not();
                         }
                         // In case we had pending subresults, we
                         // need to communicate
                         // them up to our root.
                         if (((Tree)pending.value) != null)
                         {
                             ((Tree)pending.value).Traverse(new _IVisitor4_229(this));
                         }
                         if (!innerRes[0])
                         {
                             // Again this could be double triggering.
                             //
                             // We want to clean up the "No route"
                             // at some stage.
                             qcon.Visit(GetRoot(), qcon.Evaluator().Not(false));
                             outerRes = false;
                         }
                         qcon.SetParent(tempParent);
                     }
                 }
                 return(outerRes);
             }
             // We may get simple types here too, if the YapField was null
             // in the higher level simple evaluation. Evaluate these
             // immediately.
             if (Handlers4.IsQueryLeaf(handler))
             {
                 a_candidates.i_currentConstraint.Visit(this);
                 return(true);
             }
         }
     }
     if (_fieldMetadata == null)
     {
         return(false);
     }
     if (_fieldMetadata is NullFieldMetadata)
     {
         return(false);
     }
     _classMetadata.SeekToField(Transaction(), _bytes, _fieldMetadata);
     Db4objects.Db4o.Internal.Query.Processor.QCandidate candidate = ReadSubCandidate(
         a_candidates);
     if (candidate == null)
     {
         return(false);
     }
     // fast early check for ClassMetadata
     if (a_candidates.i_classMetadata != null && a_candidates.i_classMetadata.IsStronglyTyped
             ())
     {
         ITypeHandler4 handler = _fieldMetadata.GetHandler();
         if (Handlers4.IsUntyped(handler))
         {
             handler = TypeHandlerFor(candidate);
         }
         if (handler == null)
         {
             return(false);
         }
     }
     AddDependant(a_candidates.Add(candidate));
     return(true);
 }
Beispiel #29
0
		public virtual void Filter(QField field, IParentCandidate candidate)
		{
			candidate.UseField(field);
			bool res = true;
			bool processed = false;
			if (_checkClassMetadataOnly)
			{
				ClassMetadata classMetadata = candidate.ClassMetadata();
				if (classMetadata != null)
				{
					res = i_evaluator.Not(_classMetadata.GetHigherHierarchy(classMetadata) == _classMetadata
						);
					processed = true;
				}
			}
			if (!processed)
			{
				res = Evaluate(candidate);
			}
			Visit1(candidate.GetRoot(), this, res);
		}
Beispiel #30
0
		private FieldMetadata FieldMetadataFrom(QField qField, Db4objects.Db4o.Internal.ClassMetadata
			 type)
		{
			FieldMetadata existingField = qField.GetFieldMetadata();
			if (existingField != null)
			{
				return existingField;
			}
			FieldMetadata field = type.FieldMetadataForName(qField.Name());
			if (field != null)
			{
				field.Alive();
			}
			return field;
		}