private void initColumns(Select select) {
columns = new ArrayList<>();
aliases = new ArrayList<>();
select.getSelectBody().accept(new SelectVisitorAdapter() {
@Override
public void visit(PlainSelect plainSelect) {
for (SelectItem selectItem : plainSelect.getSelectItems()) {
selectItem.accept(new SelectItemVisitor() {
private boolean foundColumn = false;
@Override
public void visit(SelectExpressionItem selectExpressionItem) {
selectExpressionItem.getExpression().accept(new ExpressionVisitorAdapter() {
@Override
public void visit(Column column) {
registerColumn(column, selectExpressionItem.getAlias());
foundColumn = true;
}
});
if (!foundColumn) {
registerColumn(null, selectExpressionItem.getAlias());
}
}
@Override
public void visit(AllTableColumns allTableColumns) {
registerAllTableColumns(allTableColumns.getTable());
}
@Override
public void visit(AllColumns allColumns) {
for (Table table : tables) {
registerAllTableColumns(table);
}
}
});
}
}
});
}
@Override
public void visit(AllColumns allColumns) {
}
@Override
public void visit(AllColumns allColumns) {
invalid = true;
super.visit(allColumns);
}
/**
* Search in ANY object using SQL Syntax subset, similar to CMIS SQL
* @param SQL complete query
* @return and opened @Cursor
* @throws PDException In any Error
*/
public Cursor SearchSelect(String SQL) throws PDException
{
if (PDLog.isDebug())
PDLog.Debug("ObjPD.SearchSelect>:"+SQL);
Query QBE=null;
try {
Select ParsedSQL = (Select) CCJSqlParserUtil.parse(SQL);
//-- Calculate Table Names ------------
TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
List<String> TableListSQL = tablesNamesFinder.getTableList(ParsedSQL);
Vector <String> OPDTabs=CalculateTabs(TableListSQL);
//-- Calculate Fields -------------
List<SelectItem> selectItems = ((PlainSelect)ParsedSQL.getSelectBody()).getSelectItems();
Vector<String> Fields=new Vector<String>();
if (!( selectItems.get(0) instanceof AllColumns))
for (int i = 0; i < selectItems.size(); i++)
Fields.add(((SelectExpressionItem)selectItems.get(i)).getExpression().toString());
Record Rec=CalculateRec(Fields, OPDTabs);
//-- Calculate Conds in Select ------------
Expression When = ((PlainSelect)ParsedSQL.getSelectBody()).getWhere();
Conditions CondSel=EvalExpr(When);
//-- Check Additional-Security Conditions ----
Conditions FinalConds;
Conditions AddedConds=NeededMoreConds(TableListSQL, OPDTabs);
if (AddedConds==null)
FinalConds=CondSel;
else
{
FinalConds=new Conditions();
FinalConds.addCondition(AddedConds);
FinalConds.addCondition(CondSel);
}
//-- Calculate Order ------------
Vector <String> Order=new Vector<String>();
Vector <Boolean> OrderAsc=new Vector<Boolean>();
List<OrderByElement> orderByElements = ((PlainSelect)ParsedSQL.getSelectBody()).getOrderByElements();
if (orderByElements!=null)
for (int i = 0; i < orderByElements.size(); i++)
{
Order.add(orderByElements.get(i).getExpression().toString());
OrderAsc.add(orderByElements.get(i).isAsc());
}
//-- Create Query --------------
QBE=new Query(OPDTabs, Rec, FinalConds, Order, OrderAsc);
if (PDLog.isDebug())
PDLog.Debug("ObjPD.SearchSelect <");
} catch (Exception Ex)
{
Ex.printStackTrace();
PDException.GenPDException("Processing_SQL", Ex.getLocalizedMessage());
}
return(getDrv().OpenCursor(QBE));
}