/* // $Id: //guest/julian_hyde/saffron/src/main/openjava/ptree/QueryExpression.java#1 $ // (C) Copyright 2001 Broadbase Software, Inc. // jhyde, 18 March, 2001 */ package openjava.ptree; import openjava.mop.*; import openjava.ptree.util.*; import openjava.mop.Toolbox; import java.io.StringWriter; import java.io.PrintWriter; /** * <code>QueryExpression</code> is a <code>select ... group by ... from * ... where ... order by ...</code> expression. When used as an expression, * it evaluates to an array, but you can also use it inside a <code>for * (<i>variable</i> in select ...)</code> construct. When used in this way, it * is evaluated as an iterator. * * <p> A null <code>groupList</code> means don't aggregate, whereas an empty * <code>groupList</code> means group by the 0-tuple <code>{}</code>, which * produces a single row even if there are no input rows. **/ public class QueryExpression extends SetExpression { boolean boxed; public QueryExpression( ExpressionList selectList, boolean boxed, ExpressionList groupList, Expression from, Expression where, ExpressionList sortList) { if (selectList == null) { selectList = new ExpressionList(); Expression[] expressions = SetExpression.flatten(from); for (int i = 0; i < expressions.length; i++) { String alias = Toolbox.getAlias(expressions[i]); selectList.add(new Variable(alias)); } boxed = (expressions.length != 1); } this.boxed = boxed; if (!boxed) { Toolbox.assert(selectList.size() == 1); } set(selectList, groupList, from, where, sortList); } public ExpressionList getSelectList() { return (ExpressionList) elementAt(0); } public boolean isBoxed() { return boxed; } public ExpressionList getGroupList() { return (ExpressionList) elementAt(1); } public Expression getFrom() { return (Expression) elementAt(2); } public Expression getWhere() { return (Expression) elementAt(3); } public ExpressionList getSort() { return (ExpressionList) elementAt(4); } public void accept(ParseTreeVisitor v) throws ParseTreeException { v.visit(this); } // implement SetExpression public OJClass deriveRowType(Environment env) throws Exception { QueryEnvironment queryEnv = new QueryEnvironment(env, this); ExpressionList selectList = getSelectList(); if (!boxed) { Toolbox.assert(selectList.size() == 1); Expression select = selectList.get(0); return Toolbox.getType(queryEnv, select); } Expression[] selects = Toolbox.toArray(selectList); OJClass clazz = queryEnv.lookupClass(queryEnv.currentClassName()); return SyntheticClass.createProject(queryEnv, clazz, selects, null); } }; // End QueryExpression.java
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#3 | 1801 | Julian Hyde |
saffron: add ObjectSchema; rules can now be matched more than once; started to implement correlations in queries in from list. |
||
#2 | 1474 | Julian Hyde |
saffron: Aggregations are working. Renamed 'aggregator' to 'aggregation'. |
||
#1 | 1467 | Julian Hyde |
saffron: First saffron check-in; incorporate my changes to openjava. |