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

📄 queryimpl.cs

📁 Perst开源实时数据库
💻 CS
📖 第 1 页 / 共 5 页
字号:
                    long val = left.evaluateInt(t);
                    sbyte[] arr = (sbyte[]) right.evaluateObj(t);
                    for (int i = arr.Length; --i >= 0; )
                    {
                        if (arr[i] == val)
                        {
                            return true;
                        }
                    }
                    return false;
                }

                case NodeTag.opScanArrayInt2: 
                {
                    long val = left.evaluateInt(t);
                    short[] arr = (short[]) right.evaluateObj(t);
                    for (int i = arr.Length; --i >= 0; )
                    {
                        if (arr[i] == val)
                        {
                            return true;
                        }
                    }
                    return false;
                }
				
                case NodeTag.opScanArrayInt4: 
                {
                    long val = left.evaluateInt(t);
                    int[] arr = (int[]) right.evaluateObj(t);
                    for (int i = arr.Length; --i >= 0; )
                    {
                        if (arr[i] == val)
                        {
                            return true;
                        }
                    }
                    return false;
                }
				
                case NodeTag.opScanArrayInt8: 
                {
                    long val = left.evaluateInt(t);
                    long[] arr = (long[]) right.evaluateObj(t);
                    for (int i = arr.Length; --i >= 0; )
                    {
                        if (arr[i] == val)
                        {
                            return true;
                        }
                    }
                    return false;
                }
				
                case NodeTag.opScanArrayUInt1: 
                {
                    long val = left.evaluateInt(t);
                    byte[] arr = (byte[]) right.evaluateObj(t);
                    for (int i = arr.Length; --i >= 0; )
                    {
                        if (arr[i] == val)
                        {
                            return true;
                        }
                    }
                    return false;
                }

                case NodeTag.opScanArrayUInt2: 
                {
                    long val = left.evaluateInt(t);
                    ushort[] arr = (ushort[]) right.evaluateObj(t);
                    for (int i = arr.Length; --i >= 0; )
                    {
                        if (arr[i] == val)
                        {
                            return true;
                        }
                    }
                    return false;
                }
				
                case NodeTag.opScanArrayUInt4: 
                {
                    long val = left.evaluateInt(t);
                    uint[] arr = (uint[]) right.evaluateObj(t);
                    for (int i = arr.Length; --i >= 0; )
                    {
                        if (arr[i] == val)
                        {
                            return true;
                        }
                    }
                    return false;
                }
				
                case NodeTag.opScanArrayUInt8: 
                {
                    long val = left.evaluateInt(t);
                    ulong[] arr = (ulong[]) right.evaluateObj(t);
                    for (int i = arr.Length; --i >= 0; )
                    {
                        if ((long)arr[i] == val)
                        {
                            return true;
                        }
                    }
                    return false;
                }
				
                case NodeTag.opScanArrayReal4: 
                {
                    double val = left.evaluateReal(t);
                    float[] arr = (float[]) right.evaluateObj(t);
                    for (int i = arr.Length; --i >= 0; )
                    {
                        if (arr[i] == val)
                        {
                            return true;
                        }
                    }
                    return false;
                }
				
                case NodeTag.opScanArrayReal8: 
                {
                    double val = left.evaluateReal(t);
                    double[] arr = (double[]) right.evaluateObj(t);
                    for (int i = arr.Length; --i >= 0; )
                    {
                        if (arr[i] == val)
                        {
                            return true;
                        }
                    }
                    return false;
                }
				
                case NodeTag.opScanArrayStr: 
                {
                    string val = left.evaluateStr(t);
                    string[] arr = (string[]) right.evaluateObj(t);
                    for (int i = arr.Length; --i >= 0; )
                    {
                        if (val.Equals(arr[i]))
                        {
                            return true;
                        }
                    }
                    return false;
                }
				
                case NodeTag.opScanArrayObj: 
                {
                    object val = left.evaluateObj(t);
                    object[] arr = (object[]) right.evaluateObj(t);
                    for (int i = arr.Length; --i >= 0; )
                    {
                        if (val == arr[i])
                        {
                            return true;
                        }
                    }
                    return false;
                }
				
                case NodeTag.opInString: 
                {
                    string substr = left.evaluateStr(t);
                    string str = right.evaluateStr(t);
                    return str.IndexOf(substr) >= 0;
                }
				
                default: 
                    throw new System.ApplicationException("Invalid tag " + tag);
				
            }
        }
		
        internal BinOpNode(NodeType type, NodeTag tag, Node left, Node right):base(type, tag)
        {
            this.left = left;
            this.right = right;
        }
    }
	
    class CompareNode:Node
    {
        internal Node o1, o2, o3;
		
        public  override bool Equals(object o)
        {
            return o is CompareNode 
                && base.Equals(o) 
                && ((CompareNode) o).o1.Equals(o1) 
                && ((CompareNode) o).o2.Equals(o2) 
                && equalObjects(((CompareNode) o).o3, o3);
        }
		
        internal override bool evaluateBool(FilterIterator t)
        {
            switch (tag)
            {				
                case NodeTag.opAnyBetween: 
                {
                    object val = o1.evaluateObj(t);
                    return BinOpNode.compare(val, o2.evaluateObj(t)) >= 0 
                        && BinOpNode.compare(val, o3.evaluateObj(t)) <= 0;
                }
				
                case NodeTag.opIntBetween: 
                {
                    long val = o1.evaluateInt(t);
                    return val >= o2.evaluateInt(t) && val <= o3.evaluateInt(t);
                }
				
                case NodeTag.opRealBetween: 
                {
                    double val = o1.evaluateReal(t);
                    return val >= o2.evaluateReal(t) && val <= o3.evaluateReal(t);
                }
				
                case NodeTag.opStrBetween: 
                {
                    string val = o1.evaluateStr(t);
                    return val.CompareTo(o2.evaluateStr(t)) >= 0 && val.CompareTo(o3.evaluateStr(t)) <= 0;
                }
				
                case NodeTag.opStrLike: 
                {
                    string str = o1.evaluateStr(t);
                    string pat = o2.evaluateStr(t);
                    int pi = 0, si = 0, pn = pat.Length, sn = str.Length;
                    int wildcard = - 1, strpos = - 1;
                    while (true)
                    {
                        if (pi < pn && pat[pi] == '%')
                        {
                            wildcard = ++pi;
                            strpos = si;
                        }
                        else if (si == sn)
                        {
                            return pi == pn;
                        }
                        else if (pi < pn && (str[si] == pat[pi] || pat[pi] == '_'))
                        {
                            si += 1;
                            pi += 1;
                        }
                        else if (wildcard >= 0)
                        {
                            si = ++strpos;
                            pi = wildcard;
                        }
                        else
                        {
                            return false;
                        }
                    }
                }
				
                case NodeTag.opStrLikeEsc: 
                {
                    string str = o1.evaluateStr(t);
                    string pat = o2.evaluateStr(t);
                    char escape = o3.evaluateStr(t)[0];
                    int pi = 0, si = 0, pn = pat.Length, sn = str.Length;
                    int wildcard = - 1, strpos = - 1;
                    while (true)
                    {
                        if (pi < pn && pat[pi] == '%')
                        {
                            wildcard = ++pi;
                            strpos = si;
                        }
                        else if (si == sn)
                        {
                            return pi == pn;
                        }
                        else if (pi + 1 < pn && pat[pi] == escape && pat[pi + 1] == str[si])
                        {
                            si += 1;
                            pi += 2;
                        }
                        else if (pi < pn && ((pat[pi] != escape && (str[si] == pat[pi] || pat[pi] == '_'))))
                        {
                            si += 1;
                            pi += 1;
                        }
                        else if (wildcard >= 0)
                        {
                            si = ++strpos;
                            pi = wildcard;
                        }
                        else
                        {
                            return false;
                        }
                    }
                }
				
                default: 
                    throw new System.ApplicationException("Invalid tag " + tag);
				
            }
        }
		
        internal CompareNode(NodeTag tag, Node a, Node b, Node c):base(NodeType.tpBool, tag)
        {
            o1 = a;
            o2 = b;
            o3 = c;
        }
    }
	
	
    class UnaryOpNode:Node
    {
        internal Node opd;
		
        public  override bool Equals(object o)
        {
            return o is UnaryOpNode && base.Equals(o) && ((UnaryOpNode) o).opd.Equals(opd);
        }
		
        internal override object evaluateObj(FilterIterator t)
        {
            object val = opd.evaluateObj(t);
            switch (tag)
            {				
                case NodeTag.opAnyNeg: 
                    return val is double || val is float
                        ? (object)-Convert.ToDouble(val) : (object)-Convert.ToInt64(val);
				
                case NodeTag.opAnyAbs: 
                    if (val is double || val is float)
                    {
                        double rval = Convert.ToDouble(val);
                        return rval < 0?-rval:rval;
                    }
                    else
                    {
                        long ival = Convert.ToInt64(val);
                        return ival < 0?-ival:ival;
                    }
				
                case NodeTag.opAnyNot: 
                    return val is bool? (bool)val : (object)~Convert.ToInt64(val);
				
                default: 
                    throw new System.ApplicationException("Invalid tag " + tag);
				
            }
        }
		
        internal override long evaluateInt(FilterIterator t)
        {
            long val;
            switch (tag)
            {
                case NodeTag.opIntNot: 
                    return ~opd.evaluateInt(t);
				
                case NodeTag.opIntNeg: 
                    return -opd.evaluateInt(t);
				
                case NodeTag.opIntAbs: 
                    val = opd.evaluateInt(t);
                    return val < 0?-val:val;
				
                case NodeTag.opRealToInt: 
                    return (long) opd.evaluateReal(t);
				
                case NodeTag.opAnyLength: 
                {
                    object obj = opd.evaluateObj(t);
                    if (obj is string)
                    {
                        return ((string) obj).Length;
                    }
                    else
                    {
                        return ((Array) obj).Length;
                    }
                }
				
                case NodeTag.opLength: 
                    return ((Array) opd.evaluateObj(t)).Length;
				
                case NodeTag.opStrLength: 
                    return opd.evaluateStr(t).Length;
				
                default: 
                    throw new System.ApplicationException("Invalid tag " + tag);
				
            }
        }
		
        internal override double evaluateReal(FilterIterator t)
        {
            double val;
            switch (tag)
            {
                case NodeTag.opRealNeg: 
                    return -opd.evaluateReal(t);
				
                case NodeTag.opRealAbs: 
                    val = opd.evaluateReal(t);
                    return val < 0?- val:val;
				
                case NodeTag.opRealSin: 
                    return Math.Sin(opd.evaluateReal(t));
				
                case NodeTag.opRealCos: 
                    return Math.Cos(opd.evaluateReal(t));
				
                case NodeTag.opRealTan: 
                    return Math.Tan(opd.evaluateReal(t));
				
                case NodeTag.opRealAsin: 
                    return Math.Asin(opd.evaluateReal(t));
				
                case NodeTag.opRealAcos: 
                    return Math.Acos(opd.evaluateReal(t));
				
                case NodeTag.opRealAtan: 
                    return Math.Atan(opd.evaluateReal(t));
				
                case NodeTag.opRealExp: 
                    return Math.Exp(opd.evaluateReal(t));
				
                case NodeTag.opRealLog: 
                    return Math.Log(opd.evaluateReal(t));
				
                case NodeTag.opRealSqrt: 
                    return Math.Sqrt(opd.evaluateReal(t));
				
                case NodeTag.opRealCeil: 
                    return Math.Ceiling(opd.evaluateReal(t));
	

⌨️ 快捷键说明

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