public static ITable SimpleSelect(this ITable table, IQueryContext context, ObjectName columnName, SqlExpressionType op, SqlExpression exp) { // Find the row with the name given in the condition. int column = table.FindColumn(columnName); if (column == -1) throw new ArgumentException(String.Format("Unable to find the column {0} in the condition.", columnName.Name)); // If we are doing a sub-query search if (op.IsSubQuery()) { // We can only handle constant expressions in the RHS expression, and // we must assume that the RHS is a Expression[] array. if (exp.ExpressionType != SqlExpressionType.Constant && exp.ExpressionType != SqlExpressionType.Tuple) throw new ArgumentException(); IEnumerable<SqlExpression> list; if (exp.ExpressionType == SqlExpressionType.Constant) { var tob = ((SqlConstantExpression) exp).Value; if (tob.Type is ArrayType) { var array = (SqlArray) tob.Value; list = array; } else { throw new Exception("Error with format or RHS expression."); } } else { list = ((SqlTupleExpression) exp).Expressions; } // Construct a temporary table with a single column that we are // comparing to. var col = table.TableInfo[column]; var ttable = TemporaryTable.SingleColumnTable(table.DatabaseContext, col.ColumnName, col.ColumnType); foreach (var expression in list) { var rowNum = ttable.NewRow(); var evalExp = (SqlConstantExpression)expression.Evaluate(context, null, null); ttable.SetValue(rowNum, 0, evalExp.Value); } ttable.BuildIndexes(); // Perform the any/all sub-query on the constant table. return table.SelectAnyAllNonCorrelated(new[] { columnName }, op, ttable); } { if (!exp.IsConstant()) throw new ArgumentException("The search expression is not constant."); var evalExp = exp.Evaluate(context, null); if (evalExp.ExpressionType != SqlExpressionType.Constant) throw new InvalidOperationException(); var value = ((SqlConstantExpression) evalExp).Value; IEnumerable<int> rows; if (op == SqlExpressionType.Like || op == SqlExpressionType.NotLike /* TODO: || op.IsOfType(BinaryOperatorType.Regex)*/) { /* TODO: if (op.IsOfType(BinaryOperatorType.Regex)) { rows = SelectFromRegex(column, op, value); } else { */ rows = table.SelectFromPattern(column, op, value); } else { // Is the column we are searching on indexable? var colInfo = table.TableInfo[column]; if (!colInfo.IsIndexable) throw new InvalidOperationException(String.Format("Column {0} os type {1} cannot be searched.", colInfo.ColumnName, colInfo.ColumnType)); rows = table.SelectRows(column, op, value); } return new VirtualTable(table, rows.ToArray()) {SortColumn = column}; } }