📄 queryimpl.cs
字号:
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 + -