return ColumnExpressions.singleColumn(left.reader, result);
}
@Override public ColumnExpressions<?> virtualMethodCallValue(MethodCallValue.VirtualMethodCallValue val, Void in) throws TypedValueVisitorException
{
MethodSignature sig = val.getSignature();
if (TransformationClassAnalyzer.newPair.equals(sig)
|| TransformationClassAnalyzer.newTuple3.equals(sig)
|| TransformationClassAnalyzer.newTuple4.equals(sig)
|| TransformationClassAnalyzer.newTuple5.equals(sig)
|| TransformationClassAnalyzer.newTuple8.equals(sig))
{
ColumnExpressions<?> [] vals = new ColumnExpressions<?> [val.args.size()];
for (int n = 0; n < vals.length; n++)
vals[n] = val.args.get(n).visit(this, in);
RowReader<?> [] valReaders = new RowReader[vals.length];
for (int n = 0; n < vals.length; n++)
valReaders[n] = vals[n].reader;
ColumnExpressions<?> toReturn = new ColumnExpressions<>(TupleRowReader.createReaderForTuple(sig.owner, valReaders));
for (int n = 0; n < vals.length; n++)
toReturn.columns.addAll(vals[n].columns);
return toReturn;
}
else if (metamodel.isFieldGetterMethod(sig))
{
Field<?> field = metamodel.fieldMethodToField(sig);
ColumnExpressions<?> base = val.base.visit(this, in);
if (!(base.reader instanceof TableRowReader))
throw new TypedValueVisitorException("Expecting a table");
TableRowReader<?> tableReader = (TableRowReader<?>)base.reader;
RowReader<?> columnReader = tableReader.getReaderForField(field);
ColumnExpressions<?> newColumns = new ColumnExpressions<>(columnReader);
int idx = tableReader.getIndexForField(field);
for (int n = 0; n < columnReader.getNumColumns(); n++)
newColumns.columns.add(base.columns.get(n + idx));
return newColumns;
}
else if (MetamodelUtil.TUPLE_ACCESSORS.containsKey(sig))
{
int idx = MetamodelUtil.TUPLE_ACCESSORS.get(sig) - 1;
ColumnExpressions<?> base = val.base.visit(this, in);
RowReader<?> subreader = ((TupleRowReader<?>)base.reader).getReaderForIndex(idx);
ColumnExpressions<?> toReturn = new ColumnExpressions<>(subreader);
int baseOffset = ((TupleRowReader<?>)base.reader).getColumnForIndex(idx);
for (int n = 0; n < subreader.getNumColumns(); n++)
toReturn.columns.add(base.columns.get(n + baseOffset));
return toReturn;
}
else if (sig.equals(TransformationClassAnalyzer.integerIntValue)
|| sig.equals(TransformationClassAnalyzer.doubleDoubleValue))
{
ColumnExpressions<?> base = val.base.visit(this, in);
return base;
}
// else if (entityInfo.dbSetMethods.contains(sig))