⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 queryimpl.cs

📁 Perst开源实时数据库
💻 CS
📖 第 1 页 / 共 5 页
字号:
				
                case NodeTag.opGetAtInt8: 
                    return ((long[]) arr)[index];
				
                case NodeTag.opGetAtUInt1: 
                    return ((byte[]) arr)[index];
				
                case NodeTag.opGetAtUInt2: 
                    return ((ushort[]) arr)[index];
				
                case NodeTag.opGetAtUInt4: 
                    return ((uint[]) arr)[index];
				
                case NodeTag.opGetAtUInt8: 
                    return (long)((ulong[]) arr)[index];
				
                case NodeTag.opGetAtChar: 
                    return ((char[]) arr)[index];
				
                case NodeTag.opStrGetAt: 
                    return ((string) arr)[index];
				
                default: 
                    throw new ApplicationException("Invalid tag " + tag);
				
            }
        }
		
        internal override double evaluateReal(FilterIterator t)
        {
            object arr = left.evaluateObj(t);
            long index = right.evaluateInt(t);
			
            if (right.tag == NodeTag.opIndexVar)
            {
                if (index >= ((Array) arr).Length)
                {
                    throw new IndexOutOfRangeError(((IndexNode) right).loopId);
                }
            }
            switch (tag)
            {				
                case NodeTag.opGetAtReal4: 
                    return ((float[]) arr)[(int) index];
				
                case NodeTag.opGetAtReal8: 
                    return ((double[]) arr)[(int) index];
				
                default: 
                    throw new ApplicationException("Invalid tag " + tag);
				
            }
        }
		
        internal override bool evaluateBool(FilterIterator t)
        {
            bool[] arr = (bool[]) left.evaluateObj(t);
            long index = right.evaluateInt(t);
			
            if (right.tag == NodeTag.opIndexVar)
            {
                if (index >= arr.Length)
                {
                    throw new IndexOutOfRangeError(((IndexNode) right).loopId);

                }
            }
            return arr[(int) index];
        }
		
        internal override string evaluateStr(FilterIterator t)
        {
            string[] arr = (string[]) left.evaluateObj(t);
            long index = right.evaluateInt(t);
			
            if (right.tag == NodeTag.opIndexVar)
            {
                if (index >= arr.Length)
                {
                    throw new IndexOutOfRangeError(((IndexNode) right).loopId);
                }
            }
            return arr[(int) index];
        }
		
        internal override object evaluateObj(FilterIterator t)
        {
            object arr = left.evaluateObj(t);
            long index = right.evaluateInt(t);
			
                if (right.tag == NodeTag.opIndexVar)
                {
                    if (index >= ((Array) arr).Length)
                    {
                        throw new IndexOutOfRangeError(((IndexNode) right).loopId);
                    }
                }
                return ((Array) arr).GetValue((int) index);
        }
		
        internal GetAtNode(NodeType type, NodeTag tag, Node baseExpr, Node index):base(type, tag)
        {
            left = baseExpr;
            right = index;
        }
    }
	
    class InvokeNode:Node
    {
        override internal Type Type
        {
            get
            {
                return mth.ReturnType;
            }
			
        }
        override internal string FieldName
        {
            get
            {
                if (target != null && target.tag != NodeTag.opCurrent)
                {
                    string baseName = target.FieldName;
                    return (baseName != null)?baseName + "." + mth.Name:null;
                }
                else
                {
                    return mth.Name;
                }
            }
			
        }
        internal Node target;
        internal Node[] arguments;
        internal MethodInfo mth;
		
        public  override bool Equals(object o)
        {
            return o is InvokeNode 
                && equalObjects(((InvokeNode) o).target, target) 
                && ArrayEquals(((InvokeNode) o).arguments, arguments) 
                && equalObjects(((InvokeNode) o).mth, mth);
        }
		
		
		
        internal virtual object getTarget(FilterIterator t)
        {
            if (target == null)
            {
                return t.currObj;
            }
            object obj = target.evaluateObj(t);
            if (obj == null)
            {
                throw new JSQLNullPointerException(target.Type, mth.ToString());
            }
            return obj;
        }
		
        internal virtual object[] evaluateArguments(FilterIterator t)
        {
            object[] parameters = null;
            int n = arguments.Length;
            if (n > 0)
            {
                parameters = new object[n];
                for (int i = 0; i < n; i++)
                {
                    Node arg = arguments[i];
                    object val;
                    switch (arg.type)
                    {						
                        case NodeType.tpInt: 
                            val = arg.evaluateInt(t);
                            break;
						
                        case NodeType.tpReal: 
                            val = arg.evaluateReal(t);
                            break;
						
                        case NodeType.tpStr: 
                            val = arg.evaluateStr(t);
                            break;
						
                        case NodeType.tpBool: 
                            val = arg.evaluateBool(t);
                            break;
						
                        default: 
                            val = arg.evaluateObj(t);
                            break;
						
                    }
                    parameters[i] = val;
                }
            }
            return parameters;
        }
		
        internal override long evaluateInt(FilterIterator t)
        {
            object obj = getTarget(t);
            object[] parameters = evaluateArguments(t);
            return Convert.ToInt64(mth.Invoke(obj, parameters));
        }
		
        internal override double evaluateReal(FilterIterator t)
        {
            object obj = getTarget(t);
            object[] parameters = evaluateArguments(t);
            return Convert.ToDouble(mth.Invoke(obj, parameters));
        }
		
        internal override bool evaluateBool(FilterIterator t)
        {
            object obj = getTarget(t);
            object[] parameters = evaluateArguments(t);
            return (bool) mth.Invoke(obj, parameters);
        }
		
        internal override string evaluateStr(FilterIterator t)
        {
            object obj = getTarget(t);
            object[] parameters = evaluateArguments(t);
            return (string) mth.Invoke(obj, parameters);
        }
		
        internal override object evaluateObj(FilterIterator t)
        {
            object obj = getTarget(t);
            object[] parameters = evaluateArguments(t);
            return mth.Invoke(obj, parameters);
        }
		
        internal InvokeNode(Node target, MethodInfo mth, Node[] arguments):base(getNodeType(mth.ReturnType), NodeTag.opInvoke)
        {
            this.target = target;
            this.arguments = arguments;
            this.mth = mth;
        }
    }
	
	
    class InvokeAnyNode:Node
    {
        override internal Type Type
        {
            get
            {
                return typeof(object);
            }
			
        }
        override internal string FieldName
        {
            get
            {
                if (target != null)
                {
                    if (target.tag != NodeTag.opCurrent)
                    {
                        string baseName = target.FieldName;
                        return (baseName != null)?baseName + "." + methodName:null;
                    }
                    else
                    {
                        return methodName;
                    }
                }
                else
                {
                    return containsFieldName != null?containsFieldName + "." + methodName:methodName;
                }
            }
			
        }
        internal Node target;
        internal Node[] arguments;
        internal Type[] profile;
        internal string methodName;
        internal string containsFieldName;
		
        public  override bool Equals(object o)
        {
            if (!(o is InvokeAnyNode))
            {
                return false;
            }
            InvokeAnyNode node = (InvokeAnyNode) o;
            return equalObjects(node.target, target) 
                && ArrayEquals(node.arguments, arguments) 
                && ArrayEquals(node.profile, profile) 
                && equalObjects(node.methodName, methodName) 
                && equalObjects(node.containsFieldName, containsFieldName);
        }
		
		
		
        internal InvokeAnyNode(Node target, string name, Node[] arguments, string containsFieldName):base(NodeType.tpAny, NodeTag.opInvokeAny)
        {
            this.target = target;
            this.containsFieldName = containsFieldName;
            methodName = name;
            this.arguments = arguments;
            profile = new Type[arguments.Length];
        }
		
        internal override object evaluateObj(FilterIterator t)
        {
            Type cls;
            MethodInfo m;
            object obj = t.currObj;
            if (target != null)
            {
                obj = target.evaluateObj(t);
                if (obj == null)
                {
                    throw new JSQLNullPointerException(null, methodName);
                }
            }
            object[] parameters = null;
            int n = arguments.Length;
            if (n > 0)
            {
                parameters = new object[n];
                for (int i = 0; i < n; i++)
                {
                    Node arg = arguments[i];
                    object val;
                    Type type;
                    switch (arg.type)
                    {
						
                        case NodeType.tpInt: 
                            val = arg.evaluateInt(t);
                            type = typeof(long);
                            break;
						
                        case NodeType.tpReal: 
                            val = arg.evaluateReal(t);
                            type = typeof(double);
                            break;
						
                        case NodeType.tpStr: 
                            val = arg.evaluateStr(t);
                            type = typeof(string);
                            break;
						
                        case NodeType.tpBool: 
                            val = arg.evaluateBool(t);
                            type = typeof(bool);
                            break;
						
                        default: 
                            val = arg.evaluateObj(t);
                            if (val != null)
                            {
                                type = val.GetType();
                                if (type.Equals(typeof(long)) || type.Equals(typeof(int)) || type.Equals(typeof(byte)) 
                                    || type.Equals(typeof(char)) || type.Equals(typeof(short)) || type.Equals(typeof(ulong)) 
                                    || type.Equals(typeof(uint)) || type.Equals(typeof(sbyte)) || type.Equals(typeof(ushort)))
                                {
                                    type = typeof(long);
                                }
                                else if (type.Equals(typeof(float)) || type.Equals(typeof(double)))
                                {
                                    type = typeof(double);
                                }
                                else if (type.Equals(typeof(bool)))
                                {
                                    type = typeof(bool);
                                }
                            }
                            else
                            {
                                type = typeof(object);
                            }
                            break;
						
                    }
                    parameters[i] = val;
                    profile[i] = type;
                }
            }
                if (target == null && t.containsElem != null)
                {
                    if ((m = QueryImpl.lookupMethod(t.containsElem.GetType(), methodName, profile)) != null)
                    {
                        return t.query.resolve(m.Invoke(t.containsElem, (object[]) parameters));
                    }
                }
                cls = obj.GetType();
                if ((m = QueryImpl.lookupMethod(cls, methodName, profile)) != null)
                {
                    return t.query.resolve(m.Invoke(t.containsElem, (object[]) parameters));
                }
			
            throw new JSQLNoSuchFieldException(cls, methodName);
        }
    }
	
	
    class ConvertAnyNode:Node
    {
        public  override bool Equals(object o)
        {
            return o is ConvertAnyNode && base.Equals(o) && ((ConvertAnyNode) o).expr.Equals(expr);
        }
		
        internal override bool evaluateBool(FilterIterator t)
        {
            return (bool) evaluateObj(t);
        }
		
        internal override long evaluateInt(FilterIterator t)
        {
            return (long) evaluateObj(t);
        }
		
        internal override double evaluateReal(FilterIterator t)
        {
            return (double) evaluateObj(t);
        }
		
        internal override object evaluateObj(FilterIterator t)
        {
            return expr.evaluateObj(t);
        }
		
        internal ConvertAnyNode(NodeType type, Node expr):base(type, NodeTag.opConvertAny)
        {
            this.expr = expr;
        }
        internal Node expr;
    }
	
    class BinOpNode:Node
    {
        internal Node left;
        internal Node right;
		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -