/* // $Id: //guest/julian_hyde/saffron/src/main/saffron/rel/convert/CollectionConverter.java#1 $ // Saffron preprocessor and data engine // Copyright (C) 2002 Julian Hyde <julian.hyde@mail.com> // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU Library General Public // License along with this library; if not, write to the // Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. // // See the COPYING file located in the top-level-directory of // the archive of this library for complete text of license. */ package saffron.rel.convert; import openjava.ptree.*; import saffron.opt.CallingConvention; import saffron.opt.Cluster; import saffron.opt.Implementor; import saffron.rel.Rel; import saffron.util.UnboundVariableCollector; import saffron.util.Util; /** * A <code>CollectionConverter</code> converts a plan from * <code>inConvention</code> to {@link CallingConvention#COLLECTION}. * * @author jhyde * @since 16 December, 2001 * @version $Id: //guest/julian_hyde/saffron/src/main/saffron/rel/convert/CollectionConverter.java#1 $ **/ class CollectionConverter extends Converter { Variable var_v; CollectionConverter(Cluster cluster, Rel child, int inConvention) { super(cluster, child, inConvention); } // implement Rel public Object clone() { return new CollectionConverter(cluster, child, inConvention); } public int getConvention() { return saffron.opt.CallingConvention.COLLECTION; } public static boolean canConvert(int inConvention) { return inConvention == CallingConvention.JAVA; } // implement Converter protected Object implementJava(Implementor implementor, int ordinal) { switch (ordinal) { case -1: // called from parent { // Find all unbound variables in expressions in this tree UnboundVariableCollector unboundVars = Util.getUnboundVariables(this); // Generate // new Object() { // /** Executes <code> ... </code>. **/ // ArrayList asArrayList(C0 v0, ...) { // ArrayList v = new ArrayList(); // <<child loop // v.addElement(i); // >> // return v; // } // }.asArrayList(v0, ...) this.var_v = implementor.newVariable(); implementor.setExitStatement( new ReturnStatement(var_v)); StatementList stmtList = new StatementList( // "ArrayList v = new ArrayList();" new VariableDeclaration( null, // no modifiers new TypeName("java.util.ArrayList"), new VariableDeclarator( var_v.toString(), new AllocationExpression( new TypeName("java.util.ArrayList"), null)))); // Give child chance to write its code into "stmtList" (and to // call us back so we can write "v.addElement(i);". implementor.pushStatementList(stmtList); Object o = implementor.implementChild(this, 0, child); Util.assert(o == null); implementor.popStatementList(); // "return v;" stmtList.add( new ReturnStatement( var_v)); // "public void asArrayList(C0 v0, ...) { ... }" MethodDeclaration asArrayList = new MethodDeclaration( new ModifierList(), new TypeName("java.util.ArrayList"), "asArrayList", unboundVars.getParameterList(), // "(C0 v0, ...)" null, // throws nothing stmtList); asArrayList.setComment( "/** Evaluates <code>" + cluster.getOriginalExpression().toString() + "</code> and returns the results as a vector. **/"); return new MethodCall( new AllocationExpression( new TypeName("Object"), // "Object" null, // "()" new MemberDeclarationList( asArrayList)), "asArrayList", unboundVars.getArgumentList()); } case 0: // called from child { // Generate // v.add(i) // Rowtype[] variable = <<child variable>>; // <<parent body (references variable)>> StatementList stmtList = implementor.getStatementList(); stmtList.add( new ExpressionStatement( new MethodCall( var_v, "add", new ExpressionList( Util.box( child.getRowType(), implementor.translateInput(this, 0)))))); return null; } default: throw Util.newInternal("implement: ordinal=" + ordinal); } } } // End CollectionConverter.java
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#3 | 1748 | Julian Hyde |
saffron: convert unit tests to JUnit; add CallingConvention.ITERABLE; lots of other stuff; release 0.1. |
||
#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. |