private static void determineDependencies(Command command, Column c, int index, LinkedHashSet<AbstractMetadataRecord> columnValues) { if (command instanceof Query) { Expression ex = command.getProjectedSymbols().get(index); collectDependencies(ex, columnValues); } else if (command instanceof SetQuery) { determineDependencies(((SetQuery)command).getLeftQuery(), c, index, columnValues); determineDependencies(((SetQuery)command).getRightQuery(), c, index, columnValues); } }
public void log(ValidatorReport report, ModelMetaData model, String msg) { log(report, model, Severity.ERROR, msg); }
private void validateUpdatePlan(ModelMetaData model, ValidatorReport report, QueryMetadataInterface metadata, Table t, String plan, int type) throws QueryParserException, QueryResolverException, TeiidComponentException { Command command = parser.parseProcedure(plan, true); validateNoReferences(command, report, model); QueryResolver.resolveCommand(command, new GroupSymbol(t.getFullName()), type, metadata, false); //determineDependencies(t, command); -- these should be tracked against triggers ValidatorReport resolverReport = Validator.validate(command, metadata); processReport(model, t, report, resolverReport); }
@Test public void testConstraintNames() throws Exception { buildModel("phy1", true, this.vdb, this.store, "CREATE FOREIGN TABLE t1 ( col1 string, col2 integer, constraint x primary key (col1), constraint x unique (col2) )"); buildTransformationMetadata(); ValidatorReport report = new MetadataValidator().validate(this.vdb, this.store); assertTrue(printError(report), report.hasItems()); }
Procedure p = (Procedure)record; Command command = parser.parseProcedure(p.getQueryPlan(), false); validateNoReferences(command, report, model); QueryResolver.resolveCommand(command, new GroupSymbol(p.getFullName()), Command.TYPE_STORED_PROCEDURE, metadata, false); resolverReport = Validator.validate(command, metadata); determineDependencies(p, command); } else if (record instanceof Table) { Table t = (Table)record; if (t.isVirtual()) { QueryCommand command = (QueryCommand)parser.parseCommand(selectTransformation); validateNoReferences(command, report, model); QueryResolver.resolveCommand(command, metadata); resolverReport = Validator.validate(command, metadata); for (Expression column:symbols) { try { addColumn(column, t, mf, metadata); } catch (TranslatorException e) { log(report, model, e.getMessage()); Expression projected = symbols.get(i); MetadataFactory.setDataType(DataTypeManager.getDataTypeName(projected.getType()), c, mf.getDataTypes(), false); copyExpressionMetadata(projected, metadata, c); determineDependencies(t, command); if (t.getInsertPlan() != null && t.isInsertPlanEnabled()) { validateUpdatePlan(model, report, metadata, t, t.getInsertPlan(), Command.TYPE_INSERT);
@Test public void testProcMetadataValidationError() throws Exception { String ddl = "create virtual procedure proc1(IN e1 varchar) RETURNS (e1 integer, e2 varchar(12)) AS begin create local temporary table x (e1 integer, e2 varchar not null); insert into x (e1) values (1); select * from x; end;"; buildModel("vm1", false, this.vdb, this.store, ddl); buildTransformationMetadata(); ValidatorReport report = new ValidatorReport(); new MetadataValidator.ResolveQueryPlans().execute(vdb, store, report, new MetadataValidator()); assertEquals("TEIID31080 vm1.proc1 validation error: Element x.e2 of x is neither nullable nor has a default value. A value must be specified in the insert.", report.getItems().iterator().next().toString()); }
QueryResolver.resolveCommand(command, new GroupSymbol(p.getFullName()), Command.TYPE_STORED_PROCEDURE, metadata, false); resolverReport = Validator.validate(command, metadata); determineDependencies(p, command); } else if (record instanceof Table) { Table t = (Table)record; for (Expression column:symbols) { try { addColumn(Symbol.getShortName(column), column.getType(), t, mf); } catch (TranslatorException e) { log(report, model, e.getMessage()); determineDependencies(t, command); if (t.getInsertPlan() != null && t.isInsertPlanEnabled()) { validateUpdatePlan(model, report, metadata, t, t.getInsertPlan(), Command.TYPE_INSERT); validateUpdatePlan(model, report, metadata, t, t.getUpdatePlan(), Command.TYPE_UPDATE); validateUpdatePlan(model, report, metadata, t, t.getDeletePlan(), Command.TYPE_DELETE); ResolverVisitor.resolveLanguageObject(ex, groups, metadata); if (!ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(ex).isEmpty()) { log(report, model, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31114, exprString, fbi.getFullName())); log(report, model, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31115, exprString, fbi.getFullName())); log(report, model, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31116, exprString, fbi.getFullName(), e.getMessage())); log(report, model, Severity.WARNING, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31252, t.getName(), cacheHint.getScope().name()));
public static void alterProcedureDefinition(final VDBMetaData vdb, final Procedure p, final String sql, boolean updateStore) { TransformationMetadata metadata = vdb.getAttachment(TransformationMetadata.class); DatabaseStore store = vdb.getAttachment(DatabaseStore.class); try { Command command = QueryParser.getQueryParser().parseProcedure(p.getQueryPlan(), false); QueryResolver.resolveCommand(command, new GroupSymbol(p.getFullName()), Command.TYPE_STORED_PROCEDURE, metadata, false); MetadataValidator.determineDependencies(p, command); } catch (TeiidException e) { //should have been caught in validation, but this logic //is also not mature so since there is no lock on the vdb //it is possible that the plan is no longer valid at this point due //to a concurrent execution } p.setQueryPlan(sql); p.setLastModified(System.currentTimeMillis()); metadata.addToMetadataCache(p, "transformation/"+StoredProcedure.class.getSimpleName().toUpperCase(), null); //$NON-NLS-1$ }
private void validateUpdatePlan(ModelMetaData model, ValidatorReport report, QueryMetadataInterface metadata, Table t, String plan, int type) throws QueryParserException, QueryResolverException, TeiidComponentException { Command command = parser.parseProcedure(plan, true); QueryResolver.resolveCommand(command, new GroupSymbol(t.getFullName()), type, metadata, false); //determineDependencies(t, command); -- these should be tracked against triggers ValidatorReport resolverReport = Validator.validate(command, metadata); processReport(model, t, report, resolverReport); }
@Test public void testResolvingOrder() throws Exception { buildModel("phy1", true, this.vdb, this.store, "CREATE FOREIGN TABLE t1 ( col1 string, col2 integer ) options (updatable true); CREATE view a as select * from t1;"); buildTransformationMetadata(); ValidatorReport report = new MetadataValidator().validate(this.vdb, this.store); assertFalse(printError(report), report.hasItems()); }
Procedure p = (Procedure)record; Command command = parser.parseProcedure(p.getQueryPlan(), false); validateNoReferences(command, report, model); QueryResolver.resolveCommand(command, new GroupSymbol(p.getFullName()), Command.TYPE_STORED_PROCEDURE, metadata, false); resolverReport = Validator.validate(command, metadata); determineDependencies(p, command); } else if (record instanceof Table) { Table t = (Table)record; if (t.isVirtual()) { QueryCommand command = (QueryCommand)parser.parseCommand(selectTransformation); validateNoReferences(command, report, model); QueryResolver.resolveCommand(command, metadata); resolverReport = Validator.validate(command, metadata); for (Expression column:symbols) { try { addColumn(column, t, mf, metadata); } catch (TranslatorException e) { log(report, model, e.getMessage()); Expression projected = symbols.get(i); MetadataFactory.setDataType(DataTypeManager.getDataTypeName(projected.getType()), c, mf.getDataTypes(), false); copyExpressionMetadata(projected, metadata, c); determineDependencies(t, command); if (t.getInsertPlan() != null && t.isInsertPlanEnabled()) { validateUpdatePlan(model, report, metadata, t, t.getInsertPlan(), Command.TYPE_INSERT);
@Test public void testSourceModelArtifacts() throws Exception { String ddl = "create foreign table g1(e1 integer, e2 varchar(12)); create view g2(e1 integer, e2 varchar(12)) AS select * from foo;"; buildModel("pm1", true, this.vdb, this.store, ddl); ValidatorReport report = new ValidatorReport(); new MetadataValidator.SourceModelArtifacts().execute(vdb, store, report, new MetadataValidator()); assertFalse(printError(report), report.hasItems()); }
public static void alterProcedureDefinition(final VDBMetaData vdb, final Procedure p, final String sql, boolean updateStore) { TransformationMetadata metadata = vdb.getAttachment(TransformationMetadata.class); DatabaseStore store = vdb.getAttachment(DatabaseStore.class); try { Command command = QueryParser.getQueryParser().parseProcedure(p.getQueryPlan(), false); QueryResolver.resolveCommand(command, new GroupSymbol(p.getFullName()), Command.TYPE_STORED_PROCEDURE, metadata, false); MetadataValidator.determineDependencies(p, command); } catch (TeiidException e) { //should have been caught in validation, but this logic //is also not mature so since there is no lock on the vdb //it is possible that the plan is no longer valid at this point due //to a concurrent execution } p.setQueryPlan(sql); p.setLastModified(System.currentTimeMillis()); metadata.addToMetadataCache(p, "transformation/"+StoredProcedure.class.getSimpleName().toUpperCase(), null); //$NON-NLS-1$ }
@Test(expected=ParseException.class) public void testProcWithMultipleReturn() throws Exception { String ddl = "create foreign procedure x (out param1 string result, out param2 string result); "; buildModel("pm1", true, this.vdb, this.store,ddl); buildTransformationMetadata(); ValidatorReport report = new MetadataValidator().validate(vdb, store); assertTrue(printError(report), report.hasItems()); }
@Test public void testViewModelArtifacts() throws Exception { String ddl = "create foreign table g1(e1 integer, e2 varchar(12)); create view g2(e1 integer, e2 varchar(12)) AS select * from foo;"; buildModel("vm1", false, this.vdb, this.store, ddl); ValidatorReport report = new ValidatorReport(); new MetadataValidator.SourceModelArtifacts().execute(vdb, store, report, new MetadataValidator()); assertTrue(printError(report), report.hasItems()); }
public void log(ValidatorReport report, ModelMetaData model, String msg) { log(report, model, Severity.ERROR, msg); }
private static void determineDependencies(Command command, Column c, int index, LinkedHashSet<AbstractMetadataRecord> columnValues) { if (command instanceof Query || command instanceof StoredProcedure) { Expression ex = command.getProjectedSymbols().get(index); collectDependencies(ex, columnValues); } else if (command instanceof SetQuery) { determineDependencies(((SetQuery)command).getLeftQuery(), c, index, columnValues); determineDependencies(((SetQuery)command).getRightQuery(), c, index, columnValues); } }
public static void alterProcedureDefinition(final VDBMetaData vdb, final Procedure p, final String sql, boolean updateStore) { TransformationMetadata metadata = vdb.getAttachment(TransformationMetadata.class); DatabaseStore store = vdb.getAttachment(DatabaseStore.class); try { Command command = QueryParser.getQueryParser().parseProcedure(p.getQueryPlan(), false); QueryResolver.resolveCommand(command, new GroupSymbol(p.getFullName()), Command.TYPE_STORED_PROCEDURE, metadata, false); MetadataValidator.determineDependencies(p, command); } catch (TeiidException e) { //should have been caught in validation, but this logic //is also not mature so since there is no lock on the vdb //it is possible that the plan is no longer valid at this point due //to a concurrent execution } p.setQueryPlan(sql); p.setLastModified(System.currentTimeMillis()); metadata.addToMetadataCache(p, "transformation/"+StoredProcedure.class.getSimpleName().toUpperCase(), null); //$NON-NLS-1$ }
private void validateUpdatePlan(ModelMetaData model, ValidatorReport report, QueryMetadataInterface metadata, Table t, String plan, int type) throws QueryParserException, QueryResolverException, TeiidComponentException { Command command = parser.parseProcedure(plan, true); validateNoReferences(command, report, model); QueryResolver.resolveCommand(command, new GroupSymbol(t.getFullName()), type, metadata, false); //determineDependencies(t, command); -- these should be tracked against triggers ValidatorReport resolverReport = Validator.validate(command, metadata); processReport(model, t, report, resolverReport); }
@Test public void testProcWithDuplicateParam() throws Exception { String ddl = "create foreign procedure x (out param1 string, out param1 string); "; buildModel("pm1", true, this.vdb, this.store,ddl); buildTransformationMetadata(); ValidatorReport report = new MetadataValidator().validate(vdb, store); assertTrue(printError(report), report.hasItems()); }