/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.query.optimizer.xml; import static org.junit.Assert.*; import org.junit.Test; import org.teiid.api.exception.query.QueryMetadataException; import org.teiid.api.exception.query.QueryPlannerException; import org.teiid.core.TeiidComponentException; import org.teiid.core.TeiidProcessingException; import org.teiid.core.id.IDGenerator; import org.teiid.core.types.DataTypeManager; import org.teiid.metadata.MetadataStore; import org.teiid.metadata.Schema; import org.teiid.metadata.Table; import org.teiid.query.analysis.AnalysisRecord; import org.teiid.query.mapping.relational.QueryNode; import org.teiid.query.mapping.xml.MappingAttribute; import org.teiid.query.mapping.xml.MappingDocument; import org.teiid.query.mapping.xml.MappingElement; import org.teiid.query.mapping.xml.MappingSequenceNode; import org.teiid.query.mapping.xml.Namespace; import org.teiid.query.metadata.QueryMetadataInterface; import org.teiid.query.metadata.TransformationMetadata; import org.teiid.query.optimizer.TestOptimizer; import org.teiid.query.optimizer.capabilities.CapabilitiesFinder; import org.teiid.query.parser.QueryParser; import org.teiid.query.processor.xml.BlockInstruction; import org.teiid.query.processor.xml.EndBlockInstruction; import org.teiid.query.processor.xml.ExecSqlInstruction; import org.teiid.query.processor.xml.ExecStagingTableInstruction; import org.teiid.query.processor.xml.MoveCursorInstruction; import org.teiid.query.processor.xml.Program; import org.teiid.query.processor.xml.TestXMLProcessor; import org.teiid.query.processor.xml.WhileInstruction; import org.teiid.query.processor.xml.XMLPlan; import org.teiid.query.resolver.QueryResolver; import org.teiid.query.sql.lang.Command; import org.teiid.query.sql.lang.Query; import org.teiid.query.unittest.RealMetadataFactory; import org.teiid.query.util.CommandContext; @SuppressWarnings("nls") public class TestXMLPlanner { // ################################## TEST HELPERS ################################ public static XMLPlan helpPlan(String sql, QueryMetadataInterface md) throws Exception { Command command = TestXMLProcessor.helpGetCommand(sql, md); return preparePlan(command, md, TestOptimizer.getGenericFinder(), null); } private void helpPlanException(String sql, QueryMetadataInterface md) throws QueryMetadataException, TeiidComponentException, TeiidProcessingException { Command command = TestXMLProcessor.helpGetCommand(sql, md); try { preparePlan(command, md, TestOptimizer.getGenericFinder(), null); fail("Expected exception for planning " + sql); //$NON-NLS-1$ } catch (QueryPlannerException e) { // this is expected } } public static TransformationMetadata example1() { MetadataStore metadataStore = new MetadataStore(); // Create models Schema pm1 = RealMetadataFactory.createPhysicalModel("pm1", metadataStore); //$NON-NLS-1$ Schema vm1 = RealMetadataFactory.createVirtualModel("vm1", metadataStore); //$NON-NLS-1$ // Create physical groups Table pm1g1 = RealMetadataFactory.createPhysicalGroup("g1", pm1); //$NON-NLS-1$ Table pm1g2 = RealMetadataFactory.createPhysicalGroup("g2", pm1); //$NON-NLS-1$ Table pm1g3 = RealMetadataFactory.createPhysicalGroup("g3", pm1); //$NON-NLS-1$ Table pm1g4 = RealMetadataFactory.createPhysicalGroup("g4", pm1); //$NON-NLS-1$ Table pm1g5 = RealMetadataFactory.createPhysicalGroup("g5", pm1); //$NON-NLS-1$ // Create physical elements RealMetadataFactory.createElements( pm1g1, new String[] { "e1", "e2", "e3", "e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.BOOLEAN, DataTypeManager.DefaultDataTypes.DOUBLE }); RealMetadataFactory.createElements( pm1g2, new String[] { "e1", "e2", "e3", "e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.BOOLEAN, DataTypeManager.DefaultDataTypes.DOUBLE }); RealMetadataFactory.createElements( pm1g3, new String[] { "e1", "e2", "e3", "e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.BOOLEAN, DataTypeManager.DefaultDataTypes.DOUBLE }); RealMetadataFactory.createElements( pm1g4, new String[] { "e1", "e2", "e3", "e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.BOOLEAN, DataTypeManager.DefaultDataTypes.DOUBLE }); RealMetadataFactory.createElements( pm1g5, new String[] { "e1", "e2", "e3", "e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.BOOLEAN, DataTypeManager.DefaultDataTypes.DOUBLE }); // Create virtual groups QueryNode vm1g1n1 = new QueryNode("SELECT * FROM tm1.g1"); //$NON-NLS-1$ //selects from temp group Table vm1g1 = RealMetadataFactory.createVirtualGroup("g1", vm1, vm1g1n1); //$NON-NLS-1$ QueryNode vm1g2n1 = new QueryNode("SELECT * FROM pm1.g2 where pm1.g2.e1=?"); //$NON-NLS-1$ vm1g2n1.addBinding("vm1.g1.e1"); //$NON-NLS-1$ Table vm1g2 = RealMetadataFactory.createVirtualGroup("g2", vm1, vm1g2n1); //$NON-NLS-1$ QueryNode vm1g3n1 = new QueryNode("SELECT * FROM pm1.g3 where pm1.g3.e1=?"); //$NON-NLS-1$ vm1g3n1.addBinding("vm1.g2.e1"); //$NON-NLS-1$ Table vm1g3 = RealMetadataFactory.createVirtualGroup("g3", vm1, vm1g3n1); //$NON-NLS-1$ QueryNode vm1g4n1 = new QueryNode("SELECT * FROM pm1.g4"); //$NON-NLS-1$ Table vm1g4 = RealMetadataFactory.createVirtualGroup("g4", vm1, vm1g4n1); //$NON-NLS-1$ QueryNode vm1g5n1 = new QueryNode( "SELECT * FROM pm1.g5 where pm1.g5.e1=? AND pm1.g5.e2=?"); //$NON-NLS-1$ vm1g5n1.addBinding("vm1.g4.e1"); //$NON-NLS-1$ vm1g5n1.addBinding("vm1.g1.e1"); //$NON-NLS-1$ Table vm1g5 = RealMetadataFactory.createVirtualGroup("g5", vm1, vm1g5n1); //$NON-NLS-1$ QueryNode tempGroup1 = new QueryNode("SELECT * FROM pm1.g1 where e2 < '5'"); //$NON-NLS-1$ Table tm1g1 = RealMetadataFactory.createVirtualGroup("tm1.g1", vm1, tempGroup1); //$NON-NLS-1$ // Create virtual elements RealMetadataFactory.createElements( vm1g1, new String[] { "e1", "e2", "e3", "e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.BOOLEAN, DataTypeManager.DefaultDataTypes.DOUBLE }); RealMetadataFactory.createElements( vm1g2, new String[] { "e1", "e2", "e3", "e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.BOOLEAN, DataTypeManager.DefaultDataTypes.DOUBLE }); RealMetadataFactory.createElements( vm1g3, new String[] { "e1", "e2", "e3", "e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.BOOLEAN, DataTypeManager.DefaultDataTypes.DOUBLE }); RealMetadataFactory.createElements( vm1g4, new String[] { "e1", "e2", "e3", "e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.BOOLEAN, DataTypeManager.DefaultDataTypes.DOUBLE }); RealMetadataFactory.createElements( vm1g5, new String[] { "e1", "e2", "e3", "e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.BOOLEAN, DataTypeManager.DefaultDataTypes.DOUBLE }); RealMetadataFactory.createElements( tm1g1, new String[] { "e1", "e2", "e3", "e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.BOOLEAN, DataTypeManager.DefaultDataTypes.DOUBLE }); // Create virtual documents // DOC 1 RealMetadataFactory.createXmlDocument("doc1", vm1, doc1()); //$NON-NLS-1$ // DOC 2 RealMetadataFactory.createXmlDocument("doc2", vm1, doc2()); //$NON-NLS-1$ // DOC 3 RealMetadataFactory.createXmlDocument("doc3", vm1, doc3()); //$NON-NLS-1$ // DOC 4 RealMetadataFactory.createXmlDocument("doc4", vm1, doc4()); //$NON-NLS-1$ // DOC 5 RealMetadataFactory.createXmlDocument("doc5", vm1, doc5()); //$NON-NLS-1$ // DOC 6 RealMetadataFactory.createXmlDocument("doc6", vm1, doc6()); //$NON-NLS-1$ // DOC with excluded fragment RealMetadataFactory.createXmlDocument( "vm1.docWithExcluded", //$NON-NLS-1$ vm1, docWithExcluded()); // DOC 2 with excluded fragment RealMetadataFactory.createXmlDocument( "vm1.docWithExcluded2", //$NON-NLS-1$ vm1, docWithExcluded2()); // DOC with attribute RealMetadataFactory.createXmlDocument( "vm1.docWithAttribute", //$NON-NLS-1$ vm1, docTestConvertCriteriaWithAttribute()); RealMetadataFactory.createXmlDocument( "vm1.docWithAttribute3", //$NON-NLS-1$ vm1, docTestCriteriaWithAttribute()); // DOC with attribute2 RealMetadataFactory.createXmlDocument( "vm1.docWithAttribute2", //$NON-NLS-1$ vm1, docTestConvertCriteriaWithAttribute2()); // Create the facade from the store return RealMetadataFactory.createTransformationMetadata(metadataStore, "example1"); } private static MappingDocument doc1() { // DOC 1 MappingDocument doc = new MappingDocument(false); MappingElement node= doc.addChildElement(new MappingElement("a0")); //$NON-NLS-1$ MappingElement sourceNode = node.addChildElement(new MappingElement("a1")); //$NON-NLS-1$ sourceNode.setSource("vm1.g1"); //$NON-NLS-1$ sourceNode.addStagingTable("tm1.g1"); //$NON-NLS-1$ sourceNode.addChildElement(new MappingElement("a1", "vm1.g1.e1")); //$NON-NLS-1$ //$NON-NLS-2$ sourceNode.addChildElement(new MappingElement("b1", "vm1.g1.e2")); //$NON-NLS-1$ //$NON-NLS-2$ sourceNode.addChildElement(new MappingElement("c1", "vm1.g1.e3")); //$NON-NLS-1$ //$NON-NLS-2$ return doc; } private static MappingDocument doc2() { MappingDocument doc = new MappingDocument(false); MappingElement A1 = doc.addChildElement(new MappingElement("a1", "vm1.g1.e1")); //$NON-NLS-1$ //$NON-NLS-2$ A1.setSource("vm1.g1"); //$NON-NLS-1$ return doc; } private static MappingDocument docTestConvertCriteriaWithAttribute() { MappingDocument doc = new MappingDocument(false); MappingElement root = doc.addChildElement(new MappingElement("root")); //$NON-NLS-1$ root.setSource("vm1.g1"); //$NON-NLS-1$ root.addChildElement(new MappingElement("myElement", "vm1.g1.e2")); //$NON-NLS-1$ //$NON-NLS-2$ root.addAttribute(new MappingAttribute("myAttribute", "vm1.g1.e1")); //$NON-NLS-1$ //$NON-NLS-2$ return doc; } private static MappingDocument docTestConvertCriteriaWithAttribute2() { MappingDocument doc = new MappingDocument(false); MappingElement root = doc.addChildElement(new MappingElement("root")); //$NON-NLS-1$ root.setSource("vm1.g1"); //$NON-NLS-1$ root.addAttribute(new MappingAttribute("myAttribute", "vm1.g1.e1")); //$NON-NLS-1$ //$NON-NLS-2$ MappingSequenceNode seq = root.addSequenceNode(new MappingSequenceNode()); seq.addChildElement(new MappingElement("myElement", "vm1.g1.e2")); //$NON-NLS-1$ //$NON-NLS-2$ return doc; } /* * Note: this should fail when validator starts verifying that vm1.g1 cannot * be executed before the temp group tm1.g1 is, since it selects from that * group but is not in it's scope */ private static MappingDocument doc3() { MappingDocument doc = new MappingDocument(false); MappingElement root = doc.addChildElement(new MappingElement("root")); //$NON-NLS-1$ MappingElement n1 = root.addChildElement(new MappingElement("n1")); //$NON-NLS-1$ n1.setSource("vm1.g1"); //$NON-NLS-1$ MappingElement m1 = n1.addChildElement(new MappingElement("m1")); //$NON-NLS-1$ MappingElement n2 = m1.addChildElement(new MappingElement("n2")); //$NON-NLS-1$ n2.setSource("vm1.g2"); //$NON-NLS-1$ n2.addStagingTable("tm1.g1"); //$NON-NLS-1$ n2.addChildElement(new MappingElement("leaf1", "vm1.g1.e1")); //$NON-NLS-1$ //$NON-NLS-2$ return doc; } private static MappingDocument doc4() { MappingDocument doc = new MappingDocument(false); MappingElement root = doc.addChildElement(new MappingElement("root")); //$NON-NLS-1$ MappingElement n4a = root.addChildElement(new MappingElement("n4a")); //$NON-NLS-1$ n4a.setMaxOccurrs(-1); n4a.setSource("vm1.g1"); //$NON-NLS-1$ n4a.addStagingTable("tm1.g1"); //$NON-NLS-1$ n4a.addChildElement(new MappingElement("n4b", "vm1.g1.e1")); //$NON-NLS-1$ //$NON-NLS-2$ MappingElement n4c = n4a.addChildElement(new MappingElement("n4c")); //$NON-NLS-1$ n4c.setMaxOccurrs(-1); n4c.setSource("vm1.g2"); //$NON-NLS-1$ //this node can't be used for anything but searching through mapping doc for this property MappingElement fake = n4a.addChildElement(new MappingElement("fake")); //$NON-NLS-1$ fake.setSource("fakeResultSet"); //$NON-NLS-1$ n4c.addChildElement(new MappingElement("n4d", "vm1.g2.e1")); //$NON-NLS-1$ //$NON-NLS-2$ MappingElement n4e = n4c.addChildElement(new MappingElement("n4e")); //$NON-NLS-1$ n4e.setSource("vm1.g3"); //$NON-NLS-1$ n4e.setMaxOccurrs(-1); n4e.addChildElement(new MappingElement("n4f", "vm1.g3.e1")); //$NON-NLS-1$ //$NON-NLS-2$ return doc; } private static MappingDocument doc5() { MappingDocument doc = new MappingDocument(false); MappingElement root = doc.addChildElement(new MappingElement("root")); //$NON-NLS-1$ MappingElement nodea = root.addChildElement(new MappingElement("nodea")); //$NON-NLS-1$ nodea.setSource("vm1.g1"); //$NON-NLS-1$ nodea.addStagingTable("tm1.g1"); //$NON-NLS-1$ nodea.setMaxOccurrs(-1); nodea.addChildElement(new MappingElement("nodeb", "vm1.g1.e1")); //$NON-NLS-1$ //$NON-NLS-2$ MappingElement nodec = nodea.addChildElement(new MappingElement("nodec")); //$NON-NLS-1$ nodec.setMaxOccurrs(-1); nodec.setSource("vm1.g2"); //$NON-NLS-1$ nodec.addChildElement(new MappingElement("noded", "vm1.g2.e1")); //$NON-NLS-1$ //$NON-NLS-2$ MappingElement nodee = nodec.addChildElement(new MappingElement("nodee")); //$NON-NLS-1$ nodee.setSource("vm1.g3"); //$NON-NLS-1$ nodee.setMaxOccurrs(-1); nodee.addChildElement(new MappingElement("nodef", "vm1.g3.e1")); //$NON-NLS-1$ //$NON-NLS-2$ MappingElement nodeg = nodee.addChildElement(new MappingElement("nodeg")); //$NON-NLS-1$ nodeg.setSource("vm1.g4"); //$NON-NLS-1$ nodeg.setMaxOccurrs(-1); nodeg.addChildElement(new MappingElement("nodeh", "vm1.g4.e1")); //$NON-NLS-1$ //$NON-NLS-2$ MappingElement nodeI = nodeg.addChildElement(new MappingElement("nodeI")); //$NON-NLS-1$ nodeI.setMaxOccurrs(-1); nodeI.setSource("vm1.g5"); //$NON-NLS-1$ nodeI.addChildElement(new MappingElement("nodeJ", "vm1.g5.e1")); //$NON-NLS-1$ //$NON-NLS-2$ return doc; } private static MappingDocument doc6() { MappingDocument doc = new MappingDocument(false); MappingElement simpleRoot = doc.addChildElement(new MappingElement("tempGroupTest")); //$NON-NLS-1$ simpleRoot.setSource("vm1.g1"); //$NON-NLS-1$ simpleRoot.addStagingTable("tm1.g1"); //$NON-NLS-1$ return doc; } private static MappingDocument docWithExcluded() { MappingDocument doc = new MappingDocument(false); MappingElement root = doc.addChildElement(new MappingElement("root")); //$NON-NLS-1$ MappingElement n1 = root.addChildElement(new MappingElement("n1")); //$NON-NLS-1$ n1.setSource("vm1.g1"); //$NON-NLS-1$ MappingElement m1 = n1.addChildElement(new MappingElement("m1", "vm1.g1.e1")); //$NON-NLS-1$ //$NON-NLS-2$ MappingElement n2 = m1.addChildElement(new MappingElement("n2")); //$NON-NLS-1$ n2.setSource("vm1.g2"); //$NON-NLS-1$ n2.setExclude(true); n2.addChildElement(new MappingElement("leaf1", "vm1.g2.e2")); //$NON-NLS-1$ //$NON-NLS-2$ return doc; } private static MappingDocument docWithExcluded2() { MappingDocument doc = new MappingDocument(false); MappingElement root = doc.addChildElement(new MappingElement("root")); //$NON-NLS-1$ MappingElement n1 = root.addChildElement(new MappingElement("n1")); //$NON-NLS-1$ n1.setSource("vm1.g1"); //$NON-NLS-1$ n1.addChildElement(new MappingElement("m1", "vm1.g1.e1")); //$NON-NLS-1$ //$NON-NLS-2$ MappingElement m2 = n1.addChildElement(new MappingElement("m2", "vm1.g1.e2")); //$NON-NLS-1$ //$NON-NLS-2$ m2.setExclude(true); n1.addChildElement(new MappingElement("m3", "vm1.g1.e3")); //$NON-NLS-1$ //$NON-NLS-2$ return doc; } private static MappingDocument docTestCriteriaWithAttribute() { MappingDocument doc = new MappingDocument(false); MappingElement root = doc.addChildElement(new MappingElement("root")); //$NON-NLS-1$ root.setSource("vm1.g1"); //$NON-NLS-1$ root.addAttribute(new MappingAttribute("type", new Namespace("xsi", ""))); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ root.addAttribute(new MappingAttribute("type", "vm1.g1.e1")); //$NON-NLS-1$ //$NON-NLS-2$ root.addChildElement(new MappingElement("myElement", "vm1.g1.e2")); //$NON-NLS-1$ //$NON-NLS-2$ return doc; } @Test public void test1() throws Exception { helpPlan("SELECT * FROM vm1.doc1", example1()); //$NON-NLS-1$ } /** * Tests that a user cannot cite an invalid XML node in criteria * (a node that is not mapped to data) * (Also duplicate defect 8130) */ @Test public void test1_defect7341() throws Exception { helpPlanException("SELECT * FROM vm1.doc1 WHERE a0 = '3'", example1()); //$NON-NLS-1$ } /** * Tests that a user cannot cite an invalid XML node in criteria * (a node that is not mapped to data) * (Also duplicate defect 8130) */ @Test public void test1_defect7341_a() throws Exception { helpPlanException( "SELECT * FROM vm1.doc3 WHERE context(m1, m1) = '3'", //$NON-NLS-1$ example1()); } @Test public void test2() throws Exception { helpPlan("SELECT * FROM vm1.doc2", example1()); //$NON-NLS-1$ } @Test public void test3() throws Exception { helpPlan("SELECT * FROM vm1.doc1 where a0.a1.a1='x'", example1()); //$NON-NLS-1$ } /** * Note: this should fail when validator starts verifying that vm1.g1 cannot * be executed before the temp group tm1.g1 is, since it selects from that * group but is not in it's scope */ @Test public void test4() throws Exception { helpPlan("SELECT * FROM vm1.doc3", example1()); //$NON-NLS-1$ } @Test public void testTempGroupPlan() throws Exception { QueryMetadataInterface qmi = example1(); XMLPlan plan = helpPlan("SELECT * FROM vm1.doc6", qmi); //$NON-NLS-1$ Program program = plan.getOriginalProgram(); int i = 0; assertTrue(program.getInstructionAt(i++) instanceof ExecStagingTableInstruction); assertTrue(program.getInstructionAt(i++) instanceof ExecSqlInstruction); assertTrue(program.getInstructionAt(i++) instanceof BlockInstruction); assertTrue(program.getInstructionAt(i++) instanceof MoveCursorInstruction); assertTrue(program.getInstructionAt(i++) instanceof WhileInstruction); assertTrue(program.getInstructionAt(i++) instanceof EndBlockInstruction); assertTrue(program.getInstructionAt(i++) instanceof ExecStagingTableInstruction); } @Test public void testPreparePlan() throws Exception { helpPlan( "SELECT * FROM vm1.doc1 ORDER BY vm1.doc1.a0.a1.c1", //$NON-NLS-1$ example1()); } @Test public void testPreparePlan2() throws Exception { helpPlan( "SELECT root.@myAttribute FROM vm1.docWithAttribute", //$NON-NLS-1$ example1()); } /** * This method takes in a Command object of the user's query and returns a XML plan * as a XMLNode object. * @param command The Command object for which query plan is to be returned * @param metadata The metadata needed for planning * @return The XML plan returned as an XMLPlan object * @throws QueryPlannerException * @throws QueryMetadataException * @throws TeiidComponentException */ public static XMLPlan preparePlan(Command command, QueryMetadataInterface metadata, CapabilitiesFinder capFinder, CommandContext context) throws QueryPlannerException, QueryMetadataException, TeiidComponentException { IDGenerator idGenerator = new IDGenerator(); AnalysisRecord analysis = new AnalysisRecord(false, DEBUG); try { if (DEBUG) { System.out.println("\n####################################\n" + command); //$NON-NLS-1$ } return XMLPlanner.preparePlan(command, metadata, analysis, new XMLPlannerEnvironment(metadata), idGenerator, capFinder, context); } finally { if (DEBUG) { System.out.println(analysis.getDebugLog()); } } } @Test public void testDefect18227() throws Exception { QueryMetadataInterface metadata = example1(); String sql = "select * from vm1.docWithAttribute3 where root.@type = '3'"; //$NON-NLS-1$ Query query = (Query)TestXMLProcessor.helpGetCommand(sql, metadata); try { preparePlan(query, metadata, TestOptimizer.getGenericFinder(), new CommandContext()); fail("Expected to get error about criteria against unmapped type attribute"); //$NON-NLS-1$ } catch(QueryPlannerException e) { // Expect to get exception about criteria against xsi:type } } @Test public void testDefect21983() throws Exception { QueryMetadataInterface metadata = example1(); String sql = "select root.@type from vm1.docWithAttribute3"; //$NON-NLS-1$ Query query = (Query)TestXMLProcessor.helpGetCommand(sql, metadata); //here's the test preparePlan(query, metadata, TestOptimizer.getGenericFinder(), new CommandContext()); } /** * Test that if non-fully-qualified staging table name is used in user criteria, that fully-qualified * name is returned by XMLPlanner * @throws Exception */ @Test public void testRootStagingTableCase4308() throws Exception{ String sql = "select * from vm1.doc1 where stagingTable2.e1 IN ('a', 'b', 'c')"; //$NON-NLS-1$ QueryMetadataInterface metadata = exampleCase4308(); Query query = (Query)new QueryParser().parseCommand(sql); QueryResolver.resolveCommand(query, metadata); String expectedStagingTableResultSet = "vm1.doc1.stagingTable2"; //$NON-NLS-1$ String actualStagingTableResultSet = CriteriaPlanner.getStagingTableForConjunct(query.getCriteria(), metadata); assertEquals(expectedStagingTableResultSet, actualStagingTableResultSet); } private TransformationMetadata exampleCase4308(){ MetadataStore metadataStore = new MetadataStore(); // Create models Schema pm1 = RealMetadataFactory.createPhysicalModel("pm1", metadataStore); //$NON-NLS-1$ Schema vm1 = RealMetadataFactory.createVirtualModel("vm1", metadataStore); //$NON-NLS-1$ // Create physical groups Table pm1g1 = RealMetadataFactory.createPhysicalGroup("g1", pm1); //$NON-NLS-1$ // Create physical elements RealMetadataFactory.createElements( pm1g1, new String[] { "e1", "e2", "e3", "e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.BOOLEAN, DataTypeManager.DefaultDataTypes.DOUBLE }); QueryNode stagingTableNode = new QueryNode("SELECT * FROM pm1.g1"); //$NON-NLS-1$ Table stagingTable = RealMetadataFactory.createXmlStagingTable("doc1.stagingTable2", vm1, stagingTableNode); //$NON-NLS-1$ RealMetadataFactory.createElements( stagingTable, new String[] { "e1", "e2", "e3", "e4" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.BOOLEAN, DataTypeManager.DefaultDataTypes.DOUBLE }); MappingDocument doc = new MappingDocument(false); MappingElement root = doc.addChildElement(new MappingElement("root")); //$NON-NLS-1$ root.addStagingTable("vm1.doc1.stagingTable2"); // Create virtual documents // DOC 1 RealMetadataFactory.createXmlDocument( "doc1", //$NON-NLS-1$ vm1, doc); return RealMetadataFactory.createTransformationMetadata(metadataStore, "case4308"); } private static final boolean DEBUG = false; }