public PossibleValueSet NotEqual(PossibleValueSet pvs)
 {
     return ComparisonOperation(pvs);
 }
 public PossibleValueSet GreaterThan(PossibleValueSet pvs)
 {
     return ComparisonOperation(pvs);
 }
 public PossibleValueSet And(PossibleValueSet pvs, System.Type resultType)
 {
     return MathOperation(pvs, resultType);
 }
예제 #4
0
 public PossibleValueSet RightShift(PossibleValueSet pvs, System.Type resultType)
 {
     return(MathOperation(pvs, resultType));
 }
 public PossibleValueSet IsNotNull()
 {
     PossibleValueSet result = new PossibleValueSet(typeof(bool));
     if (ContainsNull)
         result.DistinctValues.Add(false);
     if (ContainsAllNonNullValues || DistinctValues.Any())
         result.DistinctValues.Add(true);
     return result;
 }
 public static PossibleValueSet CreateAllNonNullValues(System.Type expressionType)
 {
     PossibleValueSet result = new PossibleValueSet(expressionType);
     if (expressionType == typeof(bool))
     {
         result.DistinctValues.Add(true);
         result.DistinctValues.Add(false);
     }
     else
     {
         result.ContainsAllNonNullValues = true;
     }
     return result;
 }
예제 #7
0
 public PossibleValueSet Subtract(PossibleValueSet pvs, System.Type resultType)
 {
     return(MathOperation(pvs, resultType));
 }
        public PossibleValueSet Coalesce(PossibleValueSet pvs)
        {
            if (!ContainsNull)
                return this;

            PossibleValueSet result = new PossibleValueSet(ExpressionType);
            result.DistinctValues.AddRange(DistinctValues);
            result.ContainsAllNonNullValues = ContainsAllNonNullValues;

            result.ContainsNull = pvs.ContainsNull;
            result.ContainsAllNonNullValues |= pvs.ContainsAllNonNullValues;
            result.DistinctValues.AddRange(pvs.DistinctValues.Except(result.DistinctValues));

            return result;
        }
예제 #9
0
 private PossibleValueSet ComparisonOperation(PossibleValueSet pvs)
 {
     return(MathOperation(pvs, typeof(bool)));
 }
예제 #10
0
 public PossibleValueSet Multiply(PossibleValueSet pvs, System.Type resultType)
 {
     return(MathOperation(pvs, resultType));
 }
예제 #11
0
 public PossibleValueSet LessThanOrEqual(PossibleValueSet pvs)
 {
     return(ComparisonOperation(pvs));
 }
예제 #12
0
 public PossibleValueSet GreaterThan(PossibleValueSet pvs)
 {
     return(ComparisonOperation(pvs));
 }
예제 #13
0
 public PossibleValueSet NotEqual(PossibleValueSet pvs)
 {
     return(ComparisonOperation(pvs));
 }
예제 #14
0
 public PossibleValueSet LessThanOrEqual(PossibleValueSet pvs)
 {
     return ComparisonOperation(pvs);
 }
 public ExpressionValues(PossibleValueSet valuesIfUnknownMemberExpression)
 {
     Values = valuesIfUnknownMemberExpression;
     MemberExpressionValuesIfEmptyOuterJoined = new Dictionary <string, PossibleValueSet>();
 }
예제 #16
0
 private PossibleValueSet ComparisonOperation(PossibleValueSet pvs)
 {
     return MathOperation(pvs, typeof (bool));
 }
예제 #17
0
			public ExpressionValues(PossibleValueSet valuesIfUnknownMemberExpression)
			{
				Values = valuesIfUnknownMemberExpression;
				MemberExpressionValuesIfEmptyOuterJoined = new Dictionary<string, PossibleValueSet>();
			}
예제 #18
0
        // Unary Operators

        public PossibleValueSet Not()
        {
            DetermineBoolType();

            var result = new PossibleValueSet(ExpressionType);
            result.ContainsNull = ContainsNull;
            result.DistinctValues.AddRange(DistinctValues.Cast<bool>().Select(v => !v).Cast<object>());
            return result;
        }
예제 #19
0
        private PossibleValueSet MathOperation(PossibleValueSet pvs, System.Type resultType)
        {
            // If either side is only null, the result will be null.
            if (!ContainsAnyNonNullValues || !pvs.ContainsAnyNonNullValues)
                return CreateNull(resultType);

            // If neither side is null, the result cannot be null.
            if (!ContainsNull && !pvs.ContainsNull)
                return CreateAllNonNullValues(resultType);

            // Otherwise, the result can be anything.
            return CreateAllValues(resultType);
        }
예제 #20
0
        /// <summary>
        /// Verify that ExpressionType of both this and the other set is bool or nullable bool,
        /// and return the negotiated type (nullable bool if either side is nullable).
        /// </summary>
        private System.Type DetermineBoolType(PossibleValueSet otherSet)
        {
            DetermineBoolType();
            otherSet.DetermineBoolType();

            var nullableBoolType = typeof(bool?);
            if (ExpressionType == nullableBoolType || otherSet.ExpressionType == nullableBoolType)
                return nullableBoolType;

            return typeof(bool);
        }
예제 #21
0
        public PossibleValueSet AndAlso(PossibleValueSet pvs)
        {
            /*
             * T && T == T
             * T && F == F
             * T && N == N
             * F && T == F
             * F && F == F
             * F && N == F
             * N && T == N
             * N && F == F
             * N && N == N
             */

            var result = new PossibleValueSet(DetermineBoolType(pvs));
            
            if (Contains(true) && pvs.Contains(true) && !result.Contains(true)) result.DistinctValues.Add(true);
            if (Contains(true) && pvs.Contains(false) && !result.Contains(false)) result.DistinctValues.Add(false);
            if (Contains(true) && pvs.Contains(null)) result.ContainsNull = true;
            if (Contains(false) && pvs.Contains(true) && !result.Contains(false)) result.DistinctValues.Add(false);
            if (Contains(false) && pvs.Contains(false) && !result.Contains(false)) result.DistinctValues.Add(false);
            if (Contains(false) && pvs.Contains(null) && !result.Contains(false)) result.DistinctValues.Add(false);
            if (Contains(null) && pvs.Contains(true)) result.ContainsNull = true;
            if (Contains(null) && pvs.Contains(false) && !result.Contains(false)) result.DistinctValues.Add(false);
            if (Contains(null) && pvs.Contains(null)) result.ContainsNull = true;

            return result;
        }
예제 #22
0
 public static PossibleValueSet Create(System.Type expressionType, params object[] values)
 {
     PossibleValueSet result = new PossibleValueSet(expressionType);
     foreach (var v in values)
     {
         if (v == null)
             result.ContainsNull = true;
         else if (v.GetType() == expressionType && !result.DistinctValues.Contains(v))
             result.DistinctValues.Add(v);
         else
             throw new AssertionFailure("Don't know how to add value to possible value set of type " + expressionType + ": " + v);
     }
     return result;
 }
예제 #23
0
        public PossibleValueSet OrElse(PossibleValueSet pvs)
        {
            /*
             * T || T == T
             * T || F == T
             * T || N == T
             * F || T == T
             * F || F == F
             * F || N == N
             * N || T == T
             * N || F == N
             * N || N == N
             */

            var result = new PossibleValueSet(DetermineBoolType(pvs));

            if (Contains(true) && pvs.Contains(true) && !result.Contains(true)) result.DistinctValues.Add(true);
            if (Contains(true) && pvs.Contains(false) && !result.Contains(true)) result.DistinctValues.Add(true);
            if (Contains(true) && pvs.Contains(null) && !result.Contains(true)) result.DistinctValues.Add(true);
            if (Contains(false) && pvs.Contains(true) && !result.Contains(true)) result.DistinctValues.Add(true);
            if (Contains(false) && pvs.Contains(false) && !result.Contains(false)) result.DistinctValues.Add(false);
            if (Contains(false) && pvs.Contains(null)) result.ContainsNull = true;
            if (Contains(null) && pvs.Contains(true) && !result.Contains(true)) result.DistinctValues.Add(true);
            if (Contains(null) && pvs.Contains(false)) result.ContainsNull = true;
            if (Contains(null) && pvs.Contains(null)) result.ContainsNull = true;

            return result;
        }
예제 #24
0
 public PossibleValueSet ExclusiveOr(PossibleValueSet pvs, System.Type resultType)
 {
     return MathOperation(pvs, resultType);
 }
예제 #25
0
 public PossibleValueSet ExclusiveOr(PossibleValueSet pvs, System.Type resultType)
 {
     return(MathOperation(pvs, resultType));
 }