Ejemplo n.º 1
0
 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;
 }
Ejemplo n.º 2
0
  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;
  }