/*
* 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 java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
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.MappingSourceNode;
import org.teiid.query.mapping.xml.MappingVisitor;
import org.teiid.query.mapping.xml.Navigator;
import org.teiid.query.mapping.xml.ResultSetInfo;
import org.teiid.query.metadata.QueryMetadataInterface;
import org.teiid.query.processor.xml.TestXMLProcessor;
import org.teiid.query.sql.LanguageVisitor;
import org.teiid.query.sql.lang.Command;
import org.teiid.query.sql.lang.Query;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.query.sql.visitor.GroupCollectorVisitor;
/**
*
*/
public class TestNameInSourceResolverVisitor extends TestCase {
static HashMap infos = new HashMap();
XMLPlannerEnvironment getEnv(String sql) throws Exception{
QueryMetadataInterface metadata = TestXMLProcessor.exampleMetadataCached();
Query query = (Query)TestXMLProcessor.helpGetCommand(sql, metadata);
Collection<GroupSymbol> groups = GroupCollectorVisitor.getGroups(query, true);
GroupSymbol group = groups.iterator().next();
MappingDocument docOrig = (MappingDocument)metadata.getMappingNode(metadata.getGroupID(group.getName()));
MappingDocument doc = docOrig.clone();
XMLPlannerEnvironment env = new XMLPlannerEnvironment(metadata);
env.mappingDoc = doc;
setResultInfo("xmltest.group.items", new DummyCommand("xmltest.group.items", new String[] {"itemNum", "itemName", "itemQuantity", "itemStatus"})); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
setResultInfo("xmltest.suppliers", new DummyCommand("xmltest.suppliers", new String[] {"supplierNum", "supplierName", "supplierZipCode", "itemNum"})); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
setResultInfo("xmltest.orders", new DummyCommand("xmltest.orders", new String[] {"orderNum", "orderDate", "orderQty", "orderStatus"})); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
return env;
}
private static void setResultInfo(String groupName, Command command) {
ResultSetInfo rsInfo = new ResultSetInfo(groupName);
rsInfo.setCommand(command);
infos.put(groupName, rsInfo);
}
private static ResultSetInfo getResultInfo(String groupName) {
return (ResultSetInfo)infos.get(groupName);
}
public void testResolve() throws Exception {
XMLPlannerEnvironment env = getEnv("SELECT * FROM xmltest.doc9"); //$NON-NLS-1$
MappingDocument doc = env.mappingDoc;
// we should expect to fail
doc.acceptVisitor(new NameValidator(false));
doc = SourceNodeGenaratorVisitor.extractSourceNodes(doc);
doc.acceptVisitor(new Navigator(true, new SourceFixer()));
NameInSourceResolverVisitor.resolveElements(doc, env);
// now we pass
doc.acceptVisitor(new NameValidator(true));
}
static class SourceFixer extends MappingVisitor{
public void visit(MappingSourceNode sourceNode) {
ResultSetInfo info = getResultInfo(sourceNode.getResultName());
Map symbolMap = new HashMap();
for (Iterator i = info.getCommand().getProjectedSymbols().iterator(); i.hasNext();) {
ElementSymbol element = (ElementSymbol)i.next();
symbolMap.put(element, element);
}
sourceNode.setSymbolMap(symbolMap);
sourceNode.setResultSetInfo(info);
}
}
static class NameValidator extends MappingVisitor{
boolean shouldPass;
public NameValidator(boolean pass) {
this.shouldPass = pass;
}
public void visit(MappingAttribute attribute) {
if (attribute.getNameInSource() != null) {
if (this.shouldPass) {
assertNotNull(attribute.getElementSymbol());
}
else {
assertNull(attribute.getElementSymbol());
}
}
}
public void visit(MappingElement element) {
if (element.getNameInSource() != null) {
if (this.shouldPass) {
assertNotNull(element.getElementSymbol());
}
else {
assertNull(element.getElementSymbol());
}
}
}
}
static class DummyCommand extends Command{
List list = new ArrayList();
DummyCommand(String groupName, String[] symbols){
for (int i= 0; i < symbols.length; i++) {
list.add(new ElementSymbol(groupName+"."+symbols[i])); //$NON-NLS-1$
}
}
public List getProjectedSymbols() {
return list;
}
public boolean areResultsCachable() {
return false;
}
public Object clone() {
return null;
}
public int getType() {
return 0;
}
public void acceptVisitor(LanguageVisitor visitor) {
}
}
}