[teiid-commits] teiid SVN: r1255 - in trunk/connectors: connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator and 4 other directories.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Mon Aug 17 23:01:39 EDT 2009
Author: shawkins
Date: 2009-08-17 23:01:39 -0400 (Mon, 17 Aug 2009)
New Revision: 1255
Added:
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleSpatialFunctionModifier.java
trunk/connectors/connector-jdbc/src/main/resources/OracleSpatialFunctions.xmi
Removed:
trunk/connectors/sandbox/connector-oracle-spatial/
Modified:
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleCapabilities.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleSQLTranslator.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/Translator.java
trunk/connectors/connector-jdbc/src/main/resources/org/teiid/connector/jdbc/i18n.properties
trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestOracleTranslator.java
trunk/connectors/sandbox/pom.xml
Log:
TEIID-787 merging oracle and oracle spatial connectors.
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleCapabilities.java 2009-08-17 21:38:58 UTC (rev 1254)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleCapabilities.java 2009-08-18 03:01:39 UTC (rev 1255)
@@ -39,8 +39,8 @@
/**
* @see com.metamatrix.data.ConnectorCapabilities#getSupportedFunctions()
*/
- public List getSupportedFunctions() {
- List supportedFunctions = new ArrayList();
+ public List<String> getSupportedFunctions() {
+ List<String> supportedFunctions = new ArrayList<String>();
supportedFunctions.addAll(super.getSupportedFunctions());
supportedFunctions.add("ABS"); //$NON-NLS-1$
supportedFunctions.add("ACOS"); //$NON-NLS-1$
@@ -104,7 +104,13 @@
supportedFunctions.add("CONVERT"); //$NON-NLS-1$
supportedFunctions.add("IFNULL"); //$NON-NLS-1$
supportedFunctions.add("NVL"); //$NON-NLS-1$
- supportedFunctions.add("COALESCE"); //$NON-NLS-1$
+ supportedFunctions.add("COALESCE"); //$NON-NLS-1$
+
+ supportedFunctions.add(OracleSQLTranslator.RELATE);
+ supportedFunctions.add(OracleSQLTranslator.NEAREST_NEIGHBOR);
+ supportedFunctions.add(OracleSQLTranslator.FILTER);
+ supportedFunctions.add(OracleSQLTranslator.NEAREST_NEIGHBOR_DISTANCE);
+ supportedFunctions.add(OracleSQLTranslator.WITHIN_DISTANCE);
return supportedFunctions;
}
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleSQLTranslator.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleSQLTranslator.java 2009-08-17 21:38:58 UTC (rev 1254)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleSQLTranslator.java 2009-08-18 03:01:39 UTC (rev 1255)
@@ -31,6 +31,7 @@
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import org.teiid.connector.api.ConnectorCapabilities;
@@ -38,27 +39,42 @@
import org.teiid.connector.api.ConnectorException;
import org.teiid.connector.api.ExecutionContext;
import org.teiid.connector.api.SourceSystemFunctions;
+import org.teiid.connector.api.TypeFacility;
import org.teiid.connector.jdbc.JDBCPlugin;
import org.teiid.connector.jdbc.translator.AliasModifier;
import org.teiid.connector.jdbc.translator.ExtractFunctionModifier;
import org.teiid.connector.jdbc.translator.Translator;
import org.teiid.connector.language.ICommand;
+import org.teiid.connector.language.ICriteria;
import org.teiid.connector.language.IElement;
+import org.teiid.connector.language.IFunction;
import org.teiid.connector.language.IGroup;
import org.teiid.connector.language.IInsert;
import org.teiid.connector.language.IInsertExpressionValueSource;
import org.teiid.connector.language.ILimit;
+import org.teiid.connector.language.IQuery;
import org.teiid.connector.language.IQueryCommand;
+import org.teiid.connector.language.ISelect;
import org.teiid.connector.language.ISelectSymbol;
import org.teiid.connector.language.ISetQuery.Operation;
import org.teiid.connector.metadata.runtime.Element;
+import org.teiid.connector.visitor.util.CollectorVisitor;
import org.teiid.connector.visitor.util.SQLReservedWords;
/**
*/
-public class OracleSQLTranslator extends Translator {
+public class OracleSQLTranslator extends Translator {
+ /*
+ * Spatial Functions
+ */
+ public static final String RELATE = "sdo_relate"; //$NON-NLS-1$
+ public static final String NEAREST_NEIGHBOR = "sdo_nn"; //$NON-NLS-1$
+ public static final String FILTER = "sdo_filter"; //$NON-NLS-1$
+ public static final String WITHIN_DISTANCE = "sdo_within_distance"; //$NON-NLS-1$
+ public static final String NEAREST_NEIGHBOR_DISTANCE = "sdo_nn_distance"; //$NON-NLS-1$
+
public final static String HINT_PREFIX = "/*+"; //$NON-NLS-1$
public final static String DUAL = "DUAL"; //$NON-NLS-1$
public final static String ROWNUM = "ROWNUM"; //$NON-NLS-1$
@@ -91,10 +107,45 @@
registerFunctionModifier(SourceSystemFunctions.LEFT, new LeftOrRightFunctionModifier(getLanguageFactory()));
registerFunctionModifier(SourceSystemFunctions.RIGHT, new LeftOrRightFunctionModifier(getLanguageFactory()));
registerFunctionModifier(SourceSystemFunctions.CONCAT, new ConcatFunctionModifier(getLanguageFactory()));
+ registerFunctionModifier(RELATE, new OracleSpatialFunctionModifier());
+ registerFunctionModifier(NEAREST_NEIGHBOR, new OracleSpatialFunctionModifier());
+ registerFunctionModifier(FILTER, new OracleSpatialFunctionModifier());
+ registerFunctionModifier(WITHIN_DISTANCE, new OracleSpatialFunctionModifier());
}
@Override
public ICommand modifyCommand(ICommand command, ExecutionContext context) throws ConnectorException {
+ if (command instanceof IQuery) {
+ IQuery query = (IQuery)command;
+
+ ISelect select = ((IQuery)command).getSelect();
+ List<ISelectSymbol> symbols = select.getSelectSymbols();
+
+ Collection<IFunction> functions = CollectorVisitor.collectObjects(IFunction.class, select);
+ for (IFunction function : functions) {
+ if (function.getName().equalsIgnoreCase("SDO_NN_DISTANCE")) {//$NON-NLS-1$
+ ICriteria criteria = query.getWhere();
+ if(criteria == null || criteria.toString().indexOf("SDO_NN") == -1){ //$NON-NLS-1$
+ throw(new ConnectorException(
+ JDBCPlugin.Util.getString("OracleSpatialSQLTranslator.SDO_NN_DEPENDENCY_ERROR"))); //$NON-NLS-1$
+ }
+ break;
+ }
+ }
+
+ for (int i = 0; i < symbols.size(); i++) {
+ ISelectSymbol symbol = symbols.get(i);
+ if (symbol.getExpression().getType().equals(Object.class)) {
+ String outName = symbol.getOutputName();
+ int lIndx = outName.lastIndexOf("."); //$NON-NLS-1$
+ symbol.setOutputName(outName.substring(lIndx + 1));
+ symbol.setExpression(getLanguageFactory().createLiteral(null, TypeFacility.RUNTIME_TYPES.OBJECT));
+ symbol.setAlias(true);
+ }
+ }
+ return query;
+ }
+
if (!(command instanceof IInsert)) {
return command;
}
@@ -236,6 +287,25 @@
}
}
}
+
+ if (command instanceof IQuery) {
+ //
+ // This simple algorithm determines the hint which will be added to the
+ // query.
+ // Right now, we look through all functions passed in the query
+ // (returned as a collection)
+ // Then we check if any of those functions contain the strings 'sdo' and
+ // 'relate'
+ // If so, the ORDERED hint is added, if not, it isn't
+ Collection<IFunction> col = CollectorVisitor.collectObjects(IFunction.class, command);
+ for (IFunction func : col) {
+ String funcName = func.getName().toUpperCase();
+ int indx1 = funcName.indexOf("SDO"); //$NON-NLS-1$
+ int indx2 = funcName.indexOf("RELATE"); //$NON-NLS-1$
+ if (indx1 >= 0 && indx2 > indx1)
+ return comment + "/*+ ORDERED */ "; //$NON-NLS-1$
+ }
+ }
return comment;
}
Copied: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleSpatialFunctionModifier.java (from rev 1253, trunk/connectors/sandbox/connector-oracle-spatial/src/main/java/com/metamatrix/connector/jdbc/oracle/spatial/OracleSpatialFunctionModifier.java)
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleSpatialFunctionModifier.java (rev 0)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleSpatialFunctionModifier.java 2009-08-18 03:01:39 UTC (rev 1255)
@@ -0,0 +1,67 @@
+/*
+ * 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.connector.jdbc.oracle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.connector.jdbc.translator.BasicFunctionModifier;
+import org.teiid.connector.language.IExpression;
+import org.teiid.connector.language.IFunction;
+import org.teiid.connector.language.ILiteral;
+
+
+public class OracleSpatialFunctionModifier extends BasicFunctionModifier {
+
+ /**
+ * If either of the first two parameters are a Literal String, then we need to put the literal itself in the SQL
+ * to be passed to Oracle, without the tick marks
+ */
+ public List<?> translate(IFunction function) {
+ List<IExpression> params = function.getParameters();
+ List<Object> objs = new ArrayList<Object>();
+ objs.add(function.getName());
+ objs.add("("); //$NON-NLS-1$
+ addParamWithConversion(objs, params.get(0));
+ objs.add(", "); //$NON-NLS-1$
+
+ addParamWithConversion(objs, params.get(1));
+ for (int i = 2; i < params.size(); i++) {
+ objs.add(", "); //$NON-NLS-1$
+ objs.add(params.get(i));
+ }
+ objs.add(")"); //$NON-NLS-1$
+ return objs;
+ }
+
+ protected void addParamWithConversion(List<Object> objs,
+ IExpression expression) {
+ if ((expression instanceof ILiteral)
+ && (((ILiteral) expression).getValue() instanceof String)) {
+ objs.add(((ILiteral) expression).getValue());
+ } else {
+ objs.add(expression);
+ }
+ }
+
+}
\ No newline at end of file
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/Translator.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/Translator.java 2009-08-17 21:38:58 UTC (rev 1254)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/Translator.java 2009-08-18 03:01:39 UTC (rev 1255)
@@ -56,7 +56,6 @@
import org.teiid.connector.language.IParameter;
import org.teiid.connector.language.ISetQuery;
import org.teiid.connector.language.IParameter.Direction;
-import org.teiid.connector.visitor.util.SQLReservedWords;
import com.metamatrix.common.util.PropertiesUtils;
import com.metamatrix.core.util.ReflectionHelper;
Copied: trunk/connectors/connector-jdbc/src/main/resources/OracleSpatialFunctions.xmi (from rev 1253, trunk/connectors/sandbox/connector-oracle-spatial/src/main/resources/OracleSpatialFunctions.xmi)
===================================================================
--- trunk/connectors/connector-jdbc/src/main/resources/OracleSpatialFunctions.xmi (rev 0)
+++ trunk/connectors/connector-jdbc/src/main/resources/OracleSpatialFunctions.xmi 2009-08-18 03:01:39 UTC (rev 1255)
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="ASCII"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:Diagram="http://www.metamatrix.com/metamodels/Diagram" xmlns:mmcore="http://www.metamatrix.com/metamodels/Core" xmlns:mmfunction="http://www.metamatrix.com/metamodels/MetaMatrixFunction">
+ <mmcore:ModelAnnotation xmi:uuid="mmuuid:1339aac0-1cd3-1f76-a60a-ef2ca142dae4" primaryMetamodelUri="http://www.metamatrix.com/metamodels/MetaMatrixFunction"/>
+ <Diagram:DiagramContainer xmi:uuid="mmuuid:141e8c80-1cd3-1f76-a60a-ef2ca142dae4">
+ <diagram xmi:uuid="mmuuid:141e8c81-1cd3-1f76-a60a-ef2ca142dae4" type="packageDiagramType" target="mmuuid/1339aac0-1cd3-1f76-a60a-ef2ca142dae4">
+ <diagramEntity xmi:uuid="mmuuid:141e8c86-1cd3-1f76-a60a-ef2ca142dae4" name="sdo_filter" modelObject="mmuuid/141e8ca5-1cd3-1f76-a60a-ef2ca142dae4" xPosition="394" yPosition="301"/>
+ <diagramEntity xmi:uuid="mmuuid:141e8c82-1cd3-1f76-a60a-ef2ca142dae4" name="sdo_filter" modelObject="mmuuid/141e8cb4-1cd3-1f76-a60a-ef2ca142dae4" xPosition="202" yPosition="148"/>
+ <diagramEntity xmi:uuid="mmuuid:141e8c8a-1cd3-1f76-a60a-ef2ca142dae4" name="sdo_filter" modelObject="mmuuid/141e8c9b-1cd3-1f76-a60a-ef2ca142dae4" xPosition="586" yPosition="394"/>
+ <diagramEntity xmi:uuid="mmuuid:141e8c83-1cd3-1f76-a60a-ef2ca142dae4" name="sdo_nn" modelObject="mmuuid/141e8cbe-1cd3-1f76-a60a-ef2ca142dae4" xPosition="586" yPosition="10"/>
+ <diagramEntity xmi:uuid="mmuuid:141e8c8e-1cd3-1f76-a60a-ef2ca142dae4" modelObject="mmuuid/1512b080-1cd3-1f76-a60a-ef2ca142dae4" xPosition="202" yPosition="286"/>
+ <diagramEntity xmi:uuid="mmuuid:141e8c85-1cd3-1f76-a60a-ef2ca142dae4" modelObject="mmuuid/1512b08b-1cd3-1f76-a60a-ef2ca142dae4" xPosition="394" yPosition="439"/>
+ <diagramEntity xmi:uuid="mmuuid:141e8c8c-1cd3-1f76-a60a-ef2ca142dae4" name="sdo_within_distance" modelObject="mmuuid/141e8cb9-1cd3-1f76-a60a-ef2ca142dae4" xPosition="586" yPosition="256"/>
+ <diagramEntity xmi:uuid="mmuuid:141e8c89-1cd3-1f76-a60a-ef2ca142dae4" name="sdo_within_distance" modelObject="mmuuid/141e8caa-1cd3-1f76-a60a-ef2ca142dae4" xPosition="10" yPosition="286"/>
+ <diagramEntity xmi:uuid="mmuuid:141e8c90-1cd3-1f76-a60a-ef2ca142dae4" name="sdo_within_distance" modelObject="mmuuid/141e8c96-1cd3-1f76-a60a-ef2ca142dae4" xPosition="10" yPosition="10"/>
+ <diagramEntity xmi:uuid="mmuuid:dfa98740-1cee-1f76-a60a-ef2ca142dae4" modelObject="mmuuid/cb37c380-1cee-1f76-a60a-ef2ca142dae4" xPosition="10" yPosition="148"/>
+ <diagramEntity xmi:uuid="mmuuid:a0c900c0-1cf1-1f76-a60a-ef2ca142dae4" modelObject="mmuuid/9955a780-1cf1-1f76-a60a-ef2ca142dae4" xPosition="202" yPosition="10"/>
+ <diagramEntity xmi:uuid="mmuuid:f98ad640-1cf4-1f76-a60a-ef2ca142dae4" modelObject="mmuuid/f2177d00-1cf4-1f76-a60a-ef2ca142dae4" xPosition="394" yPosition="10"/>
+ <diagramEntity xmi:uuid="mmuuid:bd8b5440-abcd-1f7b-8928-e3ec4f4f400f" modelObject="mmuuid/b7f100c0-abcd-1f7b-8928-e3ec4f4f400f" xPosition="586" yPosition="148"/>
+ <diagramEntity xmi:uuid="mmuuid:1747de40-ef9e-1f8f-972f-81dc9991b565" modelObject="mmuuid/0678e3c0-ef9e-1f8f-972f-81dc9991b565" xPosition="202" yPosition="424"/>
+ <diagramEntity xmi:uuid="mmuuid:5ea222c0-efa1-1f8f-972f-81dc9991b565" modelObject="mmuuid/59fbf340-efa1-1f8f-972f-81dc9991b565" xPosition="10" yPosition="424"/>
+ <diagramEntity xmi:uuid="mmuuid:5ea222c1-efa1-1f8f-972f-81dc9991b565" modelObject="mmuuid/59fbf346-efa1-1f8f-972f-81dc9991b565" xPosition="394" yPosition="148"/>
+ <diagramEntity xmi:uuid="mmuuid:a97a7ac0-19d4-1fad-a630-f3ba21f9cca0" modelObject="mmuuid/96d27a80-19d4-1fad-a630-f3ba21f9cca0" xPosition="20" yPosition="20"/>
+ </diagram>
+ </Diagram:DiagramContainer>
+ <mmfunction:ScalarFunction xmi:uuid="mmuuid:141e8c96-1cd3-1f76-a60a-ef2ca142dae4" name="sdo_within_distance" category="Miscellaneous" pushDown="REQUIRED" invocationClass="none" invocationMethod="none">
+ <inputParameters xmi:uuid="mmuuid:141e8c9a-1cd3-1f76-a60a-ef2ca142dae4" name="GEOM1" type="string"/>
+ <inputParameters xmi:uuid="mmuuid:141e8c98-1cd3-1f76-a60a-ef2ca142dae4" name="GEOM2" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:141e8c99-1cd3-1f76-a60a-ef2ca142dae4" name="PARAMS" type="string"/>
+ <returnParameter xmi:uuid="mmuuid:141e8c97-1cd3-1f76-a60a-ef2ca142dae4" type="string"/>
+ </mmfunction:ScalarFunction>
+ <mmfunction:ScalarFunction xmi:uuid="mmuuid:141e8c9b-1cd3-1f76-a60a-ef2ca142dae4" name="sdo_filter" category="Miscellaneous" pushDown="REQUIRED" invocationClass="none" invocationMethod="none">
+ <inputParameters xmi:uuid="mmuuid:141e8c9e-1cd3-1f76-a60a-ef2ca142dae4" name="GEOM1" type="string"/>
+ <inputParameters xmi:uuid="mmuuid:141e8c9c-1cd3-1f76-a60a-ef2ca142dae4" name="GEOM2" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:141e8c9f-1cd3-1f76-a60a-ef2ca142dae4" name="PARAMS" type="string"/>
+ <returnParameter xmi:uuid="mmuuid:141e8c9d-1cd3-1f76-a60a-ef2ca142dae4" type="string"/>
+ </mmfunction:ScalarFunction>
+ <mmfunction:ScalarFunction xmi:uuid="mmuuid:141e8ca5-1cd3-1f76-a60a-ef2ca142dae4" name="sdo_filter" category="Miscellaneous" pushDown="REQUIRED" invocationClass="none" invocationMethod="none">
+ <inputParameters xmi:uuid="mmuuid:141e8ca9-1cd3-1f76-a60a-ef2ca142dae4" name="GEOM1" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:141e8ca8-1cd3-1f76-a60a-ef2ca142dae4" name="GEOM2" type="string"/>
+ <inputParameters xmi:uuid="mmuuid:141e8ca6-1cd3-1f76-a60a-ef2ca142dae4" name="PARAMS" type="string"/>
+ <returnParameter xmi:uuid="mmuuid:141e8ca7-1cd3-1f76-a60a-ef2ca142dae4" type="string"/>
+ </mmfunction:ScalarFunction>
+ <mmfunction:ScalarFunction xmi:uuid="mmuuid:141e8caa-1cd3-1f76-a60a-ef2ca142dae4" name="sdo_within_distance" category="Miscellaneous" pushDown="REQUIRED" invocationClass="none" invocationMethod="none">
+ <inputParameters xmi:uuid="mmuuid:141e8cae-1cd3-1f76-a60a-ef2ca142dae4" name="GEOM1" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:141e8cac-1cd3-1f76-a60a-ef2ca142dae4" name="GEOM2" type="string"/>
+ <inputParameters xmi:uuid="mmuuid:141e8cab-1cd3-1f76-a60a-ef2ca142dae4" name="PARAMS" type="string"/>
+ <returnParameter xmi:uuid="mmuuid:141e8cad-1cd3-1f76-a60a-ef2ca142dae4" type="string"/>
+ </mmfunction:ScalarFunction>
+ <mmfunction:ScalarFunction xmi:uuid="mmuuid:141e8cb4-1cd3-1f76-a60a-ef2ca142dae4" name="sdo_filter" category="Miscellaneous" pushDown="REQUIRED" invocationClass="none" invocationMethod="none">
+ <inputParameters xmi:uuid="mmuuid:141e8cb5-1cd3-1f76-a60a-ef2ca142dae4" name="GEOM1" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:141e8cb7-1cd3-1f76-a60a-ef2ca142dae4" name="GEOM2" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:141e8cb8-1cd3-1f76-a60a-ef2ca142dae4" name="PARAMS" type="string"/>
+ <returnParameter xmi:uuid="mmuuid:141e8cb6-1cd3-1f76-a60a-ef2ca142dae4" type="string"/>
+ </mmfunction:ScalarFunction>
+ <mmfunction:ScalarFunction xmi:uuid="mmuuid:141e8cb9-1cd3-1f76-a60a-ef2ca142dae4" name="sdo_within_distance" category="Miscellaneous" pushDown="REQUIRED" invocationClass="none" invocationMethod="none">
+ <inputParameters xmi:uuid="mmuuid:141e8cbd-1cd3-1f76-a60a-ef2ca142dae4" name="GEOM1" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:141e8cbc-1cd3-1f76-a60a-ef2ca142dae4" name="GEOM2" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:141e8cbb-1cd3-1f76-a60a-ef2ca142dae4" name="PARAMS" type="string"/>
+ <returnParameter xmi:uuid="mmuuid:141e8cba-1cd3-1f76-a60a-ef2ca142dae4" type="string"/>
+ </mmfunction:ScalarFunction>
+ <mmfunction:ScalarFunction xmi:uuid="mmuuid:141e8cbe-1cd3-1f76-a60a-ef2ca142dae4" name="sdo_nn" category="Miscellaneous" pushDown="REQUIRED" invocationClass="none" invocationMethod="none">
+ <inputParameters xmi:uuid="mmuuid:141e8cc2-1cd3-1f76-a60a-ef2ca142dae4" name="GEOM1" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:141e8cc1-1cd3-1f76-a60a-ef2ca142dae4" name="GEOM2" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:141e8cc0-1cd3-1f76-a60a-ef2ca142dae4" name="PARAMS" type="string"/>
+ <returnParameter xmi:uuid="mmuuid:141e8cbf-1cd3-1f76-a60a-ef2ca142dae4" type="string"/>
+ </mmfunction:ScalarFunction>
+ <mmfunction:ScalarFunction xmi:uuid="mmuuid:1512b080-1cd3-1f76-a60a-ef2ca142dae4" name="sdo_nn" category="Miscellaneous" pushDown="REQUIRED" invocationClass="none" invocationMethod="none">
+ <inputParameters xmi:uuid="mmuuid:1512b084-1cd3-1f76-a60a-ef2ca142dae4" name="GEOM1" type="string"/>
+ <inputParameters xmi:uuid="mmuuid:1512b083-1cd3-1f76-a60a-ef2ca142dae4" name="GEOM2" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:1512b082-1cd3-1f76-a60a-ef2ca142dae4" name="PARAMS" type="string"/>
+ <returnParameter xmi:uuid="mmuuid:1512b081-1cd3-1f76-a60a-ef2ca142dae4" type="string"/>
+ </mmfunction:ScalarFunction>
+ <mmfunction:ScalarFunction xmi:uuid="mmuuid:1512b08b-1cd3-1f76-a60a-ef2ca142dae4" name="sdo_nn" category="Miscellaneous" pushDown="REQUIRED" invocationClass="none" invocationMethod="none">
+ <inputParameters xmi:uuid="mmuuid:1512b08c-1cd3-1f76-a60a-ef2ca142dae4" name="GEOM1" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:1512b08e-1cd3-1f76-a60a-ef2ca142dae4" name="GEOM2" type="string"/>
+ <inputParameters xmi:uuid="mmuuid:1512b08f-1cd3-1f76-a60a-ef2ca142dae4" name="PARAMS" type="string"/>
+ <returnParameter xmi:uuid="mmuuid:1512b08d-1cd3-1f76-a60a-ef2ca142dae4" type="string"/>
+ </mmfunction:ScalarFunction>
+ <mmfunction:ScalarFunction xmi:uuid="mmuuid:cb37c380-1cee-1f76-a60a-ef2ca142dae4" name="sdo_relate" category="Miscellaneous" pushDown="REQUIRED" invocationClass="none" invocationMethod="none">
+ <inputParameters xmi:uuid="mmuuid:cb37c384-1cee-1f76-a60a-ef2ca142dae4" name="GEOM1" type="string"/>
+ <inputParameters xmi:uuid="mmuuid:cb37c381-1cee-1f76-a60a-ef2ca142dae4" name="GEOM2" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:cb37c382-1cee-1f76-a60a-ef2ca142dae4" name="PARAMS" type="string"/>
+ <returnParameter xmi:uuid="mmuuid:cb37c383-1cee-1f76-a60a-ef2ca142dae4" type="string"/>
+ </mmfunction:ScalarFunction>
+ <mmfunction:ScalarFunction xmi:uuid="mmuuid:9955a780-1cf1-1f76-a60a-ef2ca142dae4" name="sdo_relate" category="Miscellaneous" pushDown="REQUIRED" invocationClass="none" invocationMethod="none">
+ <inputParameters xmi:uuid="mmuuid:9955a782-1cf1-1f76-a60a-ef2ca142dae4" name="GEOM1" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:9955a783-1cf1-1f76-a60a-ef2ca142dae4" name="GEOM2" type="string"/>
+ <inputParameters xmi:uuid="mmuuid:9955a781-1cf1-1f76-a60a-ef2ca142dae4" name="PARAMS" type="string"/>
+ <returnParameter xmi:uuid="mmuuid:9955a784-1cf1-1f76-a60a-ef2ca142dae4" type="string"/>
+ </mmfunction:ScalarFunction>
+ <mmfunction:ScalarFunction xmi:uuid="mmuuid:96d27a80-19d4-1fad-a630-f3ba21f9cca0" name="sdo_relate" category="Miscellaneous" pushDown="REQUIRED" invocationClass="none" invocationMethod="none">
+ <inputParameters xmi:uuid="mmuuid:96d27a84-19d4-1fad-a630-f3ba21f9cca0" name="GEOM1" type="string"/>
+ <inputParameters xmi:uuid="mmuuid:96d27a83-19d4-1fad-a630-f3ba21f9cca0" name="GEOM2" type="string"/>
+ <inputParameters xmi:uuid="mmuuid:96d27a82-19d4-1fad-a630-f3ba21f9cca0" name="PARAMS" type="string"/>
+ <returnParameter xmi:uuid="mmuuid:96d27a81-19d4-1fad-a630-f3ba21f9cca0" type="string"/>
+ </mmfunction:ScalarFunction>
+ <mmfunction:ScalarFunction xmi:uuid="mmuuid:f2177d00-1cf4-1f76-a60a-ef2ca142dae4" name="sdo_relate" category="Miscellaneous" pushDown="REQUIRED" invocationClass="none" invocationMethod="none">
+ <inputParameters xmi:uuid="mmuuid:f2177d01-1cf4-1f76-a60a-ef2ca142dae4" name="GEOM1" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:f2177d02-1cf4-1f76-a60a-ef2ca142dae4" name="GEOM2" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:f2177d03-1cf4-1f76-a60a-ef2ca142dae4" name="PARAMS" type="string"/>
+ <returnParameter xmi:uuid="mmuuid:f2177d04-1cf4-1f76-a60a-ef2ca142dae4" type="string"/>
+ </mmfunction:ScalarFunction>
+ <mmfunction:ScalarFunction xmi:uuid="mmuuid:b7f100c0-abcd-1f7b-8928-e3ec4f4f400f" name="sdo_nn_distance" category="Miscellaneous" pushDown="REQUIRED" invocationClass="none" invocationMethod="none">
+ <inputParameters xmi:uuid="mmuuid:b7f100c1-abcd-1f7b-8928-e3ec4f4f400f" name="number" type="integer"/>
+ <returnParameter xmi:uuid="mmuuid:b7f100c2-abcd-1f7b-8928-e3ec4f4f400f" type="integer"/>
+ </mmfunction:ScalarFunction>
+ <mmfunction:ScalarFunction xmi:uuid="mmuuid:0678e3c0-ef9e-1f8f-972f-81dc9991b565" name="sdo_nn" category="Miscellaneous" pushDown="REQUIRED" invocationClass="none" invocationMethod="none">
+ <inputParameters xmi:uuid="mmuuid:0678e3c1-ef9e-1f8f-972f-81dc9991b565" name="GEOM1" type="string"/>
+ <inputParameters xmi:uuid="mmuuid:0678e3c3-ef9e-1f8f-972f-81dc9991b565" name="GEOM2" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:0678e3c6-ef9e-1f8f-972f-81dc9991b565" name="PARAMS" type="string"/>
+ <inputParameters xmi:uuid="mmuuid:0678e3c4-ef9e-1f8f-972f-81dc9991b565" name="NUMBER" type="integer"/>
+ <inputParameters xmi:uuid="mmuuid:0678e3c2-ef9e-1f8f-972f-81dc9991b565" name="NUMBER" type="integer"/>
+ <returnParameter xmi:uuid="mmuuid:0678e3c5-ef9e-1f8f-972f-81dc9991b565" type="string"/>
+ </mmfunction:ScalarFunction>
+ <mmfunction:ScalarFunction xmi:uuid="mmuuid:59fbf340-efa1-1f8f-972f-81dc9991b565" name="sdo_nn" category="Miscellaneous" pushDown="REQUIRED" invocationClass="none" invocationMethod="none">
+ <inputParameters xmi:uuid="mmuuid:59fbf344-efa1-1f8f-972f-81dc9991b565" name="GEOM1" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:59fbf345-efa1-1f8f-972f-81dc9991b565" name="GEOM2" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:59fbf342-efa1-1f8f-972f-81dc9991b565" name="PARAMS" type="string"/>
+ <inputParameters xmi:uuid="mmuuid:59fbf343-efa1-1f8f-972f-81dc9991b565" name="NUMBER" type="integer"/>
+ <returnParameter xmi:uuid="mmuuid:59fbf341-efa1-1f8f-972f-81dc9991b565" type="string"/>
+ </mmfunction:ScalarFunction>
+ <mmfunction:ScalarFunction xmi:uuid="mmuuid:59fbf346-efa1-1f8f-972f-81dc9991b565" name="sdo_nn" category="Miscellaneous" pushDown="REQUIRED" invocationClass="none" invocationMethod="none">
+ <inputParameters xmi:uuid="mmuuid:59fbf34b-efa1-1f8f-972f-81dc9991b565" name="GEOM1" type="object"/>
+ <inputParameters xmi:uuid="mmuuid:59fbf347-efa1-1f8f-972f-81dc9991b565" name="GEOM2" type="string"/>
+ <inputParameters xmi:uuid="mmuuid:59fbf349-efa1-1f8f-972f-81dc9991b565" name="PARAMS" type="string"/>
+ <inputParameters xmi:uuid="mmuuid:59fbf348-efa1-1f8f-972f-81dc9991b565" name="NUMBER" type="integer"/>
+ <returnParameter xmi:uuid="mmuuid:59fbf34a-efa1-1f8f-972f-81dc9991b565" type="string"/>
+ </mmfunction:ScalarFunction>
+</xmi:XMI>
Modified: trunk/connectors/connector-jdbc/src/main/resources/org/teiid/connector/jdbc/i18n.properties
===================================================================
--- trunk/connectors/connector-jdbc/src/main/resources/org/teiid/connector/jdbc/i18n.properties 2009-08-17 21:38:58 UTC (rev 1254)
+++ trunk/connectors/connector-jdbc/src/main/resources/org/teiid/connector/jdbc/i18n.properties 2009-08-18 03:01:39 UTC (rev 1255)
@@ -73,3 +73,5 @@
BasicResultsTranslator.Couldn__t_parse_property=Could not parse property: {0}
JDBCMetadataProcessor.cannot_find_primary=Cannot find primary key table {0}
+
+OracleSpatialSQLTranslator.SDO_NN_DEPENDENCY_ERROR=The SDO_NN_DISTANCE operator can only be used in conjunction with the SDO_NN operator.
Modified: trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestOracleTranslator.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestOracleTranslator.java 2009-08-17 21:38:58 UTC (rev 1254)
+++ trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestOracleTranslator.java 2009-08-18 03:01:39 UTC (rev 1255)
@@ -22,8 +22,11 @@
package org.teiid.connector.jdbc.oracle;
+import java.io.File;
+import java.net.URL;
import java.util.Properties;
+import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
@@ -35,6 +38,8 @@
import com.metamatrix.cdk.api.EnvironmentUtility;
import com.metamatrix.cdk.unittest.FakeTranslationFactory;
+import com.metamatrix.query.function.FunctionLibraryManager;
+import com.metamatrix.query.function.UDFSource;
public class TestOracleTranslator {
@@ -43,20 +48,35 @@
*/
private static Translator TRANSLATOR;
+ @BeforeClass public static void oneTimeSetup() throws Exception {
+ TRANSLATOR = new OracleSQLTranslator();
+ TRANSLATOR.initialize(EnvironmentUtility.createEnvironment(new Properties(), false));
+ // Define a UDFSource to hold the reference to our function definitions
+ File udfFile = new File("src/main/resources/OracleSpatialFunctions.xmi"); //$NON-NLS-1$;
+ URL[] urls = new URL[0];
+ UDFSource udfSource = new UDFSource(udfFile.toURI().toURL(), urls);
+ FunctionLibraryManager.deregisterSource(udfSource);
+ FunctionLibraryManager.registerSource(udfSource);
+ }
+
/**
- * Performs setup tasks that should be executed prior to an instance of this
- * class being created. This method should only be executed once and does
+ * Performs cleanup tasks that should be executed after all test methods
+ * have been executed. This method should only be executed once and does
* not protect from multiple executions. It is intended to be executed by
* the JUnit4 test framework.
* <p>
- * This method sets {@link TestOracleTranslator#TRANSLATOR} to an instance
- * of {@link OracleSQLTranslator} and then calls its {@link OracleSQLTranslator#initialize(ConnectorEnvironment)}
- * method.
+ * This method unloads the function definitions supported by the Oracle Spatial
+ * Connector from the global instance of <code>FunctionLibraryManager</code>
+ * so that they are no longer resolvable during query parsing.
+ *
* @throws Exception
*/
- @BeforeClass public static void oneTimeSetup() throws Exception {
- TRANSLATOR = new OracleSQLTranslator();
- TRANSLATOR.initialize(EnvironmentUtility.createEnvironment(new Properties(), false));
+ @AfterClass public static void oneTimeFinished() throws Exception {
+ // Define a UDFSource to hold the reference to our function definitions
+ File udfFile = new File("src/main/resources/OracleSpatialFunctions.xmi"); //$NON-NLS-1$;
+ URL[] urls = new URL[0];
+ UDFSource udfSource = new UDFSource(udfFile.toURI().toURL(), urls);
+ FunctionLibraryManager.deregisterSource(udfSource);
}
private void helpTestVisitor(String input, String expectedOutput) throws ConnectorException {
@@ -289,5 +309,111 @@
input, output,
TRANSLATOR);
}
+
+ /**
+ * Test a query which uses
+ * <code>sdo_relate(Object element, Object element, String literal) in its
+ * criteria into a source specific command.
+ *
+ * @throws Exception
+ */
+ @Test public void testRewrite_sdo_relate() throws Exception {
+ String input = "SELECT a.INTKEY FROM BQT1.SMALLA A, BQT1.SMALLB B WHERE sdo_relate(A.OBJECTVALUE, b.OBJECTVALUE, 'mask=ANYINTERACT') = true"; //$NON-NLS-1$
+ String output = "SELECT /*+ ORDERED */ A.IntKey FROM SmallA A, SmallB B WHERE sdo_relate(A.ObjectValue, B.ObjectValue, 'mask=ANYINTERACT') = 'true'"; //$NON-NLS-1$
+ MetadataFactory.helpTestVisitor(MetadataFactory.BQT_VDB,
+ input, output,
+ TRANSLATOR);
+ }
+
+ /**
+ * Test a query which uses
+ * <code>sdo_within_distance(Object element, String literal, String literal)
+ * in its criteria into a source specific command.
+ *
+ * @throws Exception
+ */
+ @Test public void testRewrite_sdo_within_distance() throws Exception {
+ String input = "SELECT INTKEY FROM BQT1.SMALLA WHERE sdo_within_distance(OBJECTVALUE, 'SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL)', 'DISTANCE=25.0 UNIT=NAUT_MILE') = true"; //$NON-NLS-1$
+ String output = "SELECT SmallA.IntKey FROM SmallA WHERE sdo_within_distance(SmallA.ObjectValue, SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL), 'DISTANCE=25.0 UNIT=NAUT_MILE') = 'true'"; //$NON-NLS-1$
+
+ MetadataFactory.helpTestVisitor(MetadataFactory.BQT_VDB,
+ input, output,
+ TRANSLATOR);
+ }
+
+ /**
+ * Test a query which uses
+ * <code>sdo_within_distance(String literal, Object element, String literal)
+ * in its criteria into a source specific command.
+ *
+ * @throws Exception
+ */
+ @Test public void testRewrite_sdo_within_distance2() throws Exception {
+ String input = "SELECT INTKEY FROM BQT1.SMALLA WHERE sdo_within_distance('SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL)', OBJECTVALUE, 'DISTANCE=25.0 UNIT=NAUT_MILE') = true"; //$NON-NLS-1$
+ String output = "SELECT SmallA.IntKey FROM SmallA WHERE sdo_within_distance(SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL), SmallA.ObjectValue, 'DISTANCE=25.0 UNIT=NAUT_MILE') = 'true'"; //$NON-NLS-1$
+
+ MetadataFactory.helpTestVisitor(MetadataFactory.BQT_VDB,
+ input, output,
+ TRANSLATOR);
+ }
+
+ /**
+ * Test a query which uses
+ * <code>sdo_within_distance(String element, String literal, String literal)
+ * in its criteria into a source specific command.
+ *
+ * @throws Exception
+ */
+ @Test public void testRewrite_sdo_within_distance3() throws Exception {
+ String input = "SELECT INTKEY FROM BQT1.SMALLA WHERE sdo_within_distance(STRINGKEY, 'SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL)', 'DISTANCE=25.0 UNIT=NAUT_MILE') = true"; //$NON-NLS-1$
+ // using ? for bind value as rewriter marks the criteria as bindEligible
+ // due to literal of type Object appearing in left side of criteria.
+ // The literal Object is a result of the sdo_within_distance function
+ // signature being sdo_within_distance(string, object, string) : string
+ // as the signature was the best match for this query.
+ String output = "SELECT SmallA.IntKey FROM SmallA WHERE sdo_within_distance(SmallA.StringKey, SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL), 'DISTANCE=25.0 UNIT=NAUT_MILE') = ?"; //$NON-NLS-1$
+
+ MetadataFactory.helpTestVisitor(MetadataFactory.BQT_VDB,
+ input, output,
+ TRANSLATOR);
+ }
+
+ /**
+ * Test a query which uses
+ * <code>sdo_within_distance(String literal, String literal, String literal)
+ * in its criteria into a source specific command.
+ *
+ * @throws Exception
+ */
+ @Test public void testRewrite_sdo_within_distance4() throws Exception {
+ String input = "SELECT INTKEY FROM BQT1.SMALLA WHERE sdo_within_distance('SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL)', 'SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL)', 'DISTANCE=25.0 UNIT=NAUT_MILE') = true"; //$NON-NLS-1$
+ // using ? for bind value as rewriter marks the criteria as bindEligible
+ // due to literal of type Object appearing in left side of criteria.
+ // The literal Object is a result of the sdo_within_distance function
+ // signature being sdo_within_distance(string, object, string) : string
+ // as the signature was the best match for this query.
+ String output = "SELECT SmallA.IntKey FROM SmallA WHERE sdo_within_distance(SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL), SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL), 'DISTANCE=25.0 UNIT=NAUT_MILE') = ?"; //$NON-NLS-1$
+
+ MetadataFactory.helpTestVisitor(MetadataFactory.BQT_VDB,
+ input, output,
+ TRANSLATOR);
+ }
+
+ /**
+ * Test a query which uses
+ * <code>sdo_within_distance(Object element, Object element, String literal)
+ * in its criteria into a source specific command.
+ *
+ * @throws Exception
+ */
+ @Test public void testRewrite_sdo_within_distance5() throws Exception {
+ String input = "SELECT a.INTKEY FROM BQT1.SMALLA A, BQT1.SMALLB B WHERE sdo_within_distance(a.OBJECTVALUE, b.OBJECTVALUE, 'DISTANCE=25.0 UNIT=NAUT_MILE') = true"; //$NON-NLS-1$
+ String output = "SELECT A.IntKey FROM SmallA A, SmallB B WHERE sdo_within_distance(A.ObjectValue, B.ObjectValue, 'DISTANCE=25.0 UNIT=NAUT_MILE') = 'true'"; //$NON-NLS-1$
+
+ MetadataFactory.helpTestVisitor(MetadataFactory.BQT_VDB,
+ input, output,
+ TRANSLATOR);
+ }
+
}
Modified: trunk/connectors/sandbox/pom.xml
===================================================================
--- trunk/connectors/sandbox/pom.xml 2009-08-17 21:38:58 UTC (rev 1254)
+++ trunk/connectors/sandbox/pom.xml 2009-08-18 03:01:39 UTC (rev 1255)
@@ -15,6 +15,5 @@
<module>connector-yahoo</module>
<module>connector-exec</module>
<module>connector-object</module>
- <module>connector-oracle-spatial</module>
</modules>
</project>
\ No newline at end of file
More information about the teiid-commits
mailing list