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