예제 #1
0
        public IConditionGroup Add(IField field, RelationalOperators relationalOperator, object value, object ignoreValue = null)
        {
            var enumerableValue = value as IEnumerable;

            if ((relationalOperator & RelationalOperators.Between) == RelationalOperators.Between)
            {
                var bv = value as IBetweenValue;
                if (bv != null)
                {
                    return(AddBetweenCondition(field, relationalOperator, bv, ignoreValue));
                }

                if (enumerableValue == null)
                {
                    throw new ArrayTypeMismatchException("RelationalOperators.Between requires 2 values");
                }
                return(AddBetweenCondition(field, relationalOperator, enumerableValue, ignoreValue));
            }

            if ((relationalOperator & RelationalOperators.In) == RelationalOperators.In)
            {
                return(AddInCondition(field, relationalOperator, value, ignoreValue));
            }

            if (enumerableValue != null && !(value is string))
            {
                return(AddEnumerableValueCondition(field, relationalOperator, enumerableValue, ignoreValue));
            }



            /*if (!(value is IValue))
             * {
             *  var enumerableValue = value as IEnumerable;
             *
             *  if ((relationalOperator & RelationalOperators.Between) == RelationalOperators.Between)
             *  {
             *      if (enumerableValue == null)
             *          throw new ArrayTypeMismatchException("RelationalOperators.Between requires 2 values");
             *      return AddBetweenCondition(field, relationalOperator, enumerableValue, ignoreValue);
             *  }
             *
             *  if ((relationalOperator & RelationalOperators.In) == RelationalOperators.In)
             *  {
             *      return AddInCondition(field, relationalOperator, value, ignoreValue);
             *  }
             *
             *  if (enumerableValue != null && !(value is string))
             *  {
             *      return AddEnumerableValueCondition(field, relationalOperator, enumerableValue, ignoreValue);
             *  }
             * }
             * */

            if (!ContainsIgnoreValue(value, ignoreValue))
            {
                EmbeddedStatements.Add(new FieldCondition(field, relationalOperator, GetDataTypeCheckedValue(value, field.DataType)));
            }
            return(this);
        }
예제 #2
0
 public Condition(string lhs, RelationalOperators relationalOperator, string rhs)
 {
     LOp = null;
     Lhs = lhs;
     Op  = Condition.relationalOperators[relationalOperator];
     Rhs = rhs;
 }
예제 #3
0
        private IConditionGroup AddBetweenCondition(IField field, RelationalOperators relationalOperator, IEnumerable values, object ignoreValue)
        {
            var i             = -1;
            var betweenValues = new object[2];

            foreach (var value in values)
            {
                i++;
                betweenValues[i] = value;
                if (i == 1)
                {
                    break;
                }
            }
            if (i < 1)
            {
                throw new ArrayTypeMismatchException("RelationalOperators.Between requires 2 values");
            }


            if (ContainsIgnoreValue(betweenValues[0], ignoreValue) && ContainsIgnoreValue(betweenValues[1], ignoreValue))
            {
                return(this);
            }

            Add(new FieldCondition(field, relationalOperator, CreateBetweenValue(field.DataType, betweenValues[0], betweenValues[1])));
            return(this);
        }
예제 #4
0
        private ScalarType AnalyzeExpression(HashSet <Symbol> followers)
        {
            var resultType = ScalarType.Unknown;

            if (!Belongs(Starters.Expression))
            {
                InsertError(1004);
                SkipTo(Starters.Expression, followers);
            }

            if (!Belongs(Starters.Expression))
            {
                return(resultType);
            }

            switch (CurrentSymbol)
            {
            case Symbol.Plus:
            case Symbol.Minus:
            case Symbol.Identifier:
            case Symbol.IntegerConstant:
            case Symbol.FloatConstant:
            case Symbol.CharConstant:
            case Symbol.StringConstant:
            case Symbol.True:
            case Symbol.False:
            case Symbol.LeftRoundBracket:
            case Symbol.Not:
                resultType = AnalyzeSimpleExpression(Union(RelationalOperators, followers));
                break;

            default:
                IoManager.InsertError(CurrentToken.CharacterNumber, 1004);
                break;
            }

            if (RelationalOperators.Contains(CurrentSymbol))
            {
                var operation  = AnalyzeRelationalOperators(Followers.RelationalOperators);
                var secondType = AnalyzeSimpleExpression(Union(Followers.SimpleExpression, followers));
                if (resultType != ScalarType.Boolean || secondType != ScalarType.Boolean)
                {
                    InsertError(144);
                    resultType = ScalarType.Unknown;
                }
                else
                {
                    resultType = ScalarType.Boolean;
                }
            }

            if (!Belongs(followers))
            {
                InsertError(1010);
                SkipTo(followers);
            }

            return(resultType);
        }
예제 #5
0
 public ISqlGenerator RightJoin(object leftSource, object rightSource,
                                object left01, object right01, RelationalOperators relationalOperator01 = RelationalOperators.Equal,
                                object left02 = null, object right02 = null, RelationalOperators relationalOperator02 = RelationalOperators.Equal)
 {
     return(Join(JoinOperator.Right, leftSource, rightSource,
                 left01, right01, relationalOperator01,
                 left02, right02, relationalOperator02));
 }
예제 #6
0
 private static bool ContainsCodePartsWithRelationalOperator(string checkedLine)
 {
     return(CodePartsWithRelationalOperator.Any(codePart =>
     {
         var index = checkedLine.IndexOf(codePart, StringComparison.InvariantCulture);
         return index >= 0 && RelationalOperators.Any(op => checkedLine.IndexOf(op, index, StringComparison.InvariantCulture) >= 0);
     }));
 }
        public void GenerateSqlString_DbNullValue(FieldDataType dataType, RelationalOperators relationalOperator)
        {
            _csb.Add("Field1", dataType, relationalOperator, System.DBNull.Value);
            _csb.Add("Field2", dataType, relationalOperator, System.DBNull.Value);

            var actual = _csb.ToString();

            Assert.AreEqual(string.Empty, actual);
        }
예제 #8
0
 public JoinColumnMap(JoinColumn leftColumn, JoinColumn rightColumn,
                      RelationalOperators relationalOperator = RelationalOperators.Equal,
                      LogicalOperators logicalOperator       = LogicalOperators.And)
 {
     LeftColumn         = leftColumn ?? throw new ArgumentNullException(nameof(leftColumn));
     RightColumn        = rightColumn ?? throw new ArgumentNullException(nameof(rightColumn));
     RelationalOperator = relationalOperator;
     LogicalOperator    = logicalOperator;
 }
예제 #9
0
        public IConditionGroup BeginGroup(IField field, RelationalOperators relationalOperator, object value,
                                          LogicalOperator concatOperator = LogicalOperator.And)
        {
            var group = new ConditionGroup(concatOperator);

            Add(group);
            group.Add(field, relationalOperator, value);
            return(group);
        }
예제 #10
0
        private IConditionGroup AddBetweenCondition(IField field, RelationalOperators relationalOperator, IBetweenValue values, object ignoreValue)
        {
            if (ContainsIgnoreValue(values.FirstValue, ignoreValue) && ContainsIgnoreValue(values.SecondValue, ignoreValue))
            {
                return(this);
            }

            Add(new FieldCondition(field, relationalOperator, values));
            return(this);
        }
        public void GenerateSqlString_ConcatDbNullValue(FieldDataType dataType, RelationalOperators relationalOperator)
        {
            _csb.Add("Field1", FieldDataType.Text, RelationalOperators.Between, new object[] { System.DBNull.Value, "xyz" });
            _csb.Add("Field2", FieldDataType.Numeric, RelationalOperators.Between, new object[] { 133.45, System.DBNull.Value });
            _csb.Add("Field3", dataType, relationalOperator, System.DBNull.Value);

            var actual = _csb.ToString();

            Assert.AreEqual("Field1 <= 'xyz' And Field2 >= 133.45", actual);
        }
        public void GenerateSqlStringFieldAndValue_Date(object fieldName, RelationalOperators relationalOperator, string value, string expected)
        {
            System.DateTime date = System.DateTime.Parse(value);

            _csb.Add(fieldName, FieldDataType.DateTime, relationalOperator, date);

            var actual = _csb.ToString();

            Assert.AreEqual(expected, actual);
        }
예제 #13
0
        protected virtual string CreateInConditionString(IField field, RelationalOperators op, IValue[] values)
        {
            var valueStrings = new string[values.Length];

            for (var i = 0; i < values.Length; i++)
            {
                valueStrings[i] = ValueConverter.ConvertValueToString(values[i]);
            }

            return(string.Concat(ConditionStringItemPrefix, NameConverter.GenerateFieldString(field), OperatorString(op), "(", string.Join(",", valueStrings), ")", ConditionStringItemPostfix));
        }
예제 #14
0
        public void AddJoinColumn(
            IEntityName leftTable,
            IItemName leftColumnName,
            IItemName rightColumnName,
            RelationalOperators relationalOperator = RelationalOperators.Equal,
            LogicalOperators logicalOperator       = LogicalOperators.And)
        {
            var leftColumn = new JoinColumn(leftTable, leftColumnName);

            AddJoinColumn(leftColumn, GetJoinColumn(rightColumnName), relationalOperator, logicalOperator);
        }
예제 #15
0
        private IConditionGroup AddEnumerableValueCondition(IField field, RelationalOperators relationalOperator, IEnumerable values, object ignoreValue = null)
        {
            var conditionGroup = new ConditionGroup(LogicalOperator.Or);

            foreach (var value in values)
            {
                conditionGroup.Add(field, relationalOperator, value, ignoreValue);
            }

            Add(conditionGroup);
            return(this);
        }
예제 #16
0
        protected virtual string CreateConditionString(IField field, RelationalOperators op, object value)
        {
            if ((op & RelationalOperators.In) == RelationalOperators.In)
            {
                return(CreateInConditionString(field, op, value));
            }

            if ((value is IBetweenValue) && (op & RelationalOperators.Between) == RelationalOperators.Between)
            {
                return(CreateBetweenConditionString(field, op, (IBetweenValue)value));
            }

            var valueArray = value as IValueArray;

            if (valueArray != null)
            {
                return(CreateValueArrayConditionString(field, op, valueArray));
            }

            if (value is IEnumerable && !(value is string))
            {
                return(CreateEnumerableConditionString(field, op, value as IEnumerable));
            }

            var fieldName = NameConverter.GenerateFieldString(field);

            var f = value as IField;

            if (f != null)
            {
                return(CreateFieldConditionString(fieldName, op, f));
            }
            var v = value as IValue;

            if (v != null)
            {
                return(CreateFieldConditionString(fieldName, op, v));
            }
            var s = value as string;

            if (s != null)
            {
                return(CreateStringConditionString(fieldName, op, s));
            }
            if (value is DateTime)
            {
                return(CreateDateTimeConditionString(fieldName, op, (DateTime)value));
            }

            double number;

            return(Double.TryParse(value.ToString(), out number) ? CreateNumericConditionString(fieldName, op, value) : string.Concat(ConditionStringItemPrefix, NameConverter.GenerateFieldString(field), OperatorString(op), value.ToString(), ConditionStringItemPostfix));
        }
예제 #17
0
        private IConditionGroup AddInCondition(IField field, RelationalOperators relationalOperator, IValueArray values, object ignoreValue)
        {
            var inValues = values.Values.Where(v => !ContainsIgnoreValue(v, ignoreValue)).ToList();

            if (inValues.Count == 0)
            {
                return(this);
            }

            Add(new FieldCondition(field, relationalOperator, new ValueArray(inValues.ToArray())));
            return(this);
        }
예제 #18
0
        protected virtual string AppendWildcard(string s, RelationalOperators wildCards)
        {
            if ((wildCards & RelationalOperators.AddWildcardPrefix) == RelationalOperators.AddWildcardPrefix)
            {
                s = string.Concat(WildcardString, s);
            }
            if ((wildCards & RelationalOperators.AddWildcardSuffix) == RelationalOperators.AddWildcardSuffix)
            {
                s = string.Concat(s, WildcardString);
            }

            return(s);
        }
        public void GenerateSqlStringFieldAndValue_Date_Between(object fieldName, RelationalOperators relationalOperator, string value1, string value2, string expected)
        {
            System.DateTime date1 = System.DateTime.Parse(value1);
            System.DateTime date2 = System.DateTime.Parse(value2);

            var dates = new System.DateTime[] { date1, date2 };

            _csb.Add(fieldName, FieldDataType.DateTime, relationalOperator, dates);

            var actual = _csb.ToString();

            Assert.AreEqual(expected, actual);
        }
예제 #20
0
        public IConditionGroup Add(object field, FieldDataType dataType, RelationalOperators relationalOperator,
                                   object value, object ignoreValue = null)
        {
            var fld = FieldGenerator.GetFieldFromObject(field);

            if (fld.DataType != dataType && dataType != FieldDataType._Unspecified)
            {
                fld.DataType = dataType;
            }

            Add(fld, (Common.Sql.RelationalOperators)relationalOperator, value, ignoreValue);
            return(this);
        }
예제 #21
0
        private ISqlGenerator Join(JoinOperator joinOperator, object leftSource, object rightSource,
                                   object left01, object right01, RelationalOperators relationalOperator01,
                                   object left02 = null, object right02 = null, RelationalOperators relationalOperator02 = RelationalOperators.Equal)
        {
            var conditionGenerator = new ConditionGenerator();

            var leftSourceRef  = leftSource is ISource ? (ISource)leftSource : new NamedSource((string)leftSource);
            var rightSourceRef = rightSource is ISource ? (ISource)rightSource : new NamedSource((string)rightSource);

            AddCondition(conditionGenerator, leftSourceRef, rightSourceRef, left01, right01, relationalOperator01);
            AddCondition(conditionGenerator, leftSourceRef, rightSourceRef, left02, right02, relationalOperator02);

            Join(GetSourceFromObject(rightSource), conditionGenerator, joinOperator);
            return(this);
        }
예제 #22
0
        protected virtual string CreateInConditionString(IField field, RelationalOperators op, object value)
        {
            var valueArray = value as IValueArray;

            if (valueArray != null)
            {
                return(CreateInConditionString(field, op, valueArray));
            }

            var v = value as IValue;

            if (v != null)
            {
                return(CreateInConditionString(field, op, v));
            }

            throw new NotSupportedException();
        }
예제 #23
0
        protected virtual string CreateFieldConditionString(string fieldName, RelationalOperators op, INullValue value)
        {
            var cond = string.Empty;

            if ((op & RelationalOperators.Equal) == RelationalOperators.Equal)
            {
                cond = string.Concat(fieldName, " Is Null");
                op   = op ^ RelationalOperators.Equal;
                if (op == 0)
                {
                    return(string.Concat(ConditionStringItemPrefix, cond, ConditionStringItemPostfix));
                }
            }

            var cond2 = string.Concat(fieldName, OperatorString(op), ValueConverter.ConvertValueToString(value));

            return(string.IsNullOrEmpty(cond2) ? cond : string.Concat("(", cond, " Or ", cond2, ")"));
        }
예제 #24
0
        public static string ToSqlString(this RelationalOperators relationalOperator)
        {
            var result = string.Empty;

            switch (relationalOperator)
            {
            case RelationalOperators.Equal:
                result = "=";
                break;

            case RelationalOperators.NotEqual:
                result = "!=";
                break;

            case RelationalOperators.GreaterThan:
                result = ">";
                break;

            case RelationalOperators.GreaterThanOrEqual:
                result = ">=";
                break;

            case RelationalOperators.LessThan:
                result = "<";
                break;

            case RelationalOperators.LessThanOrEqual:
                result = "<=";
                break;

            case RelationalOperators.Like:
                result = "like";
                break;

            case RelationalOperators.NotLike:
                result = "not like";
                break;
                //case RelationalOperators.IsNull:
                //case RelationalOperators.IsNotNull:
                //    throw new NotSupportedException($"{nameof(relationalOperator)} value of {relationalOperator.ToString()} can't be converted to String.");
            }
            return(result);
        }
예제 #25
0
        private static RelationalOperators RevertRelationalOperators(RelationalOperators op)
        {
            RelationalOperators newOp = 0;

            if ((op & RelationalOperators.GreaterThan) == RelationalOperators.GreaterThan)
            {
                newOp |= RelationalOperators.LessThan;
                op    -= RelationalOperators.GreaterThan;
            }

            if ((op & RelationalOperators.LessThan) == RelationalOperators.LessThan)
            {
                newOp |= RelationalOperators.GreaterThan;
                op    -= RelationalOperators.LessThan;
            }
            newOp |= op;

            return(newOp);
        }
예제 #26
0
        protected virtual string CreateFieldConditionString(string fieldName, RelationalOperators op, IValue value)
        {
            RelationalOperators valueOp = 0;

            if ((op & RelationalOperators.AddWildcardPrefix) == RelationalOperators.AddWildcardPrefix)
            {
                op      = op ^ RelationalOperators.AddWildcardPrefix;
                valueOp = valueOp | RelationalOperators.AddWildcardPrefix;
            }
            if ((op & RelationalOperators.AddWildcardSuffix) == RelationalOperators.AddWildcardSuffix)
            {
                op      = op ^ RelationalOperators.AddWildcardSuffix;
                valueOp = valueOp | RelationalOperators.AddWildcardSuffix;
            }

            var nullValue = value as INullValue;

            return(nullValue != null?CreateFieldConditionString(fieldName, op, nullValue) : string.Concat(ConditionStringItemPrefix, fieldName, OperatorString(op), ((valueOp != 0) && (value is ITextValue)) ? ValueConverter.ConvertValueToString((ITextValue)value, valueOp) : ValueConverter.ConvertValueToString(value), ConditionStringItemPostfix));
        }
예제 #27
0
        public static string GetRelationalOperators(RelationalOperators opt)
        {
            switch (opt)
            {
            case RelationalOperators.And:
            {
                return("AND");
            }

            case RelationalOperators.OR:
            {
                return("OR");
            }

            default:
            {
                return("AND");
            }
            }
        }
예제 #28
0
        protected virtual string OperatorString(RelationalOperators op)
        {
            switch (op)
            {
            case RelationalOperators.Like:
                return(" Like ");

            case RelationalOperators.Between:
                return(" Between ");

            case RelationalOperators.In:
                return(" In ");
            }

            var opString = string.Empty;

            if ((op & RelationalOperators.LessThan) == RelationalOperators.LessThan)
            {
                opString += "<";
                op       -= RelationalOperators.LessThan;
            }

            if ((op & RelationalOperators.GreaterThan) == RelationalOperators.GreaterThan)
            {
                opString += ">";
                op       -= RelationalOperators.GreaterThan;
            }

            if ((op & RelationalOperators.Equal) == RelationalOperators.Equal)
            {
                opString += "=";
                op       -= RelationalOperators.Equal;
            }

            if (op != 0)
            {
                throw new NotSupportedRelationalOperatorException(string.Concat(string.IsNullOrEmpty(opString) ? string.Empty : string.Concat("'", opString, "'", " and "), op, " is not supported."), op);
            }

            return(string.Format(" {0} ", opString));
        }
예제 #29
0
        private IConditionGroup AddInCondition(IField field, RelationalOperators relationalOperator, object value, object ignoreValue)
        {
            var valueArray = value as IValueArray;

            if (valueArray != null)
            {
                return(AddInCondition(field, relationalOperator, valueArray, ignoreValue));
            }

            var enumerable = value as IEnumerable;

            if (enumerable == null)
            {
                var v = TryCreateDataTypeConformValue(value, field.DataType);

                if (v == null)
                {
                    throw new InvalidCastException();
                }

                var values = new ValueArray(new[] { v });

                return(AddInCondition(field, relationalOperator, values, ignoreValue));
            }

            var valueList = new List <IValue>();

            foreach (var iv in from object v in enumerable select TryCreateDataTypeConformValue(v, field.DataType))
            {
                if (iv == null)
                {
                    throw new InvalidCastException();
                }

                valueList.Add(iv);
            }
            return(AddInCondition(field, relationalOperator, new ValueArray(valueList.ToArray()), ignoreValue));
        }
예제 #30
0
// ReSharper disable UnusedMethodReturnValue.Global
        public IConditionGroup Add(IField field, RelationalOperators relationalOperator, object value, object ignoreValue = null)
// ReSharper restore UnusedMethodReturnValue.Global
        {
            Add(field, (Common.Sql.RelationalOperators)((int)relationalOperator), value, ignoreValue);
            return(this);
        }