private boolean containsPayload( Properties indexfields, Iterator<EclColumnMetaData> selectcolsit) { while (selectcolsit.hasNext()) { EclColumnMetaData currentselectcol = selectcolsit.next(); String colname = currentselectcol.getColumnName(); int type = currentselectcol.getColumnType(); if (type == EclColumnMetaData.COLUMN_TYPE_DATA && !indexfields.containsKey(colname.toUpperCase())) return false; else if (type == EclColumnMetaData.COLUMN_TYPE_FNCTION && !containsPayload(indexfields, currentselectcol.getFunccols().iterator())) return false; } return true; }
public ArrayList execute() throws Exception { int sqlreqtype = parser.getSqlType(); List<EclColumnMetaData> expectedretcolumns = new ArrayList(); ArrayList<EclColumnMetaData> storeProcInParams = new ArrayList(); String hpccfilename = ""; String indexposfield = null; StringBuilder keyedandwild = new StringBuilder(); DFUFile indexfiletouse = null; StringBuilder eclcode = new StringBuilder(""); int totalparamcount = 0; boolean isPayloadIndex = false; switch (sqlreqtype) { case SqlParser.SQL_TYPE_SELECT: { hpccfilename = Utils.handleQuotedString(parser.getTableName()); if (!dbMetadata.tableExists("", hpccfilename)) throw new Exception("Invalid table found: " + hpccfilename); DFUFile dfufile = dbMetadata.getDFUFile(hpccfilename); // in future this might need to be a container of dfufile(s) parser.verifySelectColumns(dfufile); expectedretcolumns = parser.getSelectColumns(); totalparamcount = parser.getWhereClauseExpressionsCount(); if (indexToUseName != null) { indexfiletouse = dbMetadata.getDFUFile(indexToUseName); indexposfield = indexfiletouse.getIdxFilePosField(); isPayloadIndex = processIndex(indexfiletouse, keyedandwild); eclEnteties.put("KEYEDWILD", keyedandwild.toString()); if (isPayloadIndex) eclEnteties.put("PAYLOADINDEX", "true"); } eclEnteties.put("PARAMCOUNT", Integer.toString(totalparamcount)); if (dfufile.hasFileRecDef()) { if (indexfiletouse != null && indexposfield != null) eclcode.append( dfufile.getFileRecDefwithIndexpos( indexfiletouse.getFieldMetaData(indexposfield), "filerecstruct")); else eclcode.append(dfufile.getFileRecDef("filerecstruct")); } else throw new Exception( "Target HPCC file (" + hpccfilename + ") does not contain ECL record definition"); if (!dfufile.isKeyFile()) eclcode .append("fileds := DATASET(\'~") .append(dfufile.getFullyQualifiedName()) .append("\', filerecstruct,") .append(dfufile.getFormat()) .append("); "); else { eclcode.append("fileds := INDEX( "); eclcode.append('{'); eclcode.append(dfufile.getKeyedFieldsAsDelmitedString(',', "filerecstruct")); eclcode.append("},{"); eclcode.append(dfufile.getNonKeyedFieldsAsDelmitedString(',', "filerecstruct")); eclcode.append("},"); eclcode.append("\'~").append(dfufile.getFullyQualifiedName()).append("\');"); } StringBuilder selectstruct = new StringBuilder(" selectstruct:=RECORD "); String datasource = indexToUseName == null || isPayloadIndex ? "fileds" : "fetchedds"; // boolean usescalar = expectedretcolumns.size() == 1; for (int i = 0; i < expectedretcolumns.size(); i++) { EclColumnMetaData col = expectedretcolumns.get(i); if (col.getColumnType() == EclColumnMetaData.COLUMN_TYPE_CONSTANT) { selectstruct .append(col.getEclType()) .append(" ") .append(col.getColumnName()) .append(" := ") .append(col.getConstantValue()) .append("; "); if (i == 0 && expectedretcolumns.size() == 1) eclEnteties.put("SCALAROUTNAME", col.getColumnName()); } else if (col.getColumnType() == EclColumnMetaData.COLUMN_TYPE_FNCTION) { if (col.getColumnName().equalsIgnoreCase("COUNT")) { eclEnteties.put("COUNTFN", "TRUE"); selectstruct.append("countout := "); if (parser.hasGroupByColumns()) { selectstruct.append(col.getColumnName().toUpperCase()).append("( GROUP"); List<EclColumnMetaData> funccols = col.getFunccols(); if (funccols.size() > 0) { String paramname = funccols.get(0).getColumnName(); if (!paramname.equals("*") && funccols.get(0).getColumnType() != EclColumnMetaData.COLUMN_TYPE_CONSTANT) { selectstruct.append(", "); selectstruct.append(datasource); selectstruct.append("."); selectstruct.append(paramname); selectstruct.append("<> \'\'"); // if (eclEnteties.size() > 0) // addFilterClause(selectstruct, eclEnteties); } } selectstruct.append(" );"); } else { selectstruct.append(" scalarout;"); if (expectedretcolumns.size() == 1) eclEnteties.put("SCALAROUTNAME", col.getColumnName()); } col.setSQLType(java.sql.Types.NUMERIC); } else if (col.getColumnName().equalsIgnoreCase("MAX")) { eclEnteties.put("MAXFN", "TRUE"); selectstruct.append("maxout := "); if (parser.hasGroupByColumns()) { selectstruct.append("MAX( GROUP "); } else { selectstruct.append("MAX( ").append(datasource); if (eclEnteties.size() > 0) addFilterClause(selectstruct, eclEnteties); } List<EclColumnMetaData> funccols = col.getFunccols(); if (funccols.size() > 0) { String paramname = funccols.get(0).getColumnName(); eclEnteties.put("FNCOLS", paramname); if (!paramname.equals("*") && funccols.get(0).getColumnType() != EclColumnMetaData.COLUMN_TYPE_CONSTANT) { selectstruct.append(", "); selectstruct.append(datasource); selectstruct.append("."); selectstruct.append(paramname); } } selectstruct.append(" );"); /* if (parser.hasGroupByColumns()) { selectstruct.append(col.getColumnName().toUpperCase()).append("( GROUP"); List<EclColumnMetaData> funccols = col.getFunccols(); if (funccols.size() > 0) { String paramname = funccols.get(0).getColumnName(); eclEnteties.put("FNCOLS", paramname); if (!paramname.equals("*") && funccols.get(0).getColumnType() != EclColumnMetaData.COLUMN_TYPE_CONSTANT) { selectstruct.append(", "); selectstruct.append(datasource); selectstruct.append("."); selectstruct.append(paramname); } } selectstruct.append(" );"); } else { selectstruct.append(" totalmax;"); //if (expectedretcolumns.size() == 1) // eclEnteties.put("SCALAROUTNAME", col.getColumnName()); } */ /* selectstruct.append(col.getColumnName().toUpperCase()).append(" ( "); if (parser.hasGroupByColumns()) selectstruct.append("GROUP"); else selectstruct.append(datasource); List<EclColumnMetaData> funccols = col.getFunccols(); if (funccols.size() > 0) { String paramname = funccols.get(0).getColumnName(); if (!paramname.equals("*") && funccols.get(0).getColumnType() != EclColumnMetaData.COLUMN_TYPE_CONSTANT) { selectstruct.append(", "); selectstruct.append(datasource); selectstruct.append("."); selectstruct.append(paramname); } } selectstruct.append(" );");*/ } } else selectstruct .append(col.getEclType()) .append(" ") .append(col.getColumnName()) .append(" := ") .append(datasource) .append(".") .append(col.getColumnName()) .append("; "); // if (i == 0 && expectedretcolumns.size() == 1 && col.getColumnType() != // EclColumnMetaData.COLUMN_TYPE_DATA ) // eclEnteties.put("SCALAROUTNAME", col.getColumnName()); } selectstruct.append("END; "); eclEnteties.put("SELECTSTRUCT", selectstruct.toString()); if (parser.hasOrderByColumns()) eclEnteties.put("ORDERBY", parser.getOrderByString()); if (parser.hasGroupByColumns()) eclEnteties.put("GROUPBY", parser.getGroupByString()); if (parser.hasLimitBy()) eclEnteties.put("LIMIT", Integer.toString(parser.getLimit())); return executeSelect(eclcode.toString(), eclEnteties, indexfiletouse); } case SqlParser.SQL_TYPE_SELECTCONST: { System.out.println("Processing test_query..."); // ArrayList<EclColumnMetaData> columns = new ArrayList(); eclcode.append("selectstruct:=RECORD "); expectedretcolumns = parser.getSelectColumns(); // defaultEclQueryReturnDatasetName = "ConstECLQueryResult"; StringBuilder ecloutput = new StringBuilder(" OUTPUT(DATASET([{ "); for (int i = 1; i <= expectedretcolumns.size(); i++) { EclColumnMetaData col = expectedretcolumns.get(i - 1); eclcode.append(col.getEclType()).append(" ").append(col.getColumnName()).append("; "); ecloutput.append(col.getConstantValue()); if (i < expectedretcolumns.size()) ecloutput.append(", "); } ecloutput.append("}],selectstruct), NAMED(\'"); // ecloutput.append(defaultEclQueryReturnDatasetName); ecloutput.append("ConstECLQueryResult"); ecloutput.append("\'));"); eclcode.append(" END; "); eclcode.append(ecloutput.toString()); return executeSelectConstant(eclcode.toString()); } case SqlParser.SQL_TYPE_CALL: { eclqueryname = Utils.handleQuotedString(parser.getStoredProcName()); if (!dbMetadata.eclQueryExists("", eclqueryname)) throw new Exception("Invalid store procedure found"); return executeCall(null); } default: break; } return null; }