Beispiel #1
0
        private IQuery ProcessAxis(Axis root, IQuery qyInput, int parent, Axis.AxisType parentaxis)
        {
            IQuery result = null;
            String URN    = String.Empty;

            if (root.Prefix.Length > 0)
            {
                _hasPrefix = true;
            }
            hasReverseAxis = false;
            switch (root.TypeOfAxis)
            {
            case Axis.AxisType.Ancestor:
                result       = new XPathAncestorQuery(qyInput, false, root.Name, root.Prefix, URN, root.Type);
                _specialAxis = hasReverseAxis = true;
                break;

            case Axis.AxisType.AncestorOrSelf:
                result       = new XPathAncestorQuery(qyInput, true, root.Name, root.Prefix, URN, root.Type);
                _specialAxis = hasReverseAxis = true;
                break;

            case Axis.AxisType.Child:
                if (_slashslash)
                {
                    result = new XPathDescendantQuery(qyInput, false, root.Name, root.Prefix, URN, root.Type, abbrAxis);
                    if (_specialAxis || (qyInput != null && (int)qyInput.getName() > (int)Querytype.Self))
                    {
                        result = new CacheQuery(result);
                    }
                    _slashslash  = false;
                    _specialAxis = true;
                    break;
                }
                if (_specialAxis || (qyInput != null && (int)qyInput.getName() > (int)Querytype.Self))
                {
                    result = new CacheChildrenQuery(qyInput, root.Name, root.Prefix, URN, root.Type);
                }
                else
                {
                    result = new ChildrenQuery(qyInput, root.Name, root.Prefix, URN, root.Type);
                }
                break;

            case Axis.AxisType.Parent:
                result = new ParentQuery(qyInput, root.Name, root.Prefix, URN, root.Type);
                break;

            case Axis.AxisType.Descendant:
                switch (parent)
                {
                case Smart_D:
                    result = new SmartXPathDescendantQuery(qyInput, false, root.Name, root.Prefix, URN, root.Type);
                    break;

                case Regular_D:
                    result = new XPathDescendantQuery(qyInput, false, root.Name, root.Prefix, URN, root.Type);
                    if (_specialAxis || (qyInput != null && (int)qyInput.getName() > (int)Querytype.Self))
                    {
                        result = new CacheQuery(result);
                    }
                    _specialAxis = true;
                    break;
                }
                break;

            case Axis.AxisType.DescendantOrSelf:
                switch (parent)
                {
                case Smart_D:
                    result = new SmartXPathDescendantQuery(qyInput, true, root.Name, root.Prefix, URN, root.Type, root.abbrAxis);
                    break;

                case Regular_D:
                    if (_smart <= 1 || root.Type != XPathNodeType.All ||
                        parentaxis != Axis.AxisType.Child)
                    {
                        result = new XPathDescendantQuery(
                            qyInput,
                            true,
                            root.Name,
                            root.Prefix,
                            URN,
                            root.Type,
                            root.abbrAxis);
                        if (_specialAxis || (qyInput != null && (int)qyInput.getName() > (int)Querytype.Self))
                        {
                            result = new CacheQuery(result);
                        }
                        _specialAxis = true;
                    }
                    else
                    {
                        _slashslash = true;
                        abbrAxis    = root.abbrAxis;
                        result      = qyInput;
                    }
                    break;
                }
                break;

            case Axis.AxisType.Preceding:
                result = new PrecedingQuery(
                    qyInput,
                    root.Name,
                    root.Prefix,
                    URN,
                    root.Type);
                _specialAxis = hasReverseAxis = true;
                break;

            case Axis.AxisType.Following:
                result = new FollowingQuery(
                    qyInput,
                    root.Name,
                    root.Prefix,
                    URN,
                    root.Type);
                _specialAxis = true;
                break;

            case Axis.AxisType.FollowingSibling:
                result = new FollSiblingQuery(
                    qyInput,
                    root.Name,
                    root.Prefix,
                    URN,
                    root.Type);
                if (_specialAxis || (qyInput != null && (int)qyInput.getName() > (int)Querytype.Self))
                {
                    result = new DocumentOrderQuery(result);
                }
                break;

            case Axis.AxisType.PrecedingSibling:
                result = new PreSiblingQuery(
                    qyInput,
                    root.Name,
                    root.Prefix,
                    URN,
                    root.Type);
                hasReverseAxis = true;
                break;

            case Axis.AxisType.Attribute:
                result = new AttributeQuery(
                    qyInput,
                    root.Name,
                    root.Prefix,
                    URN,
                    root.Type);
                break;

            case Axis.AxisType.Self:
                result = new XPathSelfQuery(
                    qyInput,
                    root.Name,
                    root.Prefix,
                    URN,
                    root.Type);
                break;

            case Axis.AxisType.Namespace:
                if (
                    (root.Type == XPathNodeType.All || root.Type == XPathNodeType.Element || root.Type == XPathNodeType.Attribute) &&
                    root.Prefix == string.Empty
                    )
                {
                    result = new NamespaceQuery(qyInput, root.Name, root.Prefix, URN, root.Type);
                }
                else
                {
                    result = new EmptyNamespaceQuery();
                }
                break;

            default:
                throw new XPathException(Res.Xp_NotSupported, _query);
            }
            return(result);
        }
Beispiel #2
0
        private IQuery ProcessAxis(Axis root , IQuery qyInput, int parent,  Axis.AxisType parentaxis) {
            IQuery result = null;
            String URN = String.Empty;
            if ( root.Prefix.Length > 0) {
                _hasPrefix = true;
            }
            hasReverseAxis = false;
            switch (root.TypeOfAxis) {
            case Axis.AxisType.Ancestor:
                result = new XPathAncestorQuery( qyInput , false, root.Name, root.Prefix, URN, root.Type );
                _specialAxis = hasReverseAxis = true;
                break;
            case Axis.AxisType.AncestorOrSelf:
                result = new XPathAncestorQuery( qyInput, true, root.Name, root.Prefix, URN, root.Type );
                _specialAxis = hasReverseAxis = true;
                break;
            case Axis.AxisType.Child:
                if (_slashslash){
                    result = new XPathDescendantQuery( qyInput, false, root.Name, root.Prefix, URN, root.Type, abbrAxis); 
                   if (_specialAxis || (qyInput != null && (int)qyInput.getName() > (int) Querytype.Self)) {
                        result =  new CacheQuery(result);
                    }
                    _slashslash = false;
                    _specialAxis = true;
                    break;
                }
                if (_specialAxis || (qyInput != null && (int)qyInput.getName() > (int) Querytype.Self))
                    result = new CacheChildrenQuery( qyInput, root.Name, root.Prefix, URN, root.Type );                                                                                                           
                else
                    result = new ChildrenQuery( qyInput, root.Name, root.Prefix, URN, root.Type );
                break;
            case Axis.AxisType.Parent:
                result = new ParentQuery( qyInput, root.Name, root.Prefix, URN, root.Type );                        
                break;
            case Axis.AxisType.Descendant:
                switch (parent) {
                case Smart_D : 
                    result = new SmartXPathDescendantQuery( qyInput, false, root.Name, root.Prefix, URN, root.Type);
                    break;  
                case Regular_D :
                    result = new XPathDescendantQuery(qyInput, false, root.Name, root.Prefix, URN, root.Type);
                    if (_specialAxis || (qyInput != null && (int)qyInput.getName() > (int) Querytype.Self))
                        result = new CacheQuery(result);
                    _specialAxis = true;
			        break;
                }
                break;
            case Axis.AxisType.DescendantOrSelf:
                switch (parent) {
                case Smart_D : 
                    result = new SmartXPathDescendantQuery(qyInput, true, root.Name, root.Prefix, URN, root.Type, root.abbrAxis);                                                            
                    break;  
                case Regular_D :
                       if ( _smart <= 1 || root.Type != XPathNodeType.All ||
                        parentaxis != Axis.AxisType.Child) {
                            result = new XPathDescendantQuery(
                                                           qyInput,
                                                     true,
                                                     root.Name,
                                                     root.Prefix,
                                                     URN,
                                                     root.Type,
                                                     root.abbrAxis);
                            if (_specialAxis || (qyInput != null && (int)qyInput.getName() > (int) Querytype.Self))
                                result =  new CacheQuery(result);
                        _specialAxis = true;

                        }
                        else
                        {
                            _slashslash = true;
                            abbrAxis = root.abbrAxis;
                            result = qyInput;
                        }
        			break;
                }
                break;
            case Axis.AxisType.Preceding:
                result = new PrecedingQuery(
                                           qyInput,
                                           root.Name,
                                           root.Prefix,
                                           URN,
                                           root.Type);
               _specialAxis = hasReverseAxis = true;
                break;

            case Axis.AxisType.Following :
                result = new FollowingQuery(
                                           qyInput,
                                           root.Name,
                                           root.Prefix,
                                           URN,
                                           root.Type);
                _specialAxis = true;
                break;
            case Axis.AxisType.FollowingSibling :
                result = new FollSiblingQuery(
                                           qyInput,
                                           root.Name,
                                           root.Prefix,
                                           URN,
                                           root.Type);
                if (_specialAxis || (qyInput != null && (int)qyInput.getName() > (int) Querytype.Self)) {
                    result =  new DocumentOrderQuery(result);
                }
                break;
            case Axis.AxisType.PrecedingSibling :
                result = new PreSiblingQuery(
                                           qyInput,
                                           root.Name,
                                           root.Prefix,
                                           URN,
                                           root.Type);
                hasReverseAxis = true;
                break;
            case Axis.AxisType.Attribute:
                result = new AttributeQuery(
                                           qyInput,
                                           root.Name,
                                           root.Prefix,
                                           URN,
                                           root.Type);
                break;
            case Axis.AxisType.Self:
                result = new XPathSelfQuery(
                                           qyInput,
                                           root.Name,
                                           root.Prefix,
                                           URN,
                                           root.Type);
                break;
            case Axis.AxisType.Namespace:
                if (
                    (root.Type == XPathNodeType.All || root.Type == XPathNodeType.Element || root.Type == XPathNodeType.Attribute) &&
                    root.Prefix == string.Empty
                ) {
                    result = new NamespaceQuery(qyInput, root.Name, root.Prefix, URN, root.Type);
                }
                else {
                    result = new EmptyNamespaceQuery();
                }
                break;
            default:
                throw new XPathException(Res.Xp_NotSupported, _query);
            }
            return result;
        }