
prerna.query.querystruct.GenExpression Maven / Gradle / Ivy
The newest version!
package prerna.query.querystruct;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import prerna.query.querystruct.selectors.IQuerySelector;
import prerna.query.querystruct.selectors.QueryColumnSelector;
public class GenExpression extends SelectQueryStruct implements IQuerySelector, Serializable {
// if composite is set then you basically have 2 sides
// if not just one side
public boolean composite = false;
public GenExpression parent = null;
public boolean recursive = false; // ((a+b)+c)*d) - 2 values - tree out of the expression
public boolean telescope = false; // join - <- within it join join (select a, b,c from d) a - GenExpression1(telescope = true, alias=a).body(GenExpression2(select a, b,c from d))
public Object rightItem = null; // rightitem - GenExpression / Value / Scalar etc.
public Object leftItem = null; // left item blah blah
// put the table name as well
public String tableName = null;
public String tableAlias = null;
String rightAlias = null;
String rightExpr = null;
public String leftAlias = null; // used all the time
String leftExpr = null; // left expression - string of the sql being used
String on = null;
String expression = null; // expression
SelectQueryStruct item = null;
String alias = null;
public String aQuery = null;
public boolean neutralize = false; // removes this from the overall string when printed
public boolean paranthesis = false;
public String userTableName = null;
public String userTableAlias = null;
public boolean distinct = false;
public List withFrom = null;
public List withList = null;
public void setRightExpresion(Object rightItem)
{
this.rightItem = rightItem;
if(rightItem instanceof GenExpression)
((GenExpression)rightItem).parent = this;
}
public void setLeftExpresion(Object leftItem)
{
this.leftItem = leftItem;
if(leftItem instanceof GenExpression)
((GenExpression)leftItem).parent = this;
}
public void setExpression(String expression)
{
this.expression = expression;
}
public void setFromItem(SelectQueryStruct item)
{
this.item = item;
}
public void setComposite(boolean composite)
{
this.composite = composite;
}
public void setLeftExpr(String expr)
{
this.leftExpr = expr;
}
public void setRightExpr(String expr)
{
this.rightExpr = expr;
}
public void setLeftAlias(String leftAlias)
{
this.leftAlias = leftAlias;
}
public String getLeftAlias()
{
return leftAlias;
}
public void setOn(String on)
{
this.expression = on;
this.on = on;
}
public void setOperation(String operation)
{
this.operation = operation;
}
public String getLeftExpr()
{
return this.leftExpr;
}
public String getOperation()
{
return this.operation;
}
public void setWithFrom(List withFrom)
{
this.withFrom = withFrom;
}
public List getWithFrom()
{
return this.withFrom;
}
public void setWithList(List withList)
{
this.withList = withList;
}
public List getWithList()
{
return this.withList;
}
@Override
public SELECTOR_TYPE getSelectorType() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getAlias() {
// TODO Auto-generated method stub
return alias;
}
@Override
public void setAlias(String alias) {
// TODO Auto-generated method stub
this.alias = alias;
}
@Override
public boolean isDerived() {
// TODO Auto-generated method stub
return false;
}
@Override
public String getDataType() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getQueryStructName() {
// TODO Auto-generated method stub
return null;
}
@Override
public List getAllQueryColumns() {
// TODO Auto-generated method stub
return null;
}
public String toString()
{
return aQuery;
}
public static StringBuffer printQS(GenExpression qs, StringBuffer buf)
{
// if the type is join.. you need to do other things
//System.err.println("Processing " + qs.aQuery + " <>" + qs.expression + "<>" + qs.operation);
String newLine = "\n";
if(buf == null) {
buf = new StringBuffer();
}
boolean processed = false;
if(qs.withFrom != null && qs.withFrom.size() > 0)
{
buf.append("WITH ");
for(int i=0;i0){
buf.append(",");
}
buf.append(qs.withFrom.get(i));
buf.append(" AS (");
printQS(qs.withList.get(i),buf);
buf.append(") ");
}
}
if(qs != null && qs.operation != null && !qs.neutralize) {
if(qs.operation.equalsIgnoreCase("select") || qs.operation.equalsIgnoreCase("querystruct")) {
buf.append(newLine);
buf.append("SELECT ");
if(qs.distinct) {
buf.append(" DISTINCT ");
}
for(int selIndex = 0;selIndex < qs.nselectors.size();selIndex++) {
GenExpression sqs = qs.nselectors.get(selIndex);
// need to handle telescope
StringBuffer newBuf = printQS(sqs, null);
if(newBuf != null && newBuf.length() > 0) {
if(selIndex > 0) {
buf.append(", ");
}
if(sqs.operation != null && sqs.operation.equalsIgnoreCase("querystruct")) {
buf.append("(");
}
buf.append(newBuf);
if(sqs.operation != null && sqs.operation.equalsIgnoreCase("querystruct")) {
buf.append(")");
}
}
/*// if it is a column I need to put alias too
else if(sqs.operation.equalsIgnoreCase("column") || sqs.operation.equalsIgnoreCase("double") || sqs.operation.equalsIgnoreCase("date") || sqs.operation.equalsIgnoreCase("time") || sqs.operation.equalsIgnoreCase("string") )
{
buf.append(sqs.leftExpr);
if(sqs.leftAlias != null)
buf.append(" as ").append(sqs.leftAlias);
}
// need to handle the union, case, between
// add the alias
if(sqs.alias != null)
buf.append("as " + sqs.alias);
*/
}
processed = true;
}
else if(qs.operation.equalsIgnoreCase("column"))
{
String columnName = qs.leftExpr;
//if(!columnName.startsWith("\""))
// columnName = "\"" + columnName + "\"";
if(qs.paranthesis) {
buf.append("(");
}
// table prefix on selectors necessary to disambiguate when join columns have same name
if(qs.userTableAlias != null && !qs.userTableAlias.isEmpty()) {
buf.append(qs.userTableAlias).append(".");
} else if(qs.userTableName != null && !qs.userTableName.isEmpty()) {
buf.append(qs.userTableName).append(".");
}
// else if(qs.tableAlias != null && !qs.tableAlias.isEmpty()) {
// buf.append(qs.tableAlias).append(".");
// } else if(qs.tableName != null && !qs.tableName.isEmpty()){
// buf.append(qs.tableName).append(".");
// }
buf.append(columnName);
if(qs.leftAlias != null && qs.leftAlias.length() > 0) {
buf.append(" as ").append(qs.leftAlias);
}
if(qs.paranthesis) {
buf.append(")");
}
processed = true;
}
else if(qs.operation.equalsIgnoreCase("double") || qs.operation.equalsIgnoreCase("date") || qs.operation.equalsIgnoreCase("time") || qs.operation.equalsIgnoreCase("string") || qs.operation.equalsIgnoreCase("long"))
{
buf.append(qs.leftItem);
if(qs.leftAlias != null && qs.leftAlias.length() > 0)
buf.append(" as ").append(qs.leftAlias);
processed = true;
}
else if(qs.operation.equalsIgnoreCase("opaque"))
{
buf.append(qs.getLeftExpr());
if(qs.leftAlias != null && qs.leftAlias.length() > 0)
buf.append(" as ").append(qs.leftAlias);
processed = true;
}
else if(qs.operation.equalsIgnoreCase("from") && !qs.composite)
{
buf.append(qs.getLeftExpr());
if(qs.leftAlias != null && qs.leftAlias.length() > 0)
buf.append(" as ").append(qs.leftAlias);
processed = true;
}
else if(qs.operation.equalsIgnoreCase("allcol"))
{
buf.append("*");
processed = true;
}
else if(qs.composite)
{
//System.err.println(" hmm.. from is composite.. but simple ? " + qs.aQuery);
}
}
if(qs.operation != null && qs.operation.contains("union") && !qs.neutralize)
{
//System.err.println("And now we are getting the union " + qs);
// process the left and right
//
OperationExpression opex = (OperationExpression)qs;
List operands = opex.operands;
List opNames = opex.opNames;
for(int opIndex = 0;opIndex < opNames.size();opIndex++)
{
if(opIndex == 0)
printQS((GenExpression)operands.get(opIndex), buf);
buf.append(" ").append(opNames.get(opIndex)).append(" ");
printQS((GenExpression)operands.get(opIndex+1), buf);
}
processed = true;
}
if(qs.operation != null && qs.operation.equalsIgnoreCase("between") && !qs.neutralize)
{
processed = true;
buf.append(" ");
printQS((GenExpression)qs.body, buf);
buf.append(" BETWEEN ");
printQS((GenExpression)qs.leftItem, buf);
buf.append(" AND ");
printQS((GenExpression)qs.rightItem, buf);
processed = true;
}
if(qs.operation != null && qs.operation.equalsIgnoreCase("cast") && !qs.neutralize)
{
// name of the function is in the left alias
buf.append("CAST ").append("(");
if(qs.leftItem != null && qs.leftItem instanceof GenExpression) {
printQS((GenExpression)qs.leftItem, buf);
} else {
buf.append(qs.leftItem);
}
buf.append(")");
if(qs.leftAlias != null) {
buf.append(" AS ").append(qs.leftAlias);
}
processed = true;
}
if(qs.operation != null && qs.operation.equalsIgnoreCase("function") && !qs.neutralize)
{
FunctionExpression thisExpr = (FunctionExpression)qs;
if(!thisExpr.neutralizeFunction)
{
buf.append(thisExpr.expression).append("(");
if(qs.distinct)
buf.append(" DISTINCT ");
}
else if(thisExpr.expressions.size() == 1)
{
buf.append("(");
if(qs.distinct)
buf.append(" DISTINCT ");
}
// name of the function is in the left alias
//buf.append(qs.expression).append("(");
List parameters = thisExpr.expressions;
for(int paramIndex = 0;paramIndex < parameters.size();paramIndex++)
{
if(paramIndex > 0)
buf.append(", ");
printQS(parameters.get(paramIndex), buf);
}
buf.append(")");
if(qs.leftAlias != null)
buf.append(" AS ").append(qs.leftAlias);
processed = true;
}
if(qs.operation != null && qs.operation.equalsIgnoreCase("isnull") && !qs.neutralize)
{
// name of the function is in the left alias
printQS((GenExpression)qs.leftItem, buf);
buf.append(" IS NULL ");
if(qs.leftAlias != null)
buf.append(" AS ").append(qs.leftAlias);
processed = true;
}
// need to handle telescope
if(!processed && !qs.neutralize)
{
if(qs.recursive)
{
printQSRecursive(qs, buf);
if(qs.leftAlias != null)
buf.append(qs.leftAlias);
}
else if(qs instanceof WhenExpression)
{
buf.append(((WhenExpression)qs).printOutput());
}
else if(qs instanceof InGenExpression)
{
InGenExpression ig = (InGenExpression)qs;
if(qs.leftItem != null) {
printQS((GenExpression)qs.leftItem, buf);
}
if(ig.isNot()) {
buf.append(" NOT IN ");
} else {
buf.append(" IN ");
}
if(ig.inList.size() > 0 && ig.rightItem == null)
{
// process the list
// I have made this opaque
for(int itemIndex = 0;itemIndex < ig.inList.size();itemIndex++)
{
if(itemIndex != 0)
buf.append(", ");
StringBuffer newBuf = printQS(ig.inList.get(itemIndex), null);
if(!newBuf.toString().startsWith("("))
buf.append("(");
buf.append(newBuf);
if(!newBuf.toString().endsWith(")"))
buf.append(")");
}
//buf.append(")");
}
else if(qs.rightItem != null && qs.rightItem instanceof GenExpression)
{
buf.append("(");
// when you have where column1 in ( subquery )
// the subquery is stored it is stored in the body
if( ((GenExpression)qs.rightItem).telescope) {
printQS( ((GenExpression)qs.rightItem).body, buf);
} else {
printQS((GenExpression)qs.rightItem, buf);
}
buf.append(")");
}
processed = true;
}
// this also needs to be neutralized
else if(qs.leftItem != null && qs.rightItem != null) // this is expression
{
// dont know how to handle this yet
// fun stuff we are going to go into a recursion again
Object leftItem = (GenExpression)qs.leftItem;
Object rightItem = (GenExpression)qs.rightItem;
if(leftItem instanceof GenExpression && ((GenExpression)leftItem).paranthesis)
buf.append("(");
// this is where we need to do the paranthesis again I think
printQS((GenExpression)qs.leftItem, buf);
if(leftItem instanceof GenExpression && ((GenExpression)leftItem).paranthesis)
buf.append(")");
buf.append(qs.operation);
if(rightItem instanceof GenExpression && ((GenExpression)rightItem).paranthesis)
buf.append("(");
printQS((GenExpression)qs.rightItem, buf);
if(rightItem instanceof GenExpression && ((GenExpression)rightItem).paranthesis)
buf.append(")");
}
else if(qs.telescope && !qs.body.neutralize)
{
// need to acomodate when it is neutralize
buf.append("(");
printQS((GenExpression)qs.body, buf);
buf.append(")");
if(qs.leftAlias != null && qs.leftAlias.length() > 0)
buf.append(" AS ").append(qs.leftAlias);
}
else if(qs.leftExpr != null) // accomodating for the paranthesis from
{
buf.append(qs.leftExpr);
}
else if(qs.operation == null)
{
//System.err.println("Dont know to handle " + qs.aQuery + "<> " + qs.operation);
}
}
// like the filter
// add the from
if(qs.from != null)
{
// put the paranthesis if it is another select
//if(qs.from.operation != null && qs.from.operation.equalsIgnoreCase("querystruct"))
{
//System.err.println("From operation is set to " + qs.from.operation + " composite ?" + qs.from.composite );
buf.append(newLine);
buf.append(" FROM " );
if(qs.from.composite)
buf.append("( ");
printQS(qs.from, buf);
if(qs.from.composite)
{
buf.append(") ");
if(qs.from.getLeftAlias() != null && qs.from.getLeftAlias().length() > 0)
buf.append("AS " + qs.from.getLeftAlias());
}
}
/*
else
{
buf.append(" FROM " );
if(qs.from.leftExpr != null)
buf.append(qs.from.leftExpr).append(" ");
if(qs.from.leftAlias != null)
buf.append(qs.from.leftAlias).append(" ");
}*/
}
// add the joins finally
for(int joinIndex = 0;joinIndex < qs.joins.size();joinIndex++)
{
//System.err.println("Selector Buf so far " + buf);
GenExpression sqs = qs.joins.get(joinIndex);
buf.append(" ");
String open = "";
String close = "";
// I also need to pick the from here
// this is is the inner join on
// how to tell if a join is a subjoin ?
if(sqs.from != null && !sqs.neutralize)
{
buf.append(newLine);
buf.append(sqs.on);
buf.append(" ");
if(sqs.from != null && sqs.from.composite)
buf.append("(");
printQS(sqs.from, buf);
if(sqs.from != null && sqs.from.composite)
buf.append(")");
if(sqs.from.leftAlias != null)
buf.append(" AS ").append(sqs.from.leftAlias);
}
if(sqs.body != null && sqs.body.operation.equalsIgnoreCase("querystruct") && !sqs.neutralize)
{
open = "(";
close = ") ";
}
// process this as a query struct
if(sqs.body != null && !sqs.neutralize)
{
buf.append(" on ");
buf.append(open);
printQS(sqs.body, buf);
buf.append(close);
}
}
// add the where
if(qs.filter != null)
{
StringBuffer newBuf = printQS(qs.filter, null);
if(newBuf != null && newBuf.length() > 0)
{
buf.append(newLine);
buf.append(" WHERE " );
buf.append(newBuf);
}
}
// add the groupby
if(qs.ngroupBy.size() > 0)
{
buf.append(" GROUP BY " );
for(int groupIndex = 0;groupIndex < qs.ngroupBy.size();groupIndex++)
{
if(groupIndex != 0)
buf = buf.append(" , ");
GenExpression gep = qs.ngroupBy.get(groupIndex);
if(!gep.neutralize) // accomodating if it has been removed
{
if(gep.composite)
buf.append("(");
printQS(gep, buf);
if(gep.composite)
buf.append(")");
}
}
}
// add the order
if(qs.norderBy.size() > 0)
{
buf.append(" ORDER BY " );
for(int orderIndex = 0;orderIndex < qs.norderBy.size();orderIndex++)
{
if(orderIndex != 0)
buf = buf.append(" , ");
GenExpression gep = qs.norderBy.get(orderIndex).body;
if(!gep.neutralize) // accomodating if it has been removed
{
if(gep.composite)
buf.append("(");
printQS(gep, buf);
if(gep.composite)
buf.append(")");
buf.append(" ");
String direction = ((OrderByExpression)qs.norderBy.get(orderIndex)).direction;
if(direction.length() > 0)
buf.append(direction);
}
}
}
// limit and offset
if(qs.limit != -1)
buf.append(" LIMIT ").append(qs.limit);
if(qs.offset != -1)
buf.append(" OFFSET ").append(qs.offset);
return buf;
}
public static StringBuffer printQSRecursive(GenExpression qs, StringBuffer buf)
{
Object leftItem = qs.leftItem;
Object rightItem = qs.rightItem;
String operation = qs.operation;
// Account for when it is an or and both left item and right item are neutralized
//if(leftItem != null && leftItem instanceof GenExpression && ((GenExpression)leftItem).neutralize && rightItem != null && rightItem instanceof GenExpression && ((GenExpression)rightItem).neutralize)
// return buf.append("(1 = 1) ");
if(leftItem instanceof GenExpression)
{
if(!((GenExpression)leftItem).neutralize)
{
// need to know if I need to put a paranthesis around this or not
Object childLeftItem = ((GenExpression)leftItem).leftItem;
Object childRightItem = ((GenExpression)leftItem).rightItem;
StringBuffer leftBuf = printQS((GenExpression)leftItem, new StringBuffer()); // need to account for neutralize here
if(leftBuf.length() > 0)
{
if((childLeftItem != null && childLeftItem instanceof GenExpression && ((GenExpression)childLeftItem).composite)
&& (childRightItem != null && childRightItem instanceof GenExpression && ((GenExpression)childRightItem).composite))
{
buf.append("(");
buf.append(leftBuf);
buf.append(")");
}
else
buf.append(leftBuf).append(" ");
}
else if(operation.equalsIgnoreCase("and"))
{
// get the "and" gen expression to be added
// True and True = True
// False and True = false;
buf.append("1 = 1");
}
else if(operation.equalsIgnoreCase("or"))
{
// get the "or" gen expression to be added
// True or False = True
// False or False = False
buf.append("1 = 0");
}
}
}
else
buf.append(qs.leftItem).append(" ");
if(operation != null)
buf.append(" ").append(operation).append(" ");
if(rightItem instanceof GenExpression)
{
if(!((GenExpression)rightItem).neutralize)
{
// need to know if I need to put a paranthesis around this or not
Object childLeftItem = ((GenExpression)rightItem).leftItem;
Object childRightItem = ((GenExpression)rightItem).rightItem;
StringBuffer rightBuf = printQS((GenExpression)rightItem, new StringBuffer());
if(rightBuf.length() > 0)
{
if((childLeftItem != null && childLeftItem instanceof GenExpression && ((GenExpression)childLeftItem).composite) && (childRightItem != null && childLeftItem instanceof GenExpression && ((GenExpression)childRightItem).composite))
{
buf.append("(");
buf.append(rightBuf);
buf.append(")");
}
else
buf.append(rightBuf).append(" ");
}
else if(operation.equalsIgnoreCase("and"))
{
// get the "and" gen expression to be added
// True and True = True
// False and True = false;
buf.append("1 = 1 ");
}
else if(operation.equalsIgnoreCase("or"))
{
// get the "or" gen expression to be added
// True or False = True
// False or False = False
buf.append("1 = 0 ");
}
}
}
else
buf.append(qs.rightItem).append(" ");
return buf;
}
// public void replaceTableAlias(GenExpression gep, String oldName, String newName)
// {
// // if this is an operation
// if(gep.operation.equalsIgnoreCase("column"))
// gep.tableName = newName;
//
// // operation
// else if(gep.leftItem != null && gep.rightItem != null)
// {
// if(gep.leftItem instanceof GenExpression)
// replaceTableAlias((GenExpression)gep.leftItem, oldName, newName);
// if(gep.rightItem instanceof GenExpression)
// replaceTableAlias((GenExpression)gep.rightItem, oldName, newName);
// }
// }
// recursively goes through and replaces column table name
public void replaceTableAlias2(GenExpression qs, String oldName, String newName)
{
// if the type is join.. you need to do other things
//System.err.println("Processing " + qs.aQuery + " <>" + qs.expression + "<>" + qs.operation);
boolean processed = false;
if(qs != null && qs.operation != null)
{
if(qs.operation.equalsIgnoreCase("select") || qs.operation.equalsIgnoreCase("querystruct"))
{
for(int selIndex = 0;selIndex < qs.nselectors.size();selIndex++)
{
GenExpression sqs = qs.nselectors.get(selIndex);
replaceTableAlias2(sqs, oldName, newName);
}
processed = true;
}
if(qs.operation.equalsIgnoreCase("column"))
{
if(qs.tableName != null && oldName!= null &&qs.tableName.equalsIgnoreCase(oldName))
qs.tableName = newName;
else if(oldName == null)
qs.tableName = newName;
}
}
if(qs.operation != null && qs.operation.contains("union"))
{
//System.err.println("And now we are getting the union " + qs);
// process the left and right
//
OperationExpression opex = (OperationExpression)qs;
List operands = opex.operands;
List opNames = opex.opNames;
for(int opIndex = 0;opIndex < opNames.size();opIndex++)
{
if(opIndex == 0)
replaceTableAlias2((GenExpression)operands.get(opIndex), oldName, newName);
replaceTableAlias2((GenExpression)operands.get(opIndex+1), oldName, newName);
}
processed = true;
}
if(qs.operation != null && qs.operation.equalsIgnoreCase("between"))
{
processed = true;
replaceTableAlias2((GenExpression)qs.body, oldName, newName);
replaceTableAlias2((GenExpression)qs.leftItem, oldName, newName);
replaceTableAlias2((GenExpression)qs.rightItem, oldName, newName);
processed = true;
}
if(qs.operation != null && qs.operation.equalsIgnoreCase("cast"))
{
// name of the function is in the left alias
if(qs.leftItem != null && qs.leftItem instanceof GenExpression)
replaceTableAlias2((GenExpression)qs.leftItem, oldName, newName);
processed = true;
}
if(qs.operation != null && qs.operation.equalsIgnoreCase("function"))
{
// name of the function is in the left alias
FunctionExpression thisExpr = (FunctionExpression)qs;
List parameters = thisExpr.expressions;
for(int paramIndex = 0;paramIndex < parameters.size();paramIndex++)
{
replaceTableAlias2(parameters.get(paramIndex), oldName, newName);
}
processed = true;
}
if(qs.operation != null && qs.operation.equalsIgnoreCase("isnull"))
{
// name of the function is in the left alias
replaceTableAlias2((GenExpression)qs.leftItem, oldName, newName);
processed = true;
}
// need to handle telescope
if(!processed)
{
if(qs.recursive)
{
Object leftItem = qs.leftItem;
Object rightItem = qs.rightItem;
if(leftItem instanceof GenExpression)
{
replaceTableAlias2((GenExpression)leftItem, oldName, newName);
}
if(rightItem instanceof GenExpression)
{
replaceTableAlias2((GenExpression)rightItem, oldName, newName);
}
}
else if(qs instanceof WhenExpression)
{
// this shoudl already do liskov substitution
replaceTableAlias2(qs, oldName, newName);;
}
else if(qs instanceof InGenExpression)
{
InGenExpression ig = (InGenExpression)qs;
if(qs.leftItem != null)
replaceTableAlias2((GenExpression)qs.leftItem, oldName, newName);
if(qs.rightItem != null && qs.rightItem instanceof GenExpression)
{
replaceTableAlias2((GenExpression)qs.rightItem, oldName, newName);
}
}
else if(qs.leftItem != null && qs.rightItem != null) // this is expression
{
// dont know how to handle this yet
// fun stuff we are going to go into a recursion again
Object leftItem = (GenExpression)qs.leftItem;
Object rightItem = (GenExpression)qs.rightItem;
// this is where we need to do the paranthesis again I think
replaceTableAlias2((GenExpression)qs.leftItem, oldName, newName);
replaceTableAlias2((GenExpression)qs.rightItem, oldName, newName);
}
else if(qs.telescope )
{
replaceTableAlias2((GenExpression)qs.body, oldName, newName);
}
}
// like the filter
// add the from
if(qs.from != null)
replaceTableAlias2((GenExpression)qs.from, oldName, newName);
// add the joins finally
for(int joinIndex = 0;joinIndex < qs.joins.size();joinIndex++)
{
//System.err.println("Selector Buf so far " + buf);
GenExpression sqs = qs.joins.get(joinIndex);
// I also need to pick the from here
// this is is the inner join on
// how to tell if a join is a subjoin ?
if(sqs.from != null)
replaceTableAlias2((GenExpression)sqs.from, oldName, newName);
if(sqs.body != null)
replaceTableAlias2((GenExpression)sqs.body, oldName, newName);
}
// add the where
if(qs.filter != null)
replaceTableAlias2((GenExpression)qs.filter, oldName, newName);
// add the groupby
if(qs.ngroupBy.size() > 0)
{
for(int groupIndex = 0;groupIndex < qs.ngroupBy.size();groupIndex++)
{
GenExpression gep = qs.ngroupBy.get(groupIndex);
replaceTableAlias2(gep, oldName, newName);
}
}
// add the order
if(qs.norderBy.size() > 0)
{
for(int orderIndex = 0;orderIndex < qs.norderBy.size();orderIndex++)
{
GenExpression gep = qs.norderBy.get(orderIndex).body;
replaceTableAlias2(gep, oldName, newName);
}
}
}
public void addQuoteToColumn(GenExpression qs, String quote)
{
// if the type is join.. you need to do other things
//System.err.println("Processing " + qs.aQuery + " <>" + qs.expression + "<>" + qs.operation);
boolean processed = false;
if(qs != null && qs.operation != null)
{
if(qs.operation.equalsIgnoreCase("select") || qs.operation.equalsIgnoreCase("querystruct"))
{
for(int selIndex = 0;selIndex < qs.nselectors.size();selIndex++)
{
GenExpression sqs = qs.nselectors.get(selIndex);
addQuoteToColumn(sqs, quote);
}
processed = true;
}
if(qs.operation.equalsIgnoreCase("column"))
{
qs.leftExpr = quote + qs.leftExpr + quote;
}
}
if(qs.operation != null && qs.operation.contains("union"))
{
//System.err.println("And now we are getting the union " + qs);
// process the left and right
//
OperationExpression opex = (OperationExpression)qs;
List operands = opex.operands;
List opNames = opex.opNames;
for(int opIndex = 0;opIndex < opNames.size();opIndex++)
{
if(opIndex == 0)
addQuoteToColumn((GenExpression)operands.get(opIndex), quote);
addQuoteToColumn((GenExpression)operands.get(opIndex+1), quote);
}
processed = true;
}
if(qs.operation != null && qs.operation.equalsIgnoreCase("between"))
{
processed = true;
addQuoteToColumn((GenExpression)qs.body, quote);
addQuoteToColumn((GenExpression)qs.leftItem, quote);
addQuoteToColumn((GenExpression)qs.rightItem, quote);
processed = true;
}
if(qs.operation != null && qs.operation.equalsIgnoreCase("cast"))
{
// name of the function is in the left alias
if(qs.leftItem != null && qs.leftItem instanceof GenExpression)
addQuoteToColumn((GenExpression)qs.leftItem, quote);
processed = true;
}
if(qs.operation != null && qs.operation.equalsIgnoreCase("function"))
{
// name of the function is in the left alias
FunctionExpression thisExpr = (FunctionExpression)qs;
List parameters = thisExpr.expressions;
for(int paramIndex = 0;paramIndex < parameters.size();paramIndex++)
{
addQuoteToColumn(parameters.get(paramIndex),quote);
}
processed = true;
}
if(qs.operation != null && qs.operation.equalsIgnoreCase("isnull"))
{
// name of the function is in the left alias
addQuoteToColumn((GenExpression)qs.leftItem,quote);
processed = true;
}
// need to handle telescope
if(!processed)
{
if(qs.recursive)
{
Object leftItem = qs.leftItem;
Object rightItem = qs.rightItem;
if(leftItem instanceof GenExpression)
{
addQuoteToColumn((GenExpression)leftItem, quote);
}
if(rightItem instanceof GenExpression)
{
addQuoteToColumn((GenExpression)rightItem,quote);
}
}
else if(qs instanceof WhenExpression)
{
// this shoudl already do liskov substitution
addQuoteToColumn(qs, quote);;
}
else if(qs.leftItem != null && qs.rightItem != null) // this is expression
{
// dont know how to handle this yet
// fun stuff we are going to go into a recursion again
Object leftItem = (GenExpression)qs.leftItem;
Object rightItem = (GenExpression)qs.rightItem;
// this is where we need to do the paranthesis again I think
addQuoteToColumn((GenExpression)qs.leftItem, quote);
addQuoteToColumn((GenExpression)qs.rightItem, quote);
}
else if(qs.telescope )
{
addQuoteToColumn((GenExpression)qs.body, quote);
}
}
// like the filter
// add the from
if(qs.from != null)
addQuoteToColumn((GenExpression)qs.from, quote);
// add the joins finally
for(int joinIndex = 0;joinIndex < qs.joins.size();joinIndex++)
{
//System.err.println("Selector Buf so far " + buf);
GenExpression sqs = qs.joins.get(joinIndex);
// I also need to pick the from here
// this is is the inner join on
// how to tell if a join is a subjoin ?
if(sqs.from != null)
addQuoteToColumn((GenExpression)sqs.from, quote);
if(sqs.body != null)
addQuoteToColumn((GenExpression)sqs.body, quote);
}
// add the where
if(qs.filter != null)
addQuoteToColumn((GenExpression)qs.filter, quote);
// add the groupby
if(qs.ngroupBy.size() > 0)
{
for(int groupIndex = 0;groupIndex < qs.ngroupBy.size();groupIndex++)
{
GenExpression gep = qs.ngroupBy.get(groupIndex);
addQuoteToColumn(gep, quote);
}
}
// add the order
if(qs.norderBy.size() > 0)
{
for(int orderIndex = 0;orderIndex < qs.norderBy.size();orderIndex++)
{
GenExpression gep = qs.norderBy.get(orderIndex).body;
addQuoteToColumn(gep, quote);
}
}
}
public void addSelect(GenExpression selector)
{
// if it is duplicate dont add it
// check the alias
for(int selectorIndex = 0;selectorIndex < nselectors.size();selectorIndex++)
{
GenExpression thisSelector = nselectors.get(selectorIndex);
if(thisSelector.leftAlias != null && selector.leftAlias != null)
if(thisSelector.leftAlias.contentEquals(selector.leftAlias)) return;
else if(thisSelector.leftAlias != null && selector.getLeftExpr() != null)
if(thisSelector.leftAlias.contentEquals(selector.getLeftExpr())) return;
else if(thisSelector.getLeftExpr() != null && selector.leftAlias != null)
if(thisSelector.getLeftExpr().contentEquals(selector.leftAlias)) return;
else if(thisSelector.getLeftExpr() != null && selector.getLeftExpr() != null)
if(thisSelector.getLeftExpr().contentEquals(selector.getLeftExpr())) return;
}
nselectors.add(selector);
}
public boolean compareSelectors(GenExpression inputExpression)
{
// if it is duplicate dont add it
// check the alias
boolean match = true;
for(int selectorIndex = 0;match && selectorIndex < inputExpression.nselectors.size();selectorIndex++)
{
GenExpression thisSelector = nselectors.get(selectorIndex);
boolean foundMatch = false;
for(int thisSelectorIndex = 0;!foundMatch && thisSelectorIndex < this.nselectors.size();thisSelectorIndex++)
{
GenExpression selector = this.nselectors.get(thisSelectorIndex);
if(thisSelector.leftAlias != null && selector.leftAlias != null)
foundMatch = thisSelector.leftAlias.contentEquals(selector.leftAlias);
else if(thisSelector.leftAlias != null && selector.getLeftExpr() != null)
foundMatch = thisSelector.leftAlias.contentEquals(selector.getLeftExpr());
else if(thisSelector.getLeftExpr() != null && selector.leftAlias != null)
foundMatch = thisSelector.getLeftExpr().contentEquals(selector.leftAlias);
else if(thisSelector.getLeftExpr() != null && selector.getLeftExpr() != null)
foundMatch = thisSelector.getLeftExpr().contentEquals(selector.getLeftExpr());
}
match = foundMatch && match;
}
return match;
}
public static StringBuffer printLevel2(GenExpression qs,
List realTables, // this is where all the real tables are kept
int level,
GenExpression derivedKey,
Map > derivedColumns,
Map > levelProjections, // all the columns in a given level
Map > tableColumns, // all the columns in a given level do we need this ?
Map tableAliases, // aliases for this column - also need something that will keep // also keeps aliases for table
String tableName,
boolean derived,
boolean projection)
{
// if the type is join.. you need to do other things
// if derived is true only add it to the derived columns not to anything else
//System.err.println("Processing " + qs.aQuery + " <>" + qs.expression + "<>" + qs.operation);
boolean processed = false;
List derivedColumnList = new Vector();
List allColumnList = new Vector();
List projectionList = new Vector();
if(levelProjections.containsKey(level))
projectionList = levelProjections.get(level);
if(derivedColumns.containsKey(derivedKey))
derivedColumnList = derivedColumns.get(derivedKey);
if(qs != null && qs.operation != null && !qs.neutralize)
{
if(qs.operation.equalsIgnoreCase("select") || qs.operation.equalsIgnoreCase("querystruct"))
{
level++;
tableName = qs.currentTable;
for(int selIndex = 0;selIndex < qs.nselectors.size();selIndex++)
{
GenExpression sqs = qs.nselectors.get(selIndex);
// need to handle telescope
printLevel2(sqs, realTables, level, null, derivedColumns, levelProjections, tableColumns, tableAliases, tableName, false, true);
}
processed = true;
}
else if(qs.operation.equalsIgnoreCase("column"))
{
String columnName = qs.leftExpr;
//System.err.println(qs.currentTable + "<<>>" + qs.tableName + "<<>>" + qs.tableAlias + "<<>>" + tableName);
processColumn(qs, derived, projection, tableColumns, tableAliases, projectionList, allColumnList, derivedColumns, derivedKey, qs.tableName);
// otherwise add this to the derived columns
// add it to projection if it is
processed = true;
}
else if(qs.operation.equalsIgnoreCase("double") || qs.operation.equalsIgnoreCase("date") || qs.operation.equalsIgnoreCase("time") || qs.operation.equalsIgnoreCase("string") || qs.operation.equalsIgnoreCase("long"))
{
// dont need this ?
// may be need it only for alias
String columnName = qs.leftExpr;
processColumn(qs, derived, projection, tableColumns, tableAliases, projectionList, allColumnList, derivedColumns, derivedKey, tableName);
processed = true;
}
else if(qs.operation.equalsIgnoreCase("opaque"))
{
// not sure how we are handling this.
String columnName = qs.leftExpr;
processColumn(qs, derived, projection, tableColumns, tableAliases, projectionList, allColumnList, derivedColumns, derivedKey, tableName);
}
else if(qs.operation.equalsIgnoreCase("from") && !qs.composite)
{
String columnName = qs.leftExpr;
realTables.add(columnName);
if(qs.leftAlias != null && qs.leftAlias.length() > 0)
{
// need to account for when there are conflicts
tableAliases.put(qs.leftAlias, tableName);
}
processed = true;
}
else if(qs.operation.equalsIgnoreCase("allcol"))
{
String columnName = "*";
// need to highlight they are trying to select all col
if(qs.tableName != null)
tableName = qs.tableName;
processColumn(qs, derived, projection, tableColumns, tableAliases, projectionList, allColumnList, derivedColumns, derivedKey, tableName);
processed = true;
}
else if(qs.composite)
{
//System.err.println(" hmm.. from is composite.. but simple ? " + qs.aQuery);
}
}
if(qs.operation != null && qs.operation.contains("union") && !qs.neutralize)
{
//System.err.println("And now we are getting the union " + qs);
// process the left and right
// level gets set when we hit a select
OperationExpression opex = (OperationExpression)qs;
List operands = opex.operands;
List opNames = opex.opNames;
for(int opIndex = 0;opIndex < opNames.size();opIndex++)
{
printLevel2((GenExpression)operands.get(opIndex), realTables, level, null, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, derived, projection);
}
processed = true;
}
if(qs.operation != null && qs.operation.equalsIgnoreCase("between") && !qs.neutralize)
{
processed = true;
String columnName = qs.leftExpr;
if(derivedKey == null)
{
derivedKey = qs;
processColumn(qs, derived, projection, tableColumns, tableAliases, projectionList, allColumnList, derivedColumns, derivedKey, tableName);
derived = true;
}
printLevel2((GenExpression)qs.body, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, true, projection);
printLevel2((GenExpression)qs.leftItem, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, true, projection);
printLevel2((GenExpression)qs.rightItem, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, true, projection);
processed = true;
if(qs.aQuery != null && qs.aQuery.equalsIgnoreCase(derivedKey.aQuery))
derivedKey = null;
}
if(qs.operation != null && qs.operation.equalsIgnoreCase("cast") && !qs.neutralize)
{
// name of the function is in the left alias
if(derivedKey == null)
{
derivedKey = qs;
processColumn(qs, derived, projection, tableColumns, tableAliases, projectionList, allColumnList, derivedColumns, derivedKey, tableName);
derived = true;
}
if(qs.leftItem != null && qs.leftItem instanceof GenExpression) {
printLevel2((GenExpression)qs.leftItem, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, true, projection);
} else {
// do the columnname magic
String columnName = qs.leftExpr;
processColumn(qs, derived, projection, tableColumns, tableAliases, projectionList, allColumnList, derivedColumns, derivedKey, tableName);
}
if(qs.aQuery != null && qs.aQuery.equalsIgnoreCase(derivedKey.aQuery))
derivedKey = null;
processed = true;
}
if(qs.operation != null && qs.operation.equalsIgnoreCase("function") && !qs.neutralize)
{
FunctionExpression thisExpr = (FunctionExpression)qs;
if(derivedKey == null)
{
derivedKey = qs;
processColumn(qs, derived, projection, tableColumns, tableAliases, projectionList, allColumnList, derivedColumns, derivedKey, tableName);
derived = true;
}
// name of the function is in the left alias
//buf.append(qs.expression).append("(");
List parameters = thisExpr.expressions;
for(int paramIndex = 0;paramIndex < parameters.size();paramIndex++)
{
printLevel2((GenExpression)parameters.get(paramIndex), realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, true, projection);
}
if(qs.aQuery != null && qs.aQuery.equalsIgnoreCase(derivedKey.aQuery))
derivedKey = null;
processed = true;
}
if(qs.operation != null && qs.operation.equalsIgnoreCase("isnull") && !qs.neutralize)
{
// name of the function is in the left alias
if(derivedKey == null)
{
derivedKey = qs;
processColumn(qs, derived, projection, tableColumns, tableAliases, projectionList, allColumnList, derivedColumns, derivedKey, tableName);
derived = true;
}
printLevel2((GenExpression)qs.leftItem, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, true, projection);
if(qs.aQuery != null && qs.aQuery.equalsIgnoreCase(derivedKey.aQuery))
derivedKey = null;
// dont know if I need the alias yet
//if(qs.leftAlias != null)
// buf.append(" AS ").append(qs.leftAlias);
processed = true;
}
// need to handle telescope
if(!processed && !qs.neutralize)
{
if(qs.recursive)
{
// add this to the
// recursive will never have a table name fully baked
// because it can use multiple columns
if(derivedKey == null)
{
derivedKey = qs;
processColumn(qs, derived, projection, tableColumns, tableAliases, projectionList, allColumnList, derivedColumns, derivedKey, tableName);
derived = true;
}
printLevel2Recursive(qs, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, derived, projection);
if(qs.aQuery != null && qs.aQuery.equalsIgnoreCase(derivedKey.aQuery))
derivedKey = null;
}
else if(qs instanceof WhenExpression)
{
//buf.append(((WhenExpression)qs).printOutput());
if(derivedKey == null)
{
derivedKey = qs;
processColumn(qs, derived, projection, tableColumns, tableAliases, projectionList, allColumnList, derivedColumns, derivedKey, tableName);
derived = true;
}
((WhenExpression)qs).printLevel(qs, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns, tableAliases, tableName, derived, projection);
if(qs.aQuery != null && qs.aQuery.equalsIgnoreCase(derivedKey.aQuery))
derivedKey = null;
}
else if(qs instanceof InGenExpression)
{
// add this to the
if(derivedKey == null)
{
derivedKey = qs;
derived = true;
}
InGenExpression ig = (InGenExpression)qs;
if(qs.leftItem != null) {
printLevel2((GenExpression)qs.leftItem, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, derived, projection);
}
if(ig.inList.size() > 0 && ig.rightItem == null)
{
// process the list
// I have made this opaque
for(int itemIndex = 0;itemIndex < ig.inList.size();itemIndex++)
{
printLevel2(ig.inList.get(itemIndex), realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, derived, projection);
}
//buf.append(")");
}
else if(qs.rightItem != null && qs.rightItem instanceof GenExpression)
{
// when you have where column1 in ( subquery )
// the subquery is stored it is stored in the body
if( ((GenExpression)qs.rightItem).telescope) {
printLevel2(((GenExpression)qs.rightItem).body, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, derived, projection);
} else {
printLevel2((GenExpression)qs.rightItem, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, derived, projection);
}
}
processed = true;
if(qs.aQuery != null && qs.aQuery.equalsIgnoreCase(derivedKey.aQuery))
derivedKey = null;
}
// this also needs to be neutralized
else if(qs.leftItem != null && qs.rightItem != null) // this is expression
{
// add this to the
if(derivedKey == null)
{
derivedKey = qs;
derived = true;
}
// dont know how to handle this yet
// fun stuff we are going to go into a recursion again
Object leftItem = (GenExpression)qs.leftItem;
Object rightItem = (GenExpression)qs.rightItem;
// this is where we need to do the paranthesis again I think
printLevel2((GenExpression)qs.leftItem, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, derived, projection);
printLevel2((GenExpression)qs.rightItem, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, derived, projection);
if(qs.aQuery != null && qs.aQuery.equalsIgnoreCase(derivedKey.aQuery))
derivedKey = null;
}
else if(qs.telescope && !qs.body.neutralize)
{
if(derivedKey == null)
{
derivedKey = qs;
derived = true;
}
processColumn(qs, derived, projection, tableColumns, tableAliases, projectionList, allColumnList, derivedColumns, derivedKey, tableName);
// need to acomodate when it is neutralize
printLevel2((GenExpression)qs.body, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, derived, projection);
if(qs.aQuery != null && qs.aQuery.equalsIgnoreCase(derivedKey.aQuery))
derivedKey = null;
}
}
// like the filter
// add the from
if(qs.from != null)
{
// put the paranthesis if it is another select
//if(qs.from.operation != null && qs.from.operation.equalsIgnoreCase("querystruct"))
{
//System.err.println("From operation is set to " + qs.from.operation + " composite ?" + qs.from.composite );
if(qs.from.composite)
{
printLevel2((GenExpression)qs.from, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, derived, false);
if(qs.from.leftAlias != null)
tableAliases.put(qs.from.leftAlias, qs.from.aQuery);
}
else
{
if(!realTables.contains(qs.from.leftExpr) &&qs.from.leftExpr != null && qs.from.leftExpr.length() > 0)
realTables.add(qs.from.leftExpr);
if(qs.from.leftAlias != null)
tableAliases.put(qs.from.leftAlias, qs.from.leftExpr);
// add the alias
}
// if we need to keep the table alias keep it here
}
}
// add the joins finally
for(int joinIndex = 0;joinIndex < qs.joins.size();joinIndex++)
{
//System.err.println("Selector Buf so far " + buf);
GenExpression sqs = qs.joins.get(joinIndex);
// I also need to pick the from here
// this is is the inner join on
// how to tell if a join is a subjoin ?
if(sqs.from != null && !sqs.neutralize)
{
if(sqs.from != null && sqs.from.composite)
{
printLevel2(sqs.from, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, derived, false);
}
else
{
printLevel2((GenExpression)sqs.from, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, derived, false);
if(!realTables.contains(sqs.currentTable) && sqs.currentTable != null && sqs.currentTable.length() > 0)
realTables.add(sqs.currentTable); // why is this alias null ?
}
// need to process alias possibl
}
if(sqs.body != null && sqs.body.operation.equalsIgnoreCase("querystruct") && !sqs.neutralize)
{
// open = "(";
// close = ") ";
}
// process this as a query struct
if(sqs.body != null && !sqs.neutralize)
{
printLevel2((GenExpression)sqs.body, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, derived, false);
}
}
// add the where
if(qs.filter != null)
{
printLevel2((GenExpression)qs.filter, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, derived, false);
}
// add the groupby
if(qs.ngroupBy.size() > 0)
{
for(int groupIndex = 0;groupIndex < qs.ngroupBy.size();groupIndex++)
{
GenExpression gep = qs.ngroupBy.get(groupIndex);
printLevel2((GenExpression)gep, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, derived, false);
}
}
// add the order
if(qs.norderBy.size() > 0)
{
for(int orderIndex = 0;orderIndex < qs.norderBy.size();orderIndex++)
{
GenExpression gep = qs.norderBy.get(orderIndex).body;
printLevel2((GenExpression)gep, realTables, level, derivedKey, derivedColumns, levelProjections, tableColumns,tableAliases, tableName, derived, false);
}
}
levelProjections.put(level, projectionList);
if(derived)
derivedColumns.put(derivedKey, derivedColumnList);
return null;
}
public static void printLevel2Recursive(
GenExpression qs,
List realTables, // this is where all the real tables are kept
int level,
GenExpression derivedKey,
Map > derivedColumns,
Map > levelProjections, // all the columns in a given level
Map > levelColumns, // all the columns in a given level
Map aliases, // aliases for this column - also need something that will keep
String tableName,
boolean derived,
boolean projection)
{
Object leftItem = qs.leftItem;
Object rightItem = qs.rightItem;
String operation = qs.operation;
// Account for when it is an or and both left item and right item are neutralized
//if(leftItem != null && leftItem instanceof GenExpression && ((GenExpression)leftItem).neutralize && rightItem != null && rightItem instanceof GenExpression && ((GenExpression)rightItem).neutralize)
// return buf.append("(1 = 1) ");
if(leftItem instanceof GenExpression)
{
if(!((GenExpression)leftItem).neutralize)
{
// need to know if I need to put a paranthesis around this or not
Object childLeftItem = ((GenExpression)leftItem).leftItem;
Object childRightItem = ((GenExpression)leftItem).rightItem;
printLevel2((GenExpression)leftItem, realTables, level, derivedKey, derivedColumns, levelProjections, levelColumns,aliases, tableName, derived, projection); // need to account for neutralize here
}
}
if(rightItem instanceof GenExpression)
{
if(!((GenExpression)rightItem).neutralize)
{
// need to know if I need to put a paranthesis around this or not
Object childLeftItem = ((GenExpression)rightItem).leftItem;
Object childRightItem = ((GenExpression)rightItem).rightItem;
printLevel2((GenExpression)rightItem, realTables, level, derivedKey, derivedColumns, levelProjections, levelColumns,aliases, tableName, derived, projection); // need to account for neutralize here
}
}
}
// I wonder if we need to account for the level
// since there could be the same alias being used across levels for different tables
public static void processColumn(GenExpression qs,
boolean derived,
boolean projection,
Map > tableColumns,
Map aliases,
List projectionList,
List allColumnList,
Map > derivedColumns,
GenExpression derivedKey,
String tableName)
{
// table could have an alias
// but we will process it as something that is available from the columns
List tableColumnList = null;
List derivedColumnList = null;
if(tableColumns.containsKey(tableName))
tableColumnList = tableColumns.get(tableName);
else
tableColumnList = new Vector();
String prefix = tableName + "__";
// if there is an alias to do
//if(qs.leftAlias == null && derivedKey == null && !projection)
// prefix = "";
if(derivedColumns.containsKey(derivedKey))
derivedColumnList = derivedColumns.get(derivedKey);
else
derivedColumnList = new Vector();
if( (qs.operation.equalsIgnoreCase("column") || qs.operation.equalsIgnoreCase("allcol") ))
{
boolean found = false;
for(int tableColumnIndex = 0;!found && tableColumnIndex < tableColumnList.size();tableColumnIndex++)
found = qs.aQuery.equalsIgnoreCase(tableColumnList.get(tableColumnIndex).aQuery);
if(!found)
tableColumnList.add(qs);
}
if(derived)
{
derivedColumnList.add(qs);
}
else if(projection)
{
projectionList.add(qs);
}
tableColumns.put(tableName, tableColumnList);
derivedColumns.put(derivedKey, derivedColumnList);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy