/* XXL: The eXtensible and fleXible Library for data processing Copyright (C) 2000-2011 Prof. Dr. Bernhard Seeger Head of the Database Research Group Department of Mathematics and Computer Science University of Marburg Germany This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; If not, see <http://www.gnu.org/licenses/>. http://code.google.com/p/xxl/ */ package xxl.core.xxql; import java.lang.reflect.ParameterizedType; import java.lang.reflect.TypeVariable; import java.sql.SQLException; import java.util.Iterator; import xxl.core.functions.Functional.BinaryFunction; import xxl.core.functions.Functional.UnaryFunction; import xxl.core.relational.metaData.ColumnMetaData; import xxl.core.relational.tuples.ArrayTuple; import xxl.core.relational.tuples.Tuple; import xxl.core.xxql.AdvResultSetMetaData; import xxl.core.xxql.AdvTupleCursor; import xxl.core.xxql.columns.Column; public class NewLINQFunctions { /** * Test Method * @param function * @param arg1 * @param arg2 * @return */ //TODO: Methadaten public static <O> Column tupleFunction(final String name, final UnaryFunction<Tuple, O> function){ return new Column(function, name, null){ O obj; @Override public Object invoke(Tuple tuple) { obj = function.invoke(tuple); return obj; } @Override public void setMetaData(AdvResultSetMetaData metadata, String newAlias) { Class cls = null; try { TypeVariable[] typevars = function.getClass().getTypeParameters(); System.out.println(typevars.length); for(TypeVariable tv : typevars){ System.out.println("TADA: " + tv.toString()); } String className = ((ParameterizedType) (function.getClass().getGenericInterfaces()[0])).getActualTypeArguments()[1].toString(); System.out.println("NLF: " +className); if (className.startsWith("class")) { className = className.substring(6); }else if(className.contains("<")){ className = className.substring(0, className.indexOf("<")); } System.out.println(className); cls = Class.forName(className); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } columnMetaData = AdvResultSetMetaData.createColumnMetaData(cls, this.columnAlias, name); } }; } /** * Test Method * @param function * @param arg1 * @param arg2 * @return */ public static <I, O> Column function(String name, final UnaryFunction< I , O > function, final Column arg0){ return new Column(function, name, null){ @Override public void setMetaData(AdvResultSetMetaData metadata, String newAlias) { super.setMetaData(metadata, newAlias); // pass meta data to argument cols arg0.setMetaData(metadata, newAlias); this.useLeftTuple = arg0.useLeftTuple; } @Override public void setMetaDatas(AdvResultSetMetaData leftMetaData, AdvResultSetMetaData rightMetaData) { // TODO Auto-generated method stub super.setMetaDatas(leftMetaData, rightMetaData); arg0.setMetaDatas(leftMetaData, rightMetaData); this.useLeftTuple = arg0.useLeftTuple; } @Override public Object invoke(Tuple tuple) { Object argument = arg0.invoke(tuple); return function.invoke((I)argument); } }; } /** * Test Method * @param function * @param arg1 * @param arg2 * @return */ public static <I1, I2, O> Column function(String name, final BinaryFunction< I1 , I2, O > function, final Column arg0, final Column arg1){ return new Column(function, name, null){ @Override public void setMetaData(AdvResultSetMetaData metadata, String newAlias) { super.setMetaData(metadata, newAlias); // pass meta data to argument cols arg0.setMetaData(metadata, newAlias); arg1.setMetaData(metadata, newAlias); } @Override public Object invoke(Tuple tuple) { Object argument0 = arg0.invoke(tuple); Object argument1 = arg1.invoke(tuple); return function.invoke((I1)argument0, (I2)argument1); } }; } public static AdvTupleCursor expand(final AdvTupleCursor src, final Column column) { String newTableAlias = null; if(newTableAlias == null) newTableAlias = src.getResultSetMetaData().getAlias(); int columnscount = 0; try { columnscount = src.getResultSetMetaData().getColumnCount(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } Column[] columns = new Column[columnscount]; for(int i = 0; i < columns.length; i++){ columns[i] = new Column(i+1); columns[i].setMetaData(src.getResultSetMetaData(), newTableAlias); } column.setMetaData(src.getResultSetMetaData(), newTableAlias); ColumnMetaData[] cmds = new ColumnMetaData[columnscount+1]; for(int i=0; i < cmds.length-1; i++){ cmds[i] = columns[i].getColumnMetaData(); } cmds[cmds.length-1] = AdvResultSetMetaData.createColumnMetaData(Object.class, "expand", newTableAlias); AdvResultSetMetaData metadata = new AdvResultSetMetaData(newTableAlias, cmds); AdvTupleCursor ret = new AdvTupleCursor(src, null, metadata, src){ Iterator colDataToExpand = null; Tuple actTuple; Object actValue = null; @Override protected boolean hasNextObject() { if(actTuple == null){ actTuple = src.next(); } if (colDataToExpand== null){ //System.out.println((actTuple.getObject(col.getColumnIndex())).getClass()); colDataToExpand = ((java.util.AbstractCollection) (actTuple.getObject(column.getColumnIndex()))).iterator(); } if(colDataToExpand.hasNext()){ return true; }else{ if(src.hasNext()){ actTuple = src.next(); colDataToExpand = null; return hasNextObject(); }else{ return false; } } } @Override protected Tuple nextObject() { if(!hasNextObject()){ throw new NullPointerException("DING DONG"); } Object actValue = colDataToExpand.next(); Tuple leftTuple = new ArrayTuple(actValue); // System.out.println("!" + actTuple); // System.out.println("*" + leftTuple); Tuple retTuple = concatTuples(actTuple,leftTuple, actTuple.getColumnCount(), leftTuple.getColumnCount()); return retTuple; } }; //METADATA !!! return ret; } }