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); } }
/// <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; } }