示例#1
0
 public ExprRelationalOpNodeForge(ExprRelationalOpNodeImpl parent,
     RelationalOpEnumComputer computer,
     Type coercionType)
 {
     _parent = parent;
     _computer = computer;
     _coercionType = coercionType;
 }
示例#2
0
 public ExprRelationalOpAllAnyNodeForge(
     ExprRelationalOpAllAnyNode parent,
     RelationalOpEnumComputer computer,
     bool hasCollectionOrArray)
 {
     this._parent = parent;
     this._computer = computer;
     this._hasCollectionOrArray = hasCollectionOrArray;
 }
 public SubselectForgeNRRelOpBase(
     ExprSubselectNode subselect,
     ExprForge valueEval,
     ExprForge selectEval,
     bool resultWhenNoMatchingEvents,
     RelationalOpEnumComputer computer)
     : base(subselect, valueEval, selectEval, resultWhenNoMatchingEvents)
 {
     this.computer = computer;
 }
 public SubselectForgeNRRelOpAllAnyAggregated(
     ExprSubselectNode subselect,
     ExprForge valueEval,
     ExprForge selectEval,
     bool resultWhenNoMatchingEvents,
     RelationalOpEnumComputer computer,
     ExprForge havingEval)
     : base(
         subselect,
         valueEval,
         selectEval,
         resultWhenNoMatchingEvents,
         computer)
 {
     this.havingEval = havingEval;
 }
 public SubselectForgeNRRelOpAllDefault(
     ExprSubselectNode subselect,
     ExprForge valueEval,
     ExprForge selectEval,
     bool resultWhenNoMatchingEvents,
     RelationalOpEnumComputer computer,
     ExprForge filterOrHavingEval)
     : base(
         subselect,
         valueEval,
         selectEval,
         resultWhenNoMatchingEvents,
         computer)
 {
     this.filterOrHavingEval = filterOrHavingEval;
 }
示例#6
0
        private bool? EvaluateInternal(
            EventBean[] eventsPerStream,
            bool isNewData,
            ExprEvaluatorContext exprEvaluatorContext)
        {
            if (evaluators.Length == 1) {
                return false;
            }

            var isAll = forge.ForgeRenderable.IsAll;
            RelationalOpEnumComputer computer = forge.Computer;
            var valueLeft = evaluators[0].Evaluate(eventsPerStream, isNewData, exprEvaluatorContext);
            var len = evaluators.Length - 1;

            if (forge.IsCollectionOrArray) {
                var hasNonNullRow = false;
                var hasRows = false;
                for (var i = 1; i <= len; i++) {
                    var valueRight = evaluators[i].Evaluate(eventsPerStream, isNewData, exprEvaluatorContext);

                    if (valueRight == null) {
                        continue;
                    }

                    if (valueRight is Array valueRightArray) {
                        hasRows = true;
                        var arrayLength = valueRightArray.Length;
                        for (var index = 0; index < arrayLength; index++) {
                            object item = valueRightArray.GetValue(index);
                            if (item == null) {
                                if (isAll) {
                                    return null;
                                }

                                continue;
                            }

                            hasNonNullRow = true;
                            if (valueLeft != null) {
                                if (isAll) {
                                    if (!computer.Compare(valueLeft, item)) {
                                        return false;
                                    }
                                }
                                else {
                                    if (computer.Compare(valueLeft, item)) {
                                        return true;
                                    }
                                }
                            }
                        }
                    }
                    else if (valueRight is IDictionary<object, object>) {
                        var coll = (IDictionary<object, object>) valueRight;
                        hasRows = true;
                        foreach (object item in coll.Keys) {
                            if (!(item.IsNumber())) {
                                if (isAll && item == null) {
                                    return null;
                                }

                                continue;
                            }

                            hasNonNullRow = true;
                            if (valueLeft != null) {
                                if (isAll) {
                                    if (!computer.Compare(valueLeft, item)) {
                                        return false;
                                    }
                                }
                                else {
                                    if (computer.Compare(valueLeft, item)) {
                                        return true;
                                    }
                                }
                            }
                        }
                    }
                    else if (valueRight is ICollection<object>) {
                        var coll = (ICollection<object>) valueRight;
                        hasRows = true;
                        foreach (object item in coll) {
                            if (!(item.IsNumber())) {
                                if (isAll && item == null) {
                                    return null;
                                }

                                continue;
                            }

                            hasNonNullRow = true;
                            if (valueLeft != null) {
                                if (isAll) {
                                    if (!computer.Compare(valueLeft, item)) {
                                        return false;
                                    }
                                }
                                else {
                                    if (computer.Compare(valueLeft, item)) {
                                        return true;
                                    }
                                }
                            }
                        }
                    }
                    else if (!(valueRight.IsNumber())) {
                        if (isAll) {
                            return null;
                        }
                    }
                    else {
                        hasNonNullRow = true;
                        if (isAll) {
                            if (!computer.Compare(valueLeft, valueRight)) {
                                return false;
                            }
                        }
                        else {
                            if (computer.Compare(valueLeft, valueRight)) {
                                return true;
                            }
                        }
                    }
                }

                if (isAll) {
                    if (!hasRows) {
                        return true;
                    }

                    if (!hasNonNullRow || valueLeft == null) {
                        return null;
                    }

                    return true;
                }

                if (!hasRows) {
                    return false;
                }

                if (!hasNonNullRow || valueLeft == null) {
                    return null;
                }

                return false;
            }
            else {
                var hasNonNullRow = false;
                var hasRows = false;
                for (var i = 1; i <= len; i++) {
                    var valueRight = evaluators[i].Evaluate(eventsPerStream, isNewData, exprEvaluatorContext);
                    hasRows = true;

                    if (valueRight != null) {
                        hasNonNullRow = true;
                    }
                    else {
                        if (isAll) {
                            return null;
                        }
                    }

                    if (valueRight != null && valueLeft != null) {
                        if (isAll) {
                            if (!computer.Compare(valueLeft, valueRight)) {
                                return false;
                            }
                        }
                        else {
                            if (computer.Compare(valueLeft, valueRight)) {
                                return true;
                            }
                        }
                    }
                }

                if (isAll) {
                    if (!hasRows) {
                        return true;
                    }

                    if (!hasNonNullRow || valueLeft == null) {
                        return null;
                    }

                    return true;
                }

                if (!hasRows) {
                    return false;
                }

                if (!hasNonNullRow || valueLeft == null) {
                    return null;
                }

                return false;
            }
        }