Package org.teiid.query.metadata

Examples of org.teiid.query.metadata.StoredProcedureInfo


    addTable("pm2.g3", dataMgr, metadata);
    addTable("tm1.g1", dataMgr, metadata);

        //stored procedure pm1.sp1
        TempMetadataStore tempStore = new TempMetadataStore();         
        StoredProcedureInfo procInfo = metadata.getStoredProcedureInfoForProcedure("pm1.sp1"); //$NON-NLS-1$
        List elementSymbols = getProcResultSetSymbols(procInfo.getParameters());
        tempStore.addTempGroup("pm1.sp1", elementSymbols); //$NON-NLS-1$
        Object procID = tempStore.getTempGroupID("pm1.sp1"); //$NON-NLS-1$
        dataMgr.registerTuples(
            procID,
            elementSymbols,
View Full Code Here


      }
     
      if (groupID == null || metadata.isProcedure(groupID)) {
        //try procedure relational resolving
          try {
              StoredProcedureInfo storedProcedureInfo = metadata.getStoredProcedureInfoForProcedure(potentialID);
              symbol.setProcedure(true);
              groupID = storedProcedureInfo.getProcedureID();
          } catch(QueryMetadataException e) {
              // just ignore
          }
      }
     
View Full Code Here

    private void findCommandMetadata(Command command, TempMetadataStore discoveredMetadata, QueryMetadataInterface metadata)
    throws QueryMetadataException, QueryResolverException, TeiidComponentException {

        StoredProcedure storedProcedureCommand = (StoredProcedure) command;
       
        StoredProcedureInfo storedProcedureInfo = null;
        try {
          storedProcedureInfo = metadata.getStoredProcedureInfoForProcedure(storedProcedureCommand.getProcedureName());
        } catch (QueryMetadataException e) {
          String[] parts = storedProcedureCommand.getProcedureName().split("\\.", 2); //$NON-NLS-1$
        if (parts.length > 1 && parts[0].equalsIgnoreCase(metadata.getVirtualDatabaseName())) {
              try {
                storedProcedureInfo = metadata.getStoredProcedureInfoForProcedure(parts[1]);
                storedProcedureCommand.setProcedureName(parts[1]);
              } catch(QueryMetadataException e1) {
              }
          }
        if (storedProcedureInfo == null) {
          throw e;
        }
        }

        storedProcedureCommand.setUpdateCount(storedProcedureInfo.getUpdateCount());
        storedProcedureCommand.setModelID(storedProcedureInfo.getModelID());
        storedProcedureCommand.setProcedureID(storedProcedureInfo.getProcedureID());
        storedProcedureCommand.setProcedureCallableName(storedProcedureInfo.getProcedureCallableName());

        // Get old parameters as they may have expressions set on them - collect
        // those expressions to copy later into the resolved parameters
        List<SPParameter> oldParams = storedProcedureCommand.getParameters();

        boolean namedParameters = storedProcedureCommand.displayNamedParameters();
       
        // If parameter count is zero, then for the purposes of this method treat that
        // as if named parameters were used.  Even though the StoredProcedure was not
        // parsed that way, the user may have entered no parameters with the intention
        // of relying on all default values of all optional parameters.
        if (oldParams.size() == 0 || (oldParams.size() == 1 && storedProcedureCommand.isCalledWithReturn())) {
          storedProcedureCommand.setDisplayNamedParameters(true);
            namedParameters = true;
        }
       
        // Cache original input parameter expressions.  Depending on whether
        // the procedure was parsed with named or unnamed parameters, the keys
        // for this map will either be the String names of the parameters or
        // the Integer indices, as entered in the user query
        Map<Object, Expression> inputExpressions = new HashMap<Object, Expression>();
        int adjustIndex = 0;
        for (SPParameter param : oldParams) {
            if(param.getExpression() == null) {
              if (param.getParameterType() == SPParameter.RESULT_SET) {
                adjustIndex--;  //If this was already resolved, just pretend the result set param doesn't exist
            }
              continue;
            }
            if (namedParameters && param.getParameterType() != SPParameter.RETURN_VALUE) {
                if (inputExpressions.put(param.getName().toUpperCase(), param.getExpression()) != null) {
                  throw new QueryResolverException(QueryPlugin.Util.getString("ExecResolver.duplicate_named_params", param.getName().toUpperCase())); //$NON-NLS-1$
                }
            } else {
                inputExpressions.put(param.getIndex() + adjustIndex, param.getExpression());
            }
        }

        storedProcedureCommand.clearParameters();
        int origInputs = inputExpressions.size();
        /*
         * Take the values set from the stored procedure implementation, and match up with the
         * types of parameter it is from the metadata and then reset the newly joined parameters
         * into the stored procedure command.  If it is a result set get those columns and place
         * them into the stored procedure command as well.
         */
        List<SPParameter> metadataParams = storedProcedureInfo.getParameters();
        List<SPParameter> clonedMetadataParams = new ArrayList<SPParameter>(metadataParams.size());
        int inputParams = 0;
        int outParams = 0;
        boolean hasReturnValue = false;
        for (SPParameter metadataParameter : metadataParams) {
            if( (metadataParameter.getParameterType()==ParameterInfo.IN) ||
                (metadataParameter.getParameterType()==ParameterInfo.INOUT)){

                inputParams++;
            } else if (metadataParameter.getParameterType() == ParameterInfo.OUT) {
              outParams++;
            } else if (metadataParameter.getParameterType() == ParameterInfo.RETURN_VALUE) {
              hasReturnValue = true;
            }
            SPParameter clonedParam = (SPParameter)metadataParameter.clone();
            clonedMetadataParams.add(clonedParam);
            storedProcedureCommand.setParameter(clonedParam);
        }
       
        if (storedProcedureCommand.isCalledWithReturn() && !hasReturnValue) {
          throw new QueryResolverException(QueryPlugin.Util.getString("ExecResolver.return_expected", storedProcedureCommand.getGroup()))//$NON-NLS-1$
        }

        if(!namedParameters && (inputParams > inputExpressions.size())) {
            throw new QueryResolverException("ERR.015.008.0007", QueryPlugin.Util.getString("ERR.015.008.0007", inputParams, origInputs, storedProcedureCommand.getGroup())); //$NON-NLS-1$ //$NON-NLS-2$
        }
       
        // Walk through the resolved parameters and set the expressions from the
        // input parameters
        int exprIndex = 1;
        HashSet<String> expected = new HashSet<String>();
        if (storedProcedureCommand.isCalledWithReturn() && hasReturnValue) {
          for (SPParameter param : clonedMetadataParams) {
            if (param.getParameterType() == SPParameter.RETURN_VALUE) {
              Expression expr = inputExpressions.remove(exprIndex++);
                  param.setExpression(expr);
            }
          }
        }
        for (SPParameter param : clonedMetadataParams) {
            if(param.getParameterType() == SPParameter.RESULT_SET || param.getParameterType() == SPParameter.RETURN_VALUE) {
              continue;
            }
            if (namedParameters) {
                String nameKey = param.getParameterSymbol().getShortCanonicalName();
                Expression expr = inputExpressions.remove(nameKey);
                // With named parameters, have to check on optional params and default values
                if (expr == null && param.getParameterType() != ParameterInfo.OUT) {
                  expr = ResolverUtil.getDefault(param.getParameterSymbol(), metadata);
                  param.setUsingDefault(true);
                  expected.add(nameKey);
                }
                param.setExpression(expr);                   
            } else {
              if(param.getParameterType() == SPParameter.OUT) {
                continue;
              }
                Expression expr = inputExpressions.remove(exprIndex++);
                param.setExpression(expr);
            }
        }
       
        // Check for leftovers, i.e. params entered by user w/ wrong/unknown names
        if (!inputExpressions.isEmpty()) {
          if (namedParameters) {
            throw new QueryResolverException(QueryPlugin.Util.getString("ExecResolver.invalid_named_params", inputExpressions.keySet(), expected)); //$NON-NLS-1$
          }
          throw new QueryResolverException("ERR.015.008.0007", QueryPlugin.Util.getString("ERR.015.008.0007", inputParams, origInputs, storedProcedureCommand.getGroup().toString())); //$NON-NLS-1$ //$NON-NLS-2$
        }
       
        // Create temporary metadata that defines a group based on either the stored proc
        // name or the stored query name - this will be used later during planning
        String procName = storedProcedureCommand.getProcedureName();
        List tempElements = storedProcedureCommand.getProjectedSymbols();
        boolean isVirtual = storedProcedureInfo.getQueryPlan() != null;
        discoveredMetadata.addTempGroup(procName, tempElements, isVirtual);

        // Resolve tempElements against new metadata
        GroupSymbol procGroup = new GroupSymbol(storedProcedureInfo.getProcedureCallableName());
        procGroup.setProcedure(true);
        TempMetadataID tid = discoveredMetadata.getTempGroupID(procName);
        tid.setOriginalMetadataID(storedProcedureCommand.getProcedureID());
        procGroup.setMetadataID(tid);
        storedProcedureCommand.setGroup(procGroup);
View Full Code Here

     * @see org.teiid.query.resolver.ProcedureContainerResolver#getPlan(org.teiid.query.metadata.QueryMetadataInterface, org.teiid.query.sql.symbol.GroupSymbol)
     */
    protected String getPlan(QueryMetadataInterface metadata,
                             GroupSymbol group) throws TeiidComponentException,
                                               QueryMetadataException, QueryResolverException {
        StoredProcedureInfo storedProcedureInfo = metadata.getStoredProcedureInfoForProcedure(group.getCanonicalName());
       
        //if there is a query plan associated with the procedure, get it.
        QueryNode plan = storedProcedureInfo.getQueryPlan();
       
        if (plan.getQuery() == null) {
            throw new QueryResolverException("ERR.015.008.0009", QueryPlugin.Util.getString("ERR.015.008.0009", group, "Stored Procedure")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
        }
       
View Full Code Here

    } else if (currentCommand instanceof CreateUpdateProcedureCommand) {
      CreateUpdateProcedureCommand cupc = (CreateUpdateProcedureCommand)currentCommand;
      cupc.setVirtualGroup(container);

      if (type == Command.TYPE_STORED_PROCEDURE) {
        StoredProcedureInfo info = metadata.getStoredProcedureInfoForProcedure(container.getCanonicalName());
            // Create temporary metadata that defines a group based on either the stored proc
            // name or the stored query name - this will be used later during planning
            String procName = info.getProcedureCallableName();
           
            // Look through parameters to find input elements - these become child metadata
            List<ElementSymbol> tempElements = new ArrayList<ElementSymbol>(info.getParameters().size());
            boolean[] updatable = new boolean[info.getParameters().size()];
            int i = 0;
            for (SPParameter param : info.getParameters()) {
                if(param.getParameterType() != ParameterInfo.RESULT_SET) {
                    ElementSymbol symbol = param.getParameterSymbol();
                    tempElements.add(symbol);
                    updatable[i++] = param.getParameterType() != ParameterInfo.IN; 
                }
View Full Code Here

        QueryResolverException {
      GroupSymbol group = obj.getGroup();
      String fullName = metadata.getFullName(group.getMetadataID());
      String queryName = group.getName();
     
      StoredProcedureInfo storedProcedureInfo = metadata.getStoredProcedureInfoForProcedure(fullName);

      StoredProcedure storedProcedureCommand = new StoredProcedure();
      storedProcedureCommand.setProcedureRelational(true);
      storedProcedureCommand.setProcedureName(fullName);
     
      List<SPParameter> metadataParams = storedProcedureInfo.getParameters();
     
      Query procQuery = new Query();
      From from = new From();
      from.addClause(new SubqueryFromClause("X", storedProcedureCommand)); //$NON-NLS-1$
      procQuery.setFrom(from);
View Full Code Here

        if (!gs.isProcedure() || !getMetadata().isVirtualModel(getMetadata().getModelID(gs.getMetadataID()))) {
          handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.not_a_procedure", gs), gs); //$NON-NLS-1$
          return;
        }
        Validator.validate(obj.getDefinition(), getMetadata(), this);
        StoredProcedureInfo info = getMetadata().getStoredProcedureInfoForProcedure(gs.getName());
        for (SPParameter param : info.getParameters()) {
          if (param.getParameterType() == SPParameter.RESULT_SET) {
              QueryResolver.validateProjectedSymbols(gs, param.getResultSetColumns(), obj.getDefinition().getProjectedSymbols());
              break;
          }
        }
View Full Code Here

        FakeMetadataObject procedureID = store.findObject(fullyQualifiedProcedureName, FakeMetadataObject.PROCEDURE);
        if(procedureID == null) {
            throw new QueryMetadataException("Unknown stored procedure: " + fullyQualifiedProcedureName); //$NON-NLS-1$
        }

        StoredProcedureInfo procInfo = new StoredProcedureInfo();
        procInfo.setProcedureID(procedureID);
        procInfo.setModelID(procedureID.getProperty(FakeMetadataObject.Props.MODEL));
        procInfo.setQueryPlan((QueryNode)procedureID.getProperty(FakeMetadataObject.Props.PLAN));
        procInfo.setProcedureCallableName(fullyQualifiedProcedureName);
        procInfo.setUpdateCount(((Integer)procedureID.getProperty(FakeMetadataObject.Props.UPDATE_COUNT, new Integer(-1))).intValue());

        // Read params
        List params = (List) procedureID.getProperty(FakeMetadataObject.Props.PARAMS);
        List paramInfos = new ArrayList(params.size());
        Iterator iter = params.iterator();
        while(iter.hasNext()) {
            FakeMetadataObject param = (FakeMetadataObject) iter.next();
           
            String name = param.getName();
            if(name.indexOf(".") < 0) { //$NON-NLS-1$
                name = procedureID.getName() + "." + name; //$NON-NLS-1$
            }           
           
            int index = ( (Integer) param.getProperty(FakeMetadataObject.Props.INDEX) ).intValue();
            int direction = ( (Integer) param.getProperty(FakeMetadataObject.Props.DIRECTION) ).intValue();
            String dataTypeName = (String) param.getProperty(FakeMetadataObject.Props.TYPE);
            Class dataTypeClass = DataTypeManager.getDataTypeClass(dataTypeName);
           
            SPParameter paramInfo = new SPParameter(index, direction, name);
            paramInfo.setParameterType(direction);
            paramInfo.setMetadataID(param);
            if(direction == ParameterInfo.RESULT_SET) {
                paramInfo.setClassType(java.sql.ResultSet.class);
            } else {
                paramInfo.setClassType(dataTypeClass);
            }
           
            FakeMetadataObject resultSet = (FakeMetadataObject)param.getProperty(FakeMetadataObject.Props.RESULT_SET);
            if(resultSet != null){
              Iterator iter2 = ((List)resultSet.getProperty(FakeMetadataObject.Props.COLUMNS)).iterator();
              while(iter2.hasNext()){
                    ElementSymbol col = (ElementSymbol) iter2.next();
                paramInfo.addResultSetColumn(col.getName(), col.getType(), col.getMetadataID());
              }
            }
            paramInfos.add(paramInfo);
        }

        procInfo.setParameters(paramInfos);

        return procInfo;
  }
View Full Code Here

TOP

Related Classes of org.teiid.query.metadata.StoredProcedureInfo

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.