Beispiel #1
0
        public void Resolve(TableFilter filter, bool ownfilter)
        {
            if (eCondition != null)
            {
                // first set the table filter in the condition
                eCondition.Resolve(filter);

                if (filter != null && ownfilter)
                {
                    // the table filter tries to get as many conditions as possible
                    // but only if the table filter belongs to this query
                    filter.SetCondition(eCondition);
                }
            }

            int len = eColumn.Length;

            for (int i = 0; i < len; i++)
            {
                eColumn[i].Resolve(filter);
            }
        }
Beispiel #2
0
        /// <summary>
        /// Resolve the current expression.
        /// </summary>
        /// <param name="filter"></param>
        public void Resolve(TableFilter filter)
        {
            if (filter != null && _type == ExpressionType.DatabaseColumn)
            {
                if (sTable == null || filter.Name.Equals(sTable))
                {
                    int i = filter.Table.SearchColumn(sColumn);

                    if (i != -1)
                    {
                        // todo: other error message: multiple tables are possible
                        Trace.Check(tFilter == null || tFilter == filter,
                                    Trace.COLUMN_NOT_FOUND, sColumn);

                        tFilter     = filter;
                        iColumn     = i;
                        sTable      = filter.Name;
                        _columnType = filter.Table.GetColumnType(i);
                    }
                }
            }

            // currently sets only data type
            // todo: calculate fixed expressions if possible
            if (eArg != null)
            {
                eArg.Resolve(filter);
            }

            if (eArg2 != null)
            {
                eArg2.Resolve(filter);
            }

            if (sSelect != null)
            {
                sSelect.Resolve(filter, false);
                sSelect.Resolve();
            }

            if (fFunction != null)
            {
                fFunction.Resolve(filter);
            }

            if (_columnType != ColumnType.Null)
            {
                return;
            }

            switch (_type)
            {
            case ExpressionType.Function:
                _columnType = fFunction.GetReturnType();
                break;

            case ExpressionType.Query:
                _columnType = sSelect.eColumn[0].ColumnType;
                break;

            case ExpressionType.Negate:
                _columnType = eArg.ColumnType;
                break;

            case ExpressionType.Add:
            case ExpressionType.Subtract:
            case ExpressionType.Multiply:
            case ExpressionType.Divide:
                _columnType = eArg._columnType;
                break;

            case ExpressionType.Concat:
                _columnType = ColumnType.VarChar;
                break;

            case ExpressionType.Not:
            case ExpressionType.BiggerEqual:
            case ExpressionType.Bigger:
            case ExpressionType.Smaller:
            case ExpressionType.SmallerEqual:
            case ExpressionType.NotEqual:
            case ExpressionType.Like:
            case ExpressionType.And:
            case ExpressionType.Or:
            case ExpressionType.In:
            case ExpressionType.Exists:
                _columnType = ColumnType.Bit;
                break;

            case ExpressionType.Equal:
                if (this.IsVarAssign)
                {
                    _columnType = eArg2.ColumnType;
                }
                else
                {
                    _columnType = ColumnType.Bit;
                }
                break;

            case ExpressionType.Count:
                _columnType = ColumnType.Integer;
                break;

            case ExpressionType.Maximum:
            case ExpressionType.Minimum:
            case ExpressionType.Sum:
            case ExpressionType.Average:
                _columnType = eArg.ColumnType;
                break;

            case ExpressionType.Convert:
                // it is already set
                break;

            case ExpressionType.IfNull:
            case ExpressionType.CaseWhen:
                _columnType = eArg2.ColumnType;
                break;

            case ExpressionType.Variable:
                _columnType = eArg.ColumnType;
                break;
            }
        }