/*
* 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.processor.xml;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import junit.framework.TestCase;
import org.teiid.api.exception.query.QueryParserException;
import org.teiid.api.exception.query.QueryResolverException;
import org.teiid.common.buffer.BufferManager;
import org.teiid.common.buffer.BufferManagerFactory;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidProcessingException;
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.mapping.relational.QueryNode;
import org.teiid.query.mapping.xml.MappingNodeConstants;
import org.teiid.query.mapping.xml.ResultSetInfo;
import org.teiid.query.metadata.QueryMetadataInterface;
import org.teiid.query.parser.QueryParser;
import org.teiid.query.processor.FakeDataManager;
import org.teiid.query.processor.TestProcessor;
import org.teiid.query.resolver.QueryResolver;
import org.teiid.query.resolver.util.ResolverVisitor;
import org.teiid.query.rewriter.QueryRewriter;
import org.teiid.query.sql.lang.Command;
import org.teiid.query.sql.lang.Criteria;
import org.teiid.query.sql.lang.QueryCommand;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Symbol;
import org.teiid.query.unittest.RealMetadataFactory;
import org.teiid.query.util.CommandContext;
/**
*/
@SuppressWarnings("nls")
public class TestInstructions extends TestCase {
public TestInstructions(String name) {
super(name);
}
/**
* Construct some fake metadata. Basic conceptual tree is:
*
* stock (physical model)
* items (physical group)
* itemNum (string)
* itemName (string)
* itemQuantity (integer)
* xmltest (virtual model)
* rs (virtual group / result set definition)
* itemNum (string)
* itemName (string)
* itemQuantity (integer)
*/
public QueryMetadataInterface exampleMetadata() {
MetadataStore metadataStore = new MetadataStore();
// Create models
Schema stock = RealMetadataFactory.createPhysicalModel("stock", metadataStore); //$NON-NLS-1$
Schema xmltest = RealMetadataFactory.createVirtualModel("xmltest", metadataStore); //$NON-NLS-1$
// Create physical groups
Table items = RealMetadataFactory.createPhysicalGroup("items", stock); //$NON-NLS-1$
// Create physical elements
RealMetadataFactory.createElements(items,
new String[] { "itemNum", "itemName", "itemQuantity" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER });
// Create virtual groups
QueryNode rsQuery = new QueryNode("SELECT itemNum, itemName, itemQuantity FROM stock.items"); //$NON-NLS-1$ //$NON-NLS-2$
Table rs = RealMetadataFactory.createVirtualGroup("rs", xmltest, rsQuery); //$NON-NLS-1$
// Create virtual elements
RealMetadataFactory.createElements(rs,
new String[] { "itemNum", "itemName", "itemQuantity" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.INTEGER });
// Create the facade from the store
return RealMetadataFactory.createTransformationMetadata(metadataStore, "example");
}
private Command helpGetCommand(String sql, QueryMetadataInterface metadata) throws TeiidComponentException, TeiidProcessingException {
// parse
QueryParser parser = new QueryParser();
Command command = parser.parseCommand(sql);
QueryResolver.resolveCommand(command, metadata);
command = QueryRewriter.rewrite(command, metadata, null);
return command;
}
private Criteria helpGetCriteria(String sql, QueryMetadataInterface metadata) throws QueryParserException, QueryResolverException, TeiidComponentException {
QueryParser parser = new QueryParser();
Criteria crit = parser.parseCriteria(sql);
ResolverVisitor.resolveLanguageObject(crit, null, metadata);
return crit;
}
public void helpProcessInstructions(Program prog, XMLProcessorEnvironment env, String expected) throws Exception {
env.pushProgram(prog);
XMLPlan plan = new XMLPlan(env);
TestProcessor.doProcess(plan, new FakeDataManager(), new List[] {Arrays.asList(expected)}, new CommandContext());
}
public Program exampleProgram() throws Exception{
ProcessorInstruction i0 = new InitializeDocumentInstruction("UTF-8", true); //$NON-NLS-1$
NodeDescriptor descriptor = NodeDescriptor.createNodeDescriptor("Catalogs", null, AddNodeInstruction.ELEMENT, null, null, null,false, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE);//$NON-NLS-1$
ProcessorInstruction i1 = new AddNodeInstruction(descriptor);
ProcessorInstruction i2 = new MoveDocInstruction(MoveDocInstruction.DOWN);
descriptor = NodeDescriptor.createNodeDescriptor("Catalog", null, AddNodeInstruction.ELEMENT, null, null, null,false, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE);//$NON-NLS-1$
ProcessorInstruction i3 = new AddNodeInstruction(descriptor);
ProcessorInstruction i4 = new MoveDocInstruction(MoveDocInstruction.DOWN);
descriptor = NodeDescriptor.createNodeDescriptor("Items", null, AddNodeInstruction.ELEMENT, null, null, null,false, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE);//$NON-NLS-1$
ProcessorInstruction i5 = new AddNodeInstruction(descriptor);
ProcessorInstruction i6 = new MoveDocInstruction(MoveDocInstruction.DOWN);
ResultSetInfo info = new ResultSetInfo("xmltest.rs"); //$NON-NLS-1$
ProcessorInstruction i7 = new ExecSqlInstruction("xmltest.rs", info); //$NON-NLS-1$
ProcessorInstruction i8 = new MoveCursorInstruction("xmltest.rs"); //$NON-NLS-1$
WhileInstruction i9 = new WhileInstruction("xmltest.rs"); //$NON-NLS-1$
descriptor = NodeDescriptor.createNodeDescriptor("Item", null, AddNodeInstruction.ELEMENT, null, null, null,false, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE);//$NON-NLS-1$
ProcessorInstruction i10 = new AddNodeInstruction(descriptor);
ProcessorInstruction i11 = new MoveDocInstruction(MoveDocInstruction.DOWN);
descriptor = NodeDescriptor.createNodeDescriptor("ItemID", null, AddNodeInstruction.ATTRIBUTE, null, null, null, false, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE);//$NON-NLS-1$
ProcessorInstruction i12 = new AddNodeInstruction(descriptor, new ElementSymbol("xmltest.rs.itemNum")); //$NON-NLS-1$
descriptor = NodeDescriptor.createNodeDescriptor("Name", null, AddNodeInstruction.ELEMENT, null, null, null, false, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE);//$NON-NLS-1$
ProcessorInstruction i13 = new AddNodeInstruction(descriptor, new ElementSymbol("xmltest.rs.itemName"));//$NON-NLS-1$
descriptor = NodeDescriptor.createNodeDescriptor("Quantity", null, AddNodeInstruction.ELEMENT, null, null, null,false, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE);//$NON-NLS-1$
ProcessorInstruction i14 = new AddNodeInstruction(descriptor, new ElementSymbol("xmltest.rs.itemQuantity"));//$NON-NLS-1$
ProcessorInstruction i15 = new MoveDocInstruction(MoveDocInstruction.UP);
ProcessorInstruction i16 = new MoveCursorInstruction("xmltest.rs"); //$NON-NLS-1$
ProcessorInstruction i17 = new MoveDocInstruction(MoveDocInstruction.UP);
ProcessorInstruction i18 = new MoveDocInstruction(MoveDocInstruction.UP);
ProcessorInstruction i19 = new MoveDocInstruction(MoveDocInstruction.UP);
ProcessorInstruction i20 = new EndDocumentInstruction();
// Stitch them together
Program program = new Program();
program.addInstruction(i0);
program.addInstruction(i1);
program.addInstruction(i2);
program.addInstruction(i3);
program.addInstruction(i4);
program.addInstruction(i5);
program.addInstruction(i6);
program.addInstruction(i7);
program.addInstruction(i8);
program.addInstruction(i9);
Program subProgram = new Program();
i9.setBlockProgram(subProgram);
subProgram.addInstruction(i10);
subProgram.addInstruction(i11);
subProgram.addInstruction(i12);
subProgram.addInstruction(i13);
subProgram.addInstruction(i14);
subProgram.addInstruction(i15);
subProgram.addInstruction(i16);
program.addInstruction(i17);
program.addInstruction(i18);
program.addInstruction(i19);
program.addInstruction(i20);
//ProgramUtil.printProgram(program);
return program;
}
public Program exampleProgram2(Criteria crit) throws Exception{
ProcessorInstruction i0 = new InitializeDocumentInstruction("UTF-8", true); //$NON-NLS-1$
NodeDescriptor descriptor = NodeDescriptor.createNodeDescriptor("Catalogs", null, AddNodeInstruction.ELEMENT, null, null, null,false, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE);//$NON-NLS-1$
ProcessorInstruction i1 = new AddNodeInstruction(descriptor);
ProcessorInstruction i2 = new MoveDocInstruction(MoveDocInstruction.DOWN);
descriptor = NodeDescriptor.createNodeDescriptor("Catalog", null, AddNodeInstruction.ELEMENT, null, null, null,false, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE);//$NON-NLS-1$
ProcessorInstruction i3 = new AddNodeInstruction(descriptor);
ProcessorInstruction i4 = new MoveDocInstruction(MoveDocInstruction.DOWN);
descriptor = NodeDescriptor.createNodeDescriptor("Items", null, AddNodeInstruction.ELEMENT, null, null, null,false, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE);//$NON-NLS-1$
ProcessorInstruction i5 = new AddNodeInstruction(descriptor);
ProcessorInstruction i6 = new MoveDocInstruction(MoveDocInstruction.DOWN);
ResultSetInfo info = new ResultSetInfo("xmltest.rs"); //$NON-NLS-1$
ProcessorInstruction i7 = new ExecSqlInstruction("xmltest.rs", info); //$NON-NLS-1$
ProcessorInstruction i8 = new MoveCursorInstruction("xmltest.rs"); //$NON-NLS-1$
WhileInstruction i9 = new WhileInstruction("xmltest.rs"); //$NON-NLS-1$
//need to move this up here so it can be referenced by "If" instruction
ProcessorInstruction i17 = new MoveCursorInstruction("xmltest.rs"); //$NON-NLS-1$
IfInstruction i10 = new IfInstruction( );
descriptor = NodeDescriptor.createNodeDescriptor("Item", null, AddNodeInstruction.ELEMENT, null, null, null,false, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE);//$NON-NLS-1$
ProcessorInstruction i11 = new AddNodeInstruction(descriptor);
ProcessorInstruction i12 = new MoveDocInstruction(MoveDocInstruction.DOWN);
descriptor = NodeDescriptor.createNodeDescriptor("ItemID", null, AddNodeInstruction.ATTRIBUTE, null, null, null,false, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE);//$NON-NLS-1$
ProcessorInstruction i13 = new AddNodeInstruction(descriptor, new ElementSymbol("xmltest.rs.itemNum"));//$NON-NLS-1$
descriptor = NodeDescriptor.createNodeDescriptor("Name", null, AddNodeInstruction.ELEMENT, null, null, null,false, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE);//$NON-NLS-1$
ProcessorInstruction i14 = new AddNodeInstruction(descriptor, new ElementSymbol("xmltest.rs.itemName"));//$NON-NLS-1$
descriptor = NodeDescriptor.createNodeDescriptor("Quantity", null, AddNodeInstruction.ELEMENT, null, null, null,false, null, MappingNodeConstants.NORMALIZE_TEXT_PRESERVE);//$NON-NLS-1$
ProcessorInstruction i15 = new AddNodeInstruction(descriptor, new ElementSymbol("xmltest.rs.itemQuantity")); //$NON-NLS-1$
ProcessorInstruction i16 = new MoveDocInstruction(MoveDocInstruction.UP);
ProcessorInstruction i18 = new MoveDocInstruction(MoveDocInstruction.UP);
ProcessorInstruction i19 = new MoveDocInstruction(MoveDocInstruction.UP);
ProcessorInstruction i20 = new MoveDocInstruction(MoveDocInstruction.UP);
ProcessorInstruction i21 = new EndDocumentInstruction();
// Stitch them together
Program program = new Program();
program.addInstruction(i0);
program.addInstruction(i1);
program.addInstruction(i2);
program.addInstruction(i3);
program.addInstruction(i4);
program.addInstruction(i5);
program.addInstruction(i6);
program.addInstruction(i7);
program.addInstruction(i8);
program.addInstruction(i9);
Program whileProgram = new Program();
i9.setBlockProgram(whileProgram);
whileProgram.addInstruction(i10);
Program thenProgram = new Program();
Condition cond = new CriteriaCondition(crit, thenProgram);
i10.addCondition(cond);
thenProgram.addInstruction(i11);
thenProgram.addInstruction(i12);
thenProgram.addInstruction(i13);
thenProgram.addInstruction(i14);
thenProgram.addInstruction(i15);
thenProgram.addInstruction(i16);
whileProgram.addInstruction(i17);
program.addInstruction(i18);
program.addInstruction(i19);
program.addInstruction(i20);
program.addInstruction(i21);
//ProgramUtil.printProgram(program);
return program;
}
public void testProcess1() throws Exception {
QueryMetadataInterface metadata = exampleMetadata();
String resultSetName = "xmltest.rs"; //$NON-NLS-1$
FakeXMLProcessorEnvironment env = new FakeXMLProcessorEnvironment();
Program program = exampleProgram();
BufferManager bufferMgr = BufferManagerFactory.getStandaloneBufferManager();
XMLPlan temp = new XMLPlan(env);
CommandContext context = new CommandContext("pid", null, null, null, 1); //$NON-NLS-1$
temp.initialize(context,null,bufferMgr);
List<ElementSymbol> schema = new ArrayList<ElementSymbol>();
schema.add(new ElementSymbol(resultSetName + Symbol.SEPARATOR + "itemNum")); //$NON-NLS-1$
schema.add(new ElementSymbol(resultSetName + Symbol.SEPARATOR + "itemName")); //$NON-NLS-1$
schema.add(new ElementSymbol(resultSetName + Symbol.SEPARATOR + "itemQuantity")); //$NON-NLS-1$
env.addData(resultSetName, schema, new List[] {
Arrays.asList( new Object[] { "001", "Lamp", new Integer(5) } ), //$NON-NLS-1$ //$NON-NLS-2$
Arrays.asList( new Object[] { "002", "Screwdriver", new Integer(100) } ), //$NON-NLS-1$ //$NON-NLS-2$
Arrays.asList( new Object[] { "003", "Goat", new Integer(4) } ) //$NON-NLS-1$ //$NON-NLS-2$
} );
helpProcessInstructions(program, env,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + //$NON-NLS-1$
"<Catalogs>\n" + //$NON-NLS-1$
" <Catalog>\n" + //$NON-NLS-1$
" <Items>\n" + //$NON-NLS-1$
" <Item ItemID=\"001\">\n" + //$NON-NLS-1$
" <Name>Lamp</Name>\n" + //$NON-NLS-1$
" <Quantity>5</Quantity>\n" + //$NON-NLS-1$
" </Item>\n" + //$NON-NLS-1$
" <Item ItemID=\"002\">\n" + //$NON-NLS-1$
" <Name>Screwdriver</Name>\n" + //$NON-NLS-1$
" <Quantity>100</Quantity>\n" + //$NON-NLS-1$
" </Item>\n" + //$NON-NLS-1$
" <Item ItemID=\"003\">\n" + //$NON-NLS-1$
" <Name>Goat</Name>\n" + //$NON-NLS-1$
" <Quantity>4</Quantity>\n" + //$NON-NLS-1$
" </Item>\n" + //$NON-NLS-1$
" </Items>\n" + //$NON-NLS-1$
" </Catalog>\n" + //$NON-NLS-1$
"</Catalogs>"); //$NON-NLS-1$
}
public void testProcess2() throws Exception {
QueryMetadataInterface metadata = exampleMetadata();
String resultSetName = "xmltest.rs"; //$NON-NLS-1$
String sql = "SELECT itemNum, itemName, itemQuantity FROM xmltest.rs"; //$NON-NLS-1$
QueryCommand command = (QueryCommand) helpGetCommand(sql, metadata);
Criteria crit = helpGetCriteria("xmltest.rs.itemName = 'Screwdriver'", metadata); //$NON-NLS-1$
FakeXMLProcessorEnvironment env = new FakeXMLProcessorEnvironment();
Program program = exampleProgram2(crit);
BufferManager bufferMgr = BufferManagerFactory.getStandaloneBufferManager();
XMLPlan temp = new XMLPlan(env);
CommandContext context = new CommandContext("pid", null, null, null, 1); //$NON-NLS-1$
temp.initialize(context,null,bufferMgr);
env.addData(resultSetName, command.getProjectedSymbols(), new List[] {
Arrays.asList( new Object[] { "001", "Lamp", new Integer(5) } ), //$NON-NLS-1$ //$NON-NLS-2$
Arrays.asList( new Object[] { "002", "Screwdriver", new Integer(100) } ), //$NON-NLS-1$ //$NON-NLS-2$
Arrays.asList( new Object[] { "003", "Goat", new Integer(4) } ) //$NON-NLS-1$ //$NON-NLS-2$
} );
helpProcessInstructions(program, env,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + //$NON-NLS-1$
"<Catalogs>\n" + //$NON-NLS-1$
" <Catalog>\n" + //$NON-NLS-1$
" <Items>\n" + //$NON-NLS-1$
" <Item ItemID=\"002\">\n" + //$NON-NLS-1$
" <Name>Screwdriver</Name>\n" + //$NON-NLS-1$
" <Quantity>100</Quantity>\n" + //$NON-NLS-1$
" </Item>\n" + //$NON-NLS-1$
" </Items>\n" + //$NON-NLS-1$
" </Catalog>\n" + //$NON-NLS-1$
"</Catalogs>"); //$NON-NLS-1$
}
}