teiid SVN: r3381 - branches/7.4.x/build/kits/jboss-container/conf.
by teiid-commits@lists.jboss.org
Author: van.halbert
Date: 2011-08-15 11:36:27 -0400 (Mon, 15 Aug 2011)
New Revision: 3381
Modified:
branches/7.4.x/build/kits/jboss-container/conf/jboss-teiid-log4j.xml
Log:
TEIID-1711 Changed <logger> to use <category> in defining the log4j definitions
Modified: branches/7.4.x/build/kits/jboss-container/conf/jboss-teiid-log4j.xml
===================================================================
--- branches/7.4.x/build/kits/jboss-container/conf/jboss-teiid-log4j.xml 2011-08-12 21:21:02 UTC (rev 3380)
+++ branches/7.4.x/build/kits/jboss-container/conf/jboss-teiid-log4j.xml 2011-08-15 15:36:27 UTC (rev 3381)
@@ -1,3 +1,18 @@
+
+ <!-- un-comment to enable Teiid COMMAND log,
+ NOTE: if there are categories above this appender, this will need to be moved above the categories
+ in order for this appender to work.
+ <appender name="COMMAND" class="org.jboss.logging.appender.RollingFileAppender">
+ <param name="File" value="${jboss.server.log.dir}/teiid-command.log"/>
+ <param name="MaxFileSize" value="1000KB"/>
+ <param name="MaxBackupIndex" value="25"/>
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d %-5p [%c] (%t:%x) %m%n"/>
+ </layout>
+ </appender>
+ -->
+
+
<!--
This file contains log4j.xml snippets that can be used in your main jboss-log4j.xml to control
Teiid logging in more depth. By default all messages will go to the org.teiid category and
@@ -5,14 +20,14 @@
-->
<!-- Teiid root category snippet. Use this to control all of Teiid logging from a single category -->
- <logger name="org.teiid">
- <level value="INFO" />
- </logger>
+ <category name="org.teiid">
+ <priority value="INFO" />
+ </category>
<!-- this is to avoid the "Unable to remove nodes to reduce region size below 1024. Set expiration for nodes in this region" error -->
- <logger name="org.jboss.cache">
- <level value="ERROR" />
- </logger>
+ <category name="org.jboss.cache">
+ <priority value="ERROR" />
+ </category>
<!-- Other categories:
org.teiid.PROCESSOR - Query processing logs. See also org.teiid.PLANNER for query planning logs.
@@ -49,27 +64,17 @@
-->
<!-- un-comment to enable COMMAND log - also needs the COMMAND appender to be uncommented
- <logger name="org.teiid.COMMAND_LOG" additivity="false">
- <level value="DEBUG"/>
+ <category name="org.teiid.COMMAND_LOG" additivity="false">
+ <priority value="DEBUG"/>
<appender-ref ref="COMMAND"/>
- </logger>
+ </category>
-->
<!-- Un-comment to enable AUDIT log - also needs the AUDIT appender to be uncommented.
JBoss already has an AUDIT appender, or you may create your own - see the COMMAND appender below
- <logger name="org.teiid.AUDIT_LOG" additivity="false">
- <level value="DEBUG"/>
+ <category name="org.teiid.AUDIT_LOG" additivity="false">
+ <priority value="DEBUG"/>
<appender-ref ref="AUDIT"/>
- </logger>
+ </category>
-->
-
- <!-- un-comment to enable Teiid COMMAND log
- <appender name="COMMAND" class="org.jboss.logging.appender.RollingFileAppender">
- <param name="File" value="${jboss.server.log.dir}/teiid-command.log"/>
- <param name="MaxFileSize" value="1000KB"/>
- <param name="MaxBackupIndex" value="25"/>
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d %-5p [%c] (%t:%x) %m%n"/>
- </layout>
- </appender>
- -->
+
13 years, 4 months
teiid SVN: r3380 - in branches/7.4.x: engine/src/main/java/org/teiid/query/optimizer/relational/rules and 4 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-08-12 17:21:02 -0400 (Fri, 12 Aug 2011)
New Revision: 3380
Added:
branches/7.4.x/metadata/src/test/resources/TEIIDDES992_VDB.vdb
Modified:
branches/7.4.x/api/src/main/java/org/teiid/metadata/FunctionMethod.java
branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CapabilitiesUtil.java
branches/7.4.x/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataFactory.java
branches/7.4.x/metadata/src/test/java/org/teiid/metadata/index/TestMultipleModelIndexes.java
branches/7.4.x/runtime/src/main/java/org/teiid/deployers/CompositeVDB.java
Log:
TEIID-1709 adding support for reading source procedure metadata as a function
Modified: branches/7.4.x/api/src/main/java/org/teiid/metadata/FunctionMethod.java
===================================================================
--- branches/7.4.x/api/src/main/java/org/teiid/metadata/FunctionMethod.java 2011-08-12 14:35:37 UTC (rev 3379)
+++ branches/7.4.x/api/src/main/java/org/teiid/metadata/FunctionMethod.java 2011-08-12 21:21:02 UTC (rev 3380)
@@ -108,7 +108,7 @@
private Determinism determinism = Determinism.DETERMINISTIC;
@XmlElement(name="inputParameters")
- protected List<FunctionParameter> inParameters = new ArrayList<FunctionParameter>();
+ protected List<FunctionParameter> inParameters = new ArrayList<FunctionParameter>(2);
private FunctionParameter outputParameter;
private Schema parent;
Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CapabilitiesUtil.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CapabilitiesUtil.java 2011-08-12 14:35:37 UTC (rev 3379)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CapabilitiesUtil.java 2011-08-12 21:21:02 UTC (rev 3380)
@@ -219,7 +219,7 @@
if (!caps.supportsFunction(function.getFunctionDescriptor().getName())) {
return false;
}
- } else if (!schema.getFullName().equalsIgnoreCase(metadata.getFullName(modelID))) {
+ } else if (!isSameConnector(modelID, schema, metadata, capFinder)) {
return false; //not the right schema
}
Modified: branches/7.4.x/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataFactory.java
===================================================================
--- branches/7.4.x/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataFactory.java 2011-08-12 14:35:37 UTC (rev 3379)
+++ branches/7.4.x/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataFactory.java 2011-08-12 21:21:02 UTC (rev 3380)
@@ -55,6 +55,8 @@
import org.teiid.metadata.ColumnSet;
import org.teiid.metadata.Datatype;
import org.teiid.metadata.ForeignKey;
+import org.teiid.metadata.FunctionMethod;
+import org.teiid.metadata.FunctionParameter;
import org.teiid.metadata.KeyRecord;
import org.teiid.metadata.MetadataStore;
import org.teiid.metadata.Procedure;
@@ -62,6 +64,8 @@
import org.teiid.metadata.Schema;
import org.teiid.metadata.Table;
import org.teiid.metadata.VdbConstants;
+import org.teiid.metadata.FunctionMethod.Determinism;
+import org.teiid.metadata.FunctionMethod.PushDown;
import org.teiid.query.metadata.TransformationMetadata;
import org.teiid.query.metadata.TransformationMetadata.Resource;
@@ -425,6 +429,35 @@
if(transformRecord != null) {
procedureRecord.setQueryPlan(transformRecord.getTransformation());
}
+ } else if (procedureRecord.isFunction()) {
+ boolean deterministic = Boolean.valueOf(procedureRecord.getProperties().get("deterministic")); //$NON-NLS-1$
+ FunctionParameter outputParam = null;
+ List<FunctionParameter> args = new ArrayList<FunctionParameter>(procedureRecord.getParameters().size() - 1);
+ boolean valid = true;
+ for (ProcedureParameter param : procedureRecord.getParameters()) {
+ FunctionParameter fp = new FunctionParameter();
+ fp.setName(param.getName());
+ fp.setDescription(param.getAnnotation());
+ fp.setType(param.getRuntimeType());
+ switch (param.getType()) {
+ case ReturnValue:
+ if (outputParam != null) {
+ valid = false;
+ }
+ outputParam = fp;
+ break;
+ case In:
+ args.add(fp);
+ break;
+ default:
+ valid = false;
+ }
+ }
+ if (valid && outputParam != null) {
+ model.addFunction(new FunctionMethod(procedureRecord.getName(), procedureRecord.getAnnotation(), model.getName(), PushDown.MUST_PUSHDOWN,
+ null, null, args.toArray(new FunctionParameter[args.size()]), outputParam, false, deterministic?Determinism.DETERMINISTIC:Determinism.NONDETERMINISTIC));
+ continue;
+ }
}
model.addProcedure(procedureRecord);
}
Modified: branches/7.4.x/metadata/src/test/java/org/teiid/metadata/index/TestMultipleModelIndexes.java
===================================================================
--- branches/7.4.x/metadata/src/test/java/org/teiid/metadata/index/TestMultipleModelIndexes.java 2011-08-12 14:35:37 UTC (rev 3379)
+++ branches/7.4.x/metadata/src/test/java/org/teiid/metadata/index/TestMultipleModelIndexes.java 2011-08-12 21:21:02 UTC (rev 3380)
@@ -27,9 +27,11 @@
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.util.Collection;
+import java.util.Map;
import org.junit.Test;
import org.teiid.core.util.UnitTestUtil;
+import org.teiid.metadata.FunctionMethod;
import org.teiid.metadata.Schema;
import org.teiid.metadata.Table;
import org.teiid.query.metadata.TransformationMetadata;
@@ -63,4 +65,13 @@
assertNotNull(schema.getFunctions());
}
+ @Test public void testFunctionMetadata() throws Exception {
+ TransformationMetadata tm = VDBMetadataFactory.getVDBMetadata(UnitTestUtil.getTestDataPath() + "/TEIIDDES992_VDB.vdb");
+ Map<String, FunctionMethod> functions = tm.getMetadataStore().getSchema("TEIIDDES992").getFunctions();
+ assertEquals(1, functions.size());
+ FunctionMethod fm = functions.values().iterator().next();
+ assertEquals("sampleFunction", fm.getName());
+ assertEquals(1, fm.getInputParameters().size());
+ }
+
}
Added: branches/7.4.x/metadata/src/test/resources/TEIIDDES992_VDB.vdb
===================================================================
(Binary files differ)
Property changes on: branches/7.4.x/metadata/src/test/resources/TEIIDDES992_VDB.vdb
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Modified: branches/7.4.x/runtime/src/main/java/org/teiid/deployers/CompositeVDB.java
===================================================================
--- branches/7.4.x/runtime/src/main/java/org/teiid/deployers/CompositeVDB.java 2011-08-12 14:35:37 UTC (rev 3379)
+++ branches/7.4.x/runtime/src/main/java/org/teiid/deployers/CompositeVDB.java 2011-08-12 21:21:02 UTC (rev 3380)
@@ -170,7 +170,6 @@
mergedUDF.addFunctions(this.udf);
}
if (this.stores != null) {
- //schema scoped source functions - this is only a dynamic vdb concept
for(MetadataStore store:this.stores.getStores()) {
for (Schema schema:store.getSchemas().values()) {
Collection<FunctionMethod> funcs = schema.getFunctions().values();
13 years, 4 months
teiid SVN: r3379 - in trunk/engine/src: test/java/org/teiid/query/processor/proc and 1 other directory.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-08-12 10:35:37 -0400 (Fri, 12 Aug 2011)
New Revision: 3379
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/proc/ProcedurePlan.java
trunk/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java
Log:
TEIID-1701 ensuring that the txn is properly associated
Modified: trunk/engine/src/main/java/org/teiid/query/processor/proc/ProcedurePlan.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/proc/ProcedurePlan.java 2011-08-11 20:12:07 UTC (rev 3378)
+++ trunk/engine/src/main/java/org/teiid/query/processor/proc/ProcedurePlan.java 2011-08-12 14:35:37 UTC (rev 3379)
@@ -140,6 +140,7 @@
private boolean requiresTransaction = true;
private TransactionContext blockContext;
+ private boolean inTxn;
/**
* Resources cannot be held open across the txn boundary. This list is a hack at ensuring the resources are closed.
*/
@@ -218,7 +219,7 @@
beginBatch = 1;
batchRows = null;
lastBatch = false;
-
+ inTxn = false;
//reset program stack
programs.clear();
LogManager.logTrace(org.teiid.logging.LogConstants.CTX_DQP, "ProcedurePlan reset"); //$NON-NLS-1$
@@ -276,13 +277,15 @@
@Override
public TupleBatch nextBatch() throws BlockedException,
TeiidComponentException, TeiidProcessingException {
- if (blockContext != null) {
+ if (blockContext != null && !this.inTxn) {
this.getContext().getTransactionServer().resume(blockContext);
+ this.inTxn = true;
}
try {
return nextBatchDirect();
} finally {
if (blockContext != null) {
+ this.inTxn = false;
this.getContext().getTransactionServer().suspend(blockContext);
}
}
@@ -602,14 +605,17 @@
TransactionService ts = this.getContext().getTransactionServer();
TransactionContext tc = this.blockContext;
this.blockContext = null;
- for (WeakReference<DataTierTupleSource> ref : txnTupleSources) {
- DataTierTupleSource dtts = ref.get();
- if (dtts != null) {
- dtts.fullyCloseSource();
- }
- }
- this.txnTupleSources.clear();
try {
+ if (!inTxn) {
+ this.getContext().getTransactionServer().resume(tc);
+ }
+ for (WeakReference<DataTierTupleSource> ref : txnTupleSources) {
+ DataTierTupleSource dtts = ref.get();
+ if (dtts != null) {
+ dtts.fullyCloseSource();
+ }
+ }
+ this.txnTupleSources.clear();
if (success) {
ts.commit(tc);
} else {
@@ -636,6 +642,7 @@
if (tc != null && tc.getTransactionType() == Scope.NONE) {
//start a transaction
this.getContext().getTransactionServer().begin(tc);
+ this.inTxn = true;
this.blockContext = tc;
this.peek().setStartedTxn(true);
}
Modified: trunk/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java 2011-08-11 20:12:07 UTC (rev 3378)
+++ trunk/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java 2011-08-12 14:35:37 UTC (rev 3379)
@@ -2523,6 +2523,7 @@
}
Mockito.verify(ts).begin(tc);
+ Mockito.verify(ts).resume(tc);
Mockito.verify(ts, Mockito.times(0)).commit(tc);
Mockito.verify(ts).rollback(tc);
}
13 years, 4 months
teiid SVN: r3378 - in trunk/engine/src/main/java/org/teiid/query/sql: visitor and 1 other directory.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-08-11 16:12:07 -0400 (Thu, 11 Aug 2011)
New Revision: 3378
Modified:
trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
Log:
TEIID-1703 adding more flexibility to fixed width parsing
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java 2011-08-11 18:49:54 UTC (rev 3377)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java 2011-08-11 20:12:07 UTC (rev 3378)
@@ -94,7 +94,7 @@
private boolean escape;
private Integer header;
private Integer skip;
- private boolean usingRowDelimiter;
+ private boolean usingRowDelimiter = true;
private boolean fixedWidth;
Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2011-08-11 18:49:54 UTC (rev 3377)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2011-08-11 20:12:07 UTC (rev 3378)
@@ -1277,7 +1277,11 @@
append(" "); //$NON-NLS-1$
}
- append(((Constant)args[1]).getValue());
+ if (args.length < 2 || args[1] == null || !(args[1] instanceof Constant)) {
+ append(UNDEFINED);
+ } else {
+ append(((Constant)args[1]).getValue());
+ }
}
append(")"); //$NON-NLS-1$
13 years, 4 months
teiid SVN: r3377 - in trunk: documentation/reference/src/main/docbook/en-US/content and 10 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-08-11 14:49:54 -0400 (Thu, 11 Aug 2011)
New Revision: 3377
Modified:
trunk/build/kits/jboss-container/teiid-releasenotes.html
trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml
trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml
trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
trunk/engine/src/main/resources/org/teiid/query/i18n.properties
trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
trunk/engine/src/test/java/org/teiid/query/processor/TestTextTable.java
trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java
trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
Log:
TEIID-1703 adding more flexibility to fixed width parsing
Modified: trunk/build/kits/jboss-container/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-container/teiid-releasenotes.html 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/build/kits/jboss-container/teiid-releasenotes.html 2011-08-11 18:49:54 UTC (rev 3377)
@@ -28,6 +28,7 @@
<UL>
<LI><B>Procedure language features</B> - Added support for compound/block statements, BEGIN [[NOT] ATOMIC], loop/block labels, and the leave statement. See the reference for more.
<LI><B>File Enhancements</B> - the file translator can now optionally (via the ExceptionIfFileNotFound property) throw an exception if the path refers to a file that doesn't exist. The file resource adapter can be configured to map file names and can prevent parent path .. references. See the Admin Guide or the file-ds.xml template for more.
+ <LI><B>TEXTTABLE Enhancements</B> - TEXTTABLE can now parse fixed width files that do not use a row delimiter and can optionally produce fixed values that haven't been trimmed.
</UL>
<h2><a name="Compatibility">Compatibility Issues</a></h2>
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml 2011-08-11 18:49:54 UTC (rev 3377)
@@ -664,11 +664,11 @@
<row>
<entry align="right" valign="top"><para><anchor id="prod76" xreflabel="textTable"/>textTable</para></entry>
<entry align="left" valign="top"><para>::=
-<ID> <LPAREN> <link linkend="prod24">expression</link> <link linkend="prod11">nonReserved</link> <link linkend="prod82">textColumn</link> ( <COMMA> <link linkend="prod82">textColumn</link> )* ( <ID> <link linkend="prod68">charVal</link> )? ( ( <ESCAPE> <link linkend="prod68">charVal</link> ) | ( <ID> <link linkend="prod68">charVal</link> ) )? ( <ID> ( <link linkend="prod83">intVal</link> )? )? ( <ID> <link linkend="prod83">intVal</link> )? <RPAREN> ( <AS> )? <link linkend="prod2">id</link></para></entry></row>
+<ID> <LPAREN> <link linkend="prod24">expression</link> <link linkend="prod11">nonReserved</link> <link linkend="prod82">textColumn</link> ( <COMMA> <link linkend="prod82">textColumn</link> )* ( <NO> <ROW> <link linkend="prod11">nonReserved</link> )? ( <ID> <link linkend="prod68">charVal</link> )? ( ( <ESCAPE> <link linkend="prod68">charVal</link> ) | ( <ID> <link linkend="prod68">charVal</link> ) )? ( <ID> ( <link linkend="prod83">intVal</link> )? )? ( <ID> <link linkend="prod83">intVal</link> )? <RPAREN> ( <AS> )? <link linkend="prod2">id</link></para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor id="prod82" xreflabel="textColumn"/>textColumn</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod2">id</link> <link linkend="prod37">dataType</link> ( <ID> <link linkend="prod83">intVal</link> )?</para></entry></row>
+<link linkend="prod2">id</link> <link linkend="prod37">dataType</link> ( <ID> <link linkend="prod83">intVal</link> ( <NO> <link linkend="prod11">nonReserved</link> )? )?</para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor id="prod84" xreflabel="xmlQuery"/>xmlQuery</para></entry>
<entry align="left" valign="top"><para>::=
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml 2011-08-11 18:49:54 UTC (rev 3377)
@@ -98,8 +98,8 @@
</para>
<para>
Usage:
- <synopsis label="Usage">TEXTTABLE(expression COLUMNS <COLUMN>, ... [DELIMITER char] [(QUOTE|ESCAPE) char] [HEADER [integer]] [SKIP integer]) AS name</synopsis>
- <synopsis label="Usage">COLUMN := name datatype [WIDTH integer]</synopsis>
+ <synopsis label="Usage">TEXTTABLE(expression COLUMNS <COLUMN>, ... [NO ROW DELIMITER] [DELIMITER char] [(QUOTE|ESCAPE) char] [HEADER [integer]] [SKIP integer]) AS name</synopsis>
+ <synopsis label="Usage">COLUMN := name datatype [WIDTH integer [NO TRIM]]</synopsis>
</para>
<itemizedlist>
<para>Parameters</para>
@@ -108,6 +108,10 @@
</para>
</listitem>
<listitem>
+ <para>NO ROW DELIMITER indicates that fixed parsing should not assume the presense of newline row delimiters.
+ </para>
+ </listitem>
+ <listitem>
<para>DELIMITER sets the field delimiter character to use. Defaults to ','.
</para>
</listitem>
@@ -131,12 +135,20 @@
<para>SKIP specifies the number of text lines (counting every new line) to skip before parsing the contents. HEADER may still be specified with SKP.
</para>
</listitem>
+ <listitem>
+ <para>WIDTH indicates the fixed-width length of a column in characters - not bytes. The CR NL newline value counts as a single character.
+ </para>
+ </listitem>
+ <listitem>
+ <para>NO TRIM specifies that the text value should not be trimmed of all leading and trailing white space.
+ </para>
+ </listitem>
</itemizedlist>
<itemizedlist>
<para>Syntax Rules:
</para>
<listitem>
- <para>If width is specified for one column it must be specified for all columns.
+ <para>If width is specified for one column it must be specified for all columns and be a non-negative integer.
</para>
</listitem>
<listitem>
@@ -144,6 +156,10 @@
</para>
</listitem>
<listitem>
+ <para>If width is not specified, then NO ROW DELIMITER cannot be used.
+ </para>
+ </listitem>
+ <listitem>
<para>The columns names must be not contain duplicates.
</para>
</listitem>
@@ -151,21 +167,25 @@
<itemizedlist>
<para>Examples</para>
<listitem>
- <para>Use of the HEADER parameter, returns 1 row ['b']: <programlisting>select * from texttable('col1,col2,col3\na,b,c' COLUMNS col2 string HEADER) x</programlisting>
+ <para>Use of the HEADER parameter, returns 1 row ['b']: <programlisting>SELECT * FROM TEXTTABLE(UNESCAPE('col1,col2,col3\na,b,c') COLUMNS col2 string HEADER) x</programlisting>
</para>
</listitem>
<listitem>
- <para>Use of fixed width, returns 1 row ['a', 'b', 'c']: <programlisting>select * from texttable('abc' COLUMNS col1 string width 1, col2 string width 1, col3 string width 1) x</programlisting>
+ <para>Use of fixed width, returns 2 rows ['a', 'b', 'c'], ['d', 'e', 'f']: <programlisting>SELECT * FROM TEXTTABLE(UNESCAPE('abc\ndef') COLUMNS col1 string width 1, col2 string width 1, col3 string width 1) x</programlisting>
</para>
</listitem>
<listitem>
- <para>Use of ESCAPE parameter, returns 1 row ['a,', 'b']: <programlisting>select * from texttable('a:,,b' COLUMNS col1 string, col2 string ESCAPE ':') x</programlisting>
+ <para>Use of fixed width without a row delimiter, returns 3 rows ['a'], ['b'], ['c']: <programlisting>SELECT * FROM TEXTTABLE('abc' COLUMNS col1 string width 1 NO ROW DELIMITER) x</programlisting>
</para>
</listitem>
<listitem>
- <para>As a nested table: <programlisting>select x.* from t, texttable(t.clobcolumn COLUMNS first string, second date SKIP 1) x</programlisting>
+ <para>Use of ESCAPE parameter, returns 1 row ['a,', 'b']: <programlisting>SELECT * FROM TEXTTABLE('a:,,b' COLUMNS col1 string, col2 string ESCAPE ':') x</programlisting>
</para>
</listitem>
+ <listitem>
+ <para>As a nested table: <programlisting>SELECT x.* FROM t, TEXTTABLE(t.clobcolumn COLUMNS first string, second date SKIP 1) x</programlisting>
+ </para>
+ </listitem>
</itemizedlist>
</section>
<section id="xmltable">
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java 2011-08-11 18:49:54 UTC (rev 3377)
@@ -51,9 +51,6 @@
/**
* Handles text file processing.
*
- * TODO: unix style escape handling \t \n, etc. - see also the unescape function
- * TODO: allow for escaping with fixed parsing
- * TODO: allow for fixed parsing without new lines
* TODO: allow for a configurable line terminator
*/
public class TextTableNode extends SubqueryAwareRelationalNode {
@@ -211,14 +208,21 @@
if (eof) {
return null;
}
- continue; //skip empty lines
+ if (table.isUsingRowDelimiter()) {
+ continue; //skip empty lines
+ }
}
- if (exact && sb.length() < lineWidth) {
- throw new TeiidProcessingException(QueryPlugin.Util.getString("TextTableNode.invalid_width", sb.length(), lineWidth, textLine, systemId)); //$NON-NLS-1$
- }
- return sb.toString();
+ if (table.isUsingRowDelimiter()) {
+ if (exact && sb.length() < lineWidth) {
+ throw new TeiidProcessingException(QueryPlugin.Util.getString("TextTableNode.invalid_width", sb.length(), lineWidth, textLine, systemId)); //$NON-NLS-1$
+ }
+ return sb.toString();
+ }
}
sb.append(c);
+ if (exact && sb.length() == maxLength && !table.isUsingRowDelimiter()) {
+ return sb.toString();
+ }
if (sb.length() > maxLength) {
if (exact) {
sb.deleteCharAt(sb.length() - 1);
@@ -433,7 +437,7 @@
int beginIndex = 0;
for (TextColumn col : table.getColumns()) {
String val = new String(line.substring(beginIndex, beginIndex + col.getWidth()));
- addValue(result, false, val);
+ addValue(result, col.isNoTrim(), val);
beginIndex += col.getWidth();
}
return result;
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java 2011-08-11 18:49:54 UTC (rev 3377)
@@ -36,10 +36,12 @@
public static class TextColumn extends ProjectedColumn {
private Integer width;
+ private boolean noTrim;
- public TextColumn(String name, String type, Integer width) {
+ public TextColumn(String name, String type, Integer width, boolean noTrim) {
super(name, type);
this.width = width;
+ this.noTrim = noTrim;
}
protected TextColumn() {
@@ -54,6 +56,14 @@
this.width = width;
}
+ public boolean isNoTrim() {
+ return noTrim;
+ }
+
+ public void setNoTrim(boolean noTrim) {
+ this.noTrim = noTrim;
+ }
+
@Override
public boolean equals(Object obj) {
if (obj == this) {
@@ -63,13 +73,15 @@
return false;
}
TextColumn other = (TextColumn)obj;
- return EquivalenceUtil.areEqual(width, other.width);
+ return EquivalenceUtil.areEqual(width, other.width)
+ && noTrim == other.noTrim;
}
@Override
public TextColumn clone() {
TextColumn clone = new TextColumn();
clone.width = this.width;
+ clone.noTrim = this.noTrim;
this.copyTo(clone);
return clone;
}
@@ -82,6 +94,7 @@
private boolean escape;
private Integer header;
private Integer skip;
+ private boolean usingRowDelimiter;
private boolean fixedWidth;
@@ -148,6 +161,14 @@
public void setFile(Expression file) {
this.file = file;
}
+
+ public boolean isUsingRowDelimiter() {
+ return usingRowDelimiter;
+ }
+
+ public void setUsingRowDelimiter(boolean usingRowDelimiter) {
+ this.usingRowDelimiter = usingRowDelimiter;
+ }
@Override
public void acceptVisitor(LanguageVisitor visitor) {
@@ -168,6 +189,7 @@
clone.getColumns().add(column.clone());
}
clone.fixedWidth = this.fixedWidth;
+ clone.usingRowDelimiter = this.usingRowDelimiter;
return clone;
}
@@ -186,7 +208,8 @@
&& EquivalenceUtil.areEqual(escape, other.escape)
&& EquivalenceUtil.areEqual(quote, other.quote)
&& EquivalenceUtil.areEqual(header, other.header)
- && EquivalenceUtil.areEqual(skip, other.skip);
+ && EquivalenceUtil.areEqual(skip, other.skip)
+ && usingRowDelimiter == other.usingRowDelimiter;
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2011-08-11 18:49:54 UTC (rev 3377)
@@ -1277,11 +1277,7 @@
append(" "); //$NON-NLS-1$
}
- if (args.length < 2 || args[1] == null || !(args[1] instanceof Constant)) {
- append(UNDEFINED);
- } else {
- append(((Constant)args[1]).getValue());
- }
+ append(((Constant)args[1]).getValue());
}
append(")"); //$NON-NLS-1$
@@ -1811,10 +1807,24 @@
append(SPACE);
append(col.getWidth());
}
+ if (col.isNoTrim()) {
+ append(SPACE);
+ append(NO);
+ append(SPACE);
+ append(NonReserved.TRIM);
+ }
if (cols.hasNext()) {
append(","); //$NON-NLS-1$
}
}
+ if (!obj.isUsingRowDelimiter()) {
+ append(SPACE);
+ append(NO);
+ append(SPACE);
+ append(ROW);
+ append(SPACE);
+ append(NonReserved.DELIMITER);
+ }
if (obj.getDelimiter() != null) {
append(SPACE);
append(NonReserved.DELIMITER);
Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2011-08-11 18:49:54 UTC (rev 3377)
@@ -1474,6 +1474,9 @@
if (obj.getHeader() != null && obj.getHeader() < 0) {
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.text_table_negative"), obj); //$NON-NLS-1$
}
+ if (!obj.isUsingRowDelimiter()) {
+ handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.fixed_option"), obj); //$NON-NLS-1$
+ }
delimiter = obj.getDelimiter();
quote = obj.getQuote();
validateTextOptions(obj, delimiter, quote);
Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2011-08-11 18:49:54 UTC (rev 3377)
@@ -2287,6 +2287,7 @@
Expression file = null;
TextTable.TextColumn column = null;
List<TextTable.TextColumn> columns = new ArrayList<TextTable.TextColumn>();
+ boolean useRowDelimiter = true;
Character delimiter = null;
boolean escape = false;
Character quote = null;
@@ -2308,6 +2309,12 @@
}
)*
[
+ <NO> <ROW> nonReserved("DELIMITER")
+ {
+ useRowDelimiter = false;
+ }
+ ]
+ [
LOOKAHEAD(<ID>, { "delimiter".equalsIgnoreCase(getToken(1).image) }) <ID>
delimiter = charVal(info, "DELMITER")
]
@@ -2344,6 +2351,7 @@
result.setSkip(skip);
result.setName(validateAlias(aliasID));
result.setQuote(quote);
+ result.setUsingRowDelimiter(useRowDelimiter);
return result;
}
}
@@ -2353,6 +2361,7 @@
String name = null;
Constant datatype = null;
Integer width = null;
+ boolean noTrim = false;
}
{
name = id()
@@ -2360,9 +2369,15 @@
[
LOOKAHEAD(<ID>, { "width".equalsIgnoreCase(getToken(1).image) }) <ID>
width = intVal()
+ [ LOOKAHEAD(2)
+ <NO> nonReserved("TRIM")
+ {
+ noTrim = true;
+ }
+ ]
]
{
- return new TextTable.TextColumn(validateElementName(name), (String)datatype.getValue(), width);
+ return new TextTable.TextColumn(validateElementName(name), (String)datatype.getValue(), width, noTrim);
}
}
Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2011-08-11 18:49:54 UTC (rev 3377)
@@ -816,7 +816,8 @@
TextTableNode.character_not_allowed=Text parse error: Non-whitespace character found between the qualifier and the delimiter in text line {0} in {1}.
TextTableNode.unknown_escape=Text parse error: Unknown escape sequence \\{0} in text line {1} in {2}.
TextTableNode.invalid_width=Text parse error: Fixed width line width {0} is smaller than the expected {1} on text line {2} in {3}.
-TextTableNode.line_too_long=Text parse error: Delimited line is longer than the expected max of {2} on text line {0} in {1}.
+TextTableNode.line_too_long=Text parse error: Delimited line is longer than the expected max of {2} on text line {0} in {1}.
+ValidationVisitor.fixed_option=NO ROW DELIMITER can only be used in fixed parsing mode.
XMLTableNode.error=Error evaluating XQuery row context for XMLTable: {0}
XMLTableNode.path_error=Error evaluating XMLTable column path expression for column: {0}
Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java 2011-08-11 18:49:54 UTC (rev 3377)
@@ -6710,8 +6710,8 @@
TextTable tt = new TextTable();
tt.setFile(new ElementSymbol("file"));
List<TextTable.TextColumn> columns = new ArrayList<TextTable.TextColumn>();
- columns.add(new TextTable.TextColumn("x", "string", 1));
- columns.add(new TextTable.TextColumn("y", "date", 10));
+ columns.add(new TextTable.TextColumn("x", "string", 1, false));
+ columns.add(new TextTable.TextColumn("y", "date", 10, false));
tt.setColumns(columns);
tt.setSkip(10);
tt.setName("x");
Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestTextTable.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestTextTable.java 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestTextTable.java 2011-08-11 18:49:54 UTC (rev 3377)
@@ -159,6 +159,29 @@
process(sql, expected);
}
+ @Test public void testNoRowDelimiter() throws Exception {
+ String sql = "select * from texttable('abcdef' COLUMNS c1 string width 1, c2 string width 1 no row delimiter) x"; //$NON-NLS-1$
+
+ List[] expected = new List[] {
+ Arrays.asList("a","b"),
+ Arrays.asList("c","d"),
+ Arrays.asList("e","f"),
+ };
+
+ process(sql, expected);
+ }
+
+ @Test public void testNoTrim() throws Exception {
+ String sql = "select * from texttable('a b \nc d' COLUMNS c1 string width 2, c2 string width 2 no trim) x"; //$NON-NLS-1$
+
+ List[] expected = new List[] {
+ Arrays.asList("a","b "),
+ Arrays.asList("c"," d"),
+ };
+
+ process(sql, expected);
+ }
+
@Test public void testNoRows() throws Exception {
String sql = "select * from texttable('' COLUMNS c1 string, c2 string SKIP 3) x"; //$NON-NLS-1$
Modified: trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java 2011-08-11 18:49:54 UTC (rev 3377)
@@ -1901,5 +1901,10 @@
@Test public void testSimilar() throws Exception {
helpTestExpression("x similar to 'b' escape 'c'", "x SIMILAR TO 'b' ESCAPE 'c'");
}
+
+ @Test public void testTextTable() throws Exception {
+ String sql = "SELECT * from texttable(file columns x string WIDTH 1 NO TRIM NO ROW DELIMITER) as x"; //$NON-NLS-1$
+ helpTest(QueryParser.getQueryParser().parseCommand(sql), "SELECT * FROM TEXTTABLE(file COLUMNS x string WIDTH 1 NO TRIM NO ROW DELIMITER) AS x");
+ }
}
Modified: trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java 2011-08-11 18:49:54 UTC (rev 3377)
@@ -1772,6 +1772,10 @@
helpValidate("SELECT * from texttable(null columns x string width 1 DELIMITER 'z') as x", new String[] {"TEXTTABLE(null COLUMNS x string WIDTH 1 DELIMITER 'z') AS x"}, RealMetadataFactory.exampleBQTCached());
}
+ @Test public void testTextTableNoRowDelimiter() {
+ helpValidate("SELECT * from texttable(null columns x string NO ROW DELIMITER) as x", new String[] {"TEXTTABLE(null COLUMNS x string NO ROW DELIMITER) AS x"}, RealMetadataFactory.exampleBQTCached());
+ }
+
@Test public void testXMLNamespaces() {
helpValidate("select xmlforest(xmlnamespaces(no default, default 'http://foo'), e1 as \"table\") from pm1.g1", new String[] {"XMLNAMESPACES(NO DEFAULT, DEFAULT 'http://foo')"}, RealMetadataFactory.example1Cached());
}
13 years, 4 months
teiid SVN: r3376 - in branches/7.4.x/engine/src: test/java/org/teiid/query/processor and 1 other directory.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-08-11 11:59:42 -0400 (Thu, 11 Aug 2011)
New Revision: 3376
Modified:
branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanJoins.java
branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestTextTable.java
Log:
TEIID-1706 fix to join planning with nested tables
Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanJoins.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanJoins.java 2011-08-11 11:36:26 UTC (rev 3375)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanJoins.java 2011-08-11 15:59:42 UTC (rev 3376)
@@ -466,7 +466,9 @@
}
JoinType jt = (JoinType)root.getProperty(NodeConstants.Info.JOIN_TYPE);
- boolean treatJoinAsSource = jt.isOuter() || root.getProperty(NodeConstants.Info.ACCESS_PATTERNS) != null || root.hasProperty(NodeConstants.Info.MAKE_DEP) || root.hasProperty(NodeConstants.Info.MAKE_IND);
+ boolean treatJoinAsSource = jt.isOuter() || root.getProperty(NodeConstants.Info.ACCESS_PATTERNS) != null
+ || root.hasProperty(NodeConstants.Info.MAKE_DEP) || root.hasProperty(NodeConstants.Info.MAKE_IND)
+ || !root.getExportedCorrelatedReferences().isEmpty();
if (treatJoinAsSource) {
currentRegion.addJoinSourceNode(root);
Modified: branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestTextTable.java
===================================================================
--- branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestTextTable.java 2011-08-11 11:36:26 UTC (rev 3375)
+++ branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestTextTable.java 2011-08-11 15:59:42 UTC (rev 3376)
@@ -22,6 +22,7 @@
package org.teiid.query.processor;
+import static org.junit.Assert.*;
import static org.teiid.query.optimizer.TestOptimizer.*;
import static org.teiid.query.processor.TestProcessor.*;
@@ -43,6 +44,9 @@
import org.teiid.query.optimizer.capabilities.DefaultCapabilitiesFinder;
import org.teiid.query.optimizer.capabilities.FakeCapabilitiesFinder;
import org.teiid.query.optimizer.capabilities.SourceCapabilities.Capability;
+import org.teiid.query.processor.relational.JoinNode;
+import org.teiid.query.processor.relational.NestedTableJoinStrategy;
+import org.teiid.query.processor.relational.RelationalPlan;
import org.teiid.query.unittest.RealMetadataFactory;
@SuppressWarnings({"unchecked", "nls"})
@@ -243,8 +247,26 @@
};
process(sql, expected);
- }
+ }
+ @Test public void testTextTableJoin() throws Exception {
+ String sql = "select z.* from (select x.* from (select * from pm1.g1 where e1 = 'c') y, texttable(e1 || '\n' || e2 || '\n' || e3 COLUMNS x string) x) as z, " +
+ "(select x.* from (select * from pm1.g1 where e1 = 'c') y, texttable(e1 || '\n' || e2 || '\n' || e3 COLUMNS x string) x) as z1 where z.x = z1.x";
+
+ List[] expected = new List[] {
+ Arrays.asList("c"),
+ Arrays.asList("1"),
+ Arrays.asList("true"),
+ };
+
+ FakeDataManager dataManager = new FakeDataManager();
+ sampleData1(dataManager);
+ RelationalPlan plan = (RelationalPlan)helpGetPlan(helpParse(sql), RealMetadataFactory.example1Cached());
+ JoinNode join = (JoinNode) plan.getRootNode().getChildren()[0];
+ assertTrue(!(join.getJoinStrategy() instanceof NestedTableJoinStrategy));
+ helpProcess(plan, createCommandContext(), dataManager, expected);
+ }
+
public static void process(String sql, List[] expectedResults) throws Exception {
FakeDataManager dataManager = new FakeDataManager();
sampleData1(dataManager);
13 years, 4 months
teiid SVN: r3375 - in branches/7.4.x/engine/src: test/java/org/teiid/query/processor/relational and 1 other directory.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-08-11 07:36:26 -0400 (Thu, 11 Aug 2011)
New Revision: 3375
Modified:
branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/RelationalNodeUtil.java
branches/7.4.x/engine/src/test/java/org/teiid/query/processor/relational/TestAccessNode.java
Log:
TEIID-1704 fix for not returning rows from implicit grouping
Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/RelationalNodeUtil.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/RelationalNodeUtil.java 2011-08-10 20:39:40 UTC (rev 3374)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/RelationalNodeUtil.java 2011-08-11 11:36:26 UTC (rev 3375)
@@ -108,6 +108,11 @@
}
return true;
}
+
+ if (query.hasAggregates() && query.getGroupBy() == null) {
+ return true;
+ }
+
break;
case Command.TYPE_INSERT:
Insert insert = (Insert) command;
Modified: branches/7.4.x/engine/src/test/java/org/teiid/query/processor/relational/TestAccessNode.java
===================================================================
--- branches/7.4.x/engine/src/test/java/org/teiid/query/processor/relational/TestAccessNode.java 2011-08-10 20:39:40 UTC (rev 3374)
+++ branches/7.4.x/engine/src/test/java/org/teiid/query/processor/relational/TestAccessNode.java 2011-08-11 11:36:26 UTC (rev 3375)
@@ -124,4 +124,9 @@
Query query = (Query)QueryParser.getQueryParser().parseCommand("SELECT e1, e2 FROM pm1.g1 LIMIT 0"); //$NON-NLS-1$
assertFalse(RelationalNodeUtil.shouldExecute(query, false));
}
+
+ @Test public void testShouldExecuteAgg() throws Exception {
+ Query query = (Query)QueryParser.getQueryParser().parseCommand("SELECT count(*) FROM pm1.g1 where false"); //$NON-NLS-1$
+ assertTrue(RelationalNodeUtil.shouldExecute(query, false));
+ }
}
13 years, 4 months
teiid SVN: r3374 - in trunk: build/kits/jboss-container and 15 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-08-10 16:39:40 -0400 (Wed, 10 Aug 2011)
New Revision: 3374
Added:
trunk/connectors/connector-file/src/test/java/org/
trunk/connectors/connector-file/src/test/java/org/teiid/
trunk/connectors/connector-file/src/test/java/org/teiid/resource/
trunk/connectors/connector-file/src/test/java/org/teiid/resource/adapter/
trunk/connectors/connector-file/src/test/java/org/teiid/resource/adapter/file/
trunk/connectors/connector-file/src/test/java/org/teiid/resource/adapter/file/TestFileConnection.java
Modified:
trunk/api/src/main/java/org/teiid/translator/FileConnection.java
trunk/build/kits/jboss-container/teiid-examples/jca/file-ds.xml
trunk/build/kits/jboss-container/teiid-releasenotes.html
trunk/common-core/src/main/java/org/teiid/core/util/StringUtil.java
trunk/connectors/connector-file/src/main/java/org/teiid/resource/adapter/file/FileConnectionImpl.java
trunk/connectors/connector-file/src/main/java/org/teiid/resource/adapter/file/FileManagedConnectionFactory.java
trunk/connectors/connector-file/src/main/rar/META-INF/ra.xml
trunk/connectors/connector-file/src/main/resources/org/teiid/resource/adapter/file/i18n.properties
trunk/connectors/translator-file/src/main/java/org/teiid/translator/file/FileExecutionFactory.java
trunk/connectors/translator-file/src/main/resources/org/teiid/translator/file/i18n.properties
trunk/documentation/admin-guide/src/main/docbook/en-US/content/vdb-deployment.xml
trunk/documentation/reference/src/main/docbook/en-US/content/translators.xml
Log:
TEIID-1634 TEIID-1702 adding enhancements to file logic.
Modified: trunk/api/src/main/java/org/teiid/translator/FileConnection.java
===================================================================
--- trunk/api/src/main/java/org/teiid/translator/FileConnection.java 2011-08-10 20:35:57 UTC (rev 3373)
+++ trunk/api/src/main/java/org/teiid/translator/FileConnection.java 2011-08-10 20:39:40 UTC (rev 3374)
@@ -23,6 +23,7 @@
import java.io.File;
+import javax.resource.ResourceException;
import javax.resource.cci.Connection;
import org.teiid.core.util.FileUtils;
@@ -37,7 +38,7 @@
* @param path
* @return
*/
- File getFile(String path);
+ File getFile(String path) throws ResourceException;
public static class Util {
@@ -48,7 +49,7 @@
* @param path
* @return
*/
- public static File[] getFiles(String location, FileConnection fc) {
+ public static File[] getFiles(String location, FileConnection fc) throws ResourceException {
File datafile = fc.getFile(location);
if (datafile.isDirectory()) {
Modified: trunk/build/kits/jboss-container/teiid-examples/jca/file-ds.xml
===================================================================
--- trunk/build/kits/jboss-container/teiid-examples/jca/file-ds.xml 2011-08-10 20:35:57 UTC (rev 3373)
+++ trunk/build/kits/jboss-container/teiid-examples/jca/file-ds.xml 2011-08-10 20:39:40 UTC (rev 3374)
@@ -13,6 +13,17 @@
<!-- Directory where the data files are stored -->
<config-property name="ParentDirectory" type="java.lang.String">directory</config-property>
+
+ <!-- Optional properties -->
+
+ <!-- Set FileMapping to redirect specific relative paths (case sensitive) to alternative locations.
+ The string value specifies a map in the format key=value(,key=value)*
+ -->
+ <!-- <config-property name="FileMapping" type="java.lang.String">file1.txt=fileX.txt,file2.txt=fileY.txt</config-property> -->
+
+ <!-- Set AllowParentPaths to false to disallow .. in paths.
+ This prevent requesting files that are not contained in the parent directory -->
+ <config-property name="AllowParentPaths" type="java.lang.Boolean">true</config-property>
<max-pool-size>20</max-pool-size>
Modified: trunk/build/kits/jboss-container/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-container/teiid-releasenotes.html 2011-08-10 20:35:57 UTC (rev 3373)
+++ trunk/build/kits/jboss-container/teiid-releasenotes.html 2011-08-10 20:39:40 UTC (rev 3374)
@@ -27,6 +27,7 @@
<H2><A NAME="Highlights"></A>Highlights</H2>
<UL>
<LI><B>Procedure language features</B> - Added support for compound/block statements, BEGIN [[NOT] ATOMIC], loop/block labels, and the leave statement. See the reference for more.
+ <LI><B>File Enhancements</B> - the file translator can now optionally (via the ExceptionIfFileNotFound property) throw an exception if the path refers to a file that doesn't exist. The file resource adapter can be configured to map file names and can prevent parent path .. references. See the Admin Guide or the file-ds.xml template for more.
</UL>
<h2><a name="Compatibility">Compatibility Issues</a></h2>
@@ -189,6 +190,7 @@
<h4>From 7.4</h4>
<ul>
+ <li>Saxon was upgraded to 9.2.1.5
<li>nux 1.6, and xom 1.2 were added.
</ul>
<h4>From 7.1</h4>
Modified: trunk/common-core/src/main/java/org/teiid/core/util/StringUtil.java
===================================================================
--- trunk/common-core/src/main/java/org/teiid/core/util/StringUtil.java 2011-08-10 20:35:57 UTC (rev 3373)
+++ trunk/common-core/src/main/java/org/teiid/core/util/StringUtil.java 2011-08-10 20:39:40 UTC (rev 3374)
@@ -947,7 +947,9 @@
*/
@SuppressWarnings("unchecked")
public static <T> T valueOf(String value, Class type){
-
+ if (value == null) {
+ return null;
+ }
if(type == String.class) {
return (T) value;
}
Modified: trunk/connectors/connector-file/src/main/java/org/teiid/resource/adapter/file/FileConnectionImpl.java
===================================================================
--- trunk/connectors/connector-file/src/main/java/org/teiid/resource/adapter/file/FileConnectionImpl.java 2011-08-10 20:35:57 UTC (rev 3373)
+++ trunk/connectors/connector-file/src/main/java/org/teiid/resource/adapter/file/FileConnectionImpl.java 2011-08-10 20:39:40 UTC (rev 3374)
@@ -23,6 +23,9 @@
package org.teiid.resource.adapter.file;
import java.io.File;
+import java.util.Collections;
+import java.util.Map;
+import java.util.regex.Pattern;
import javax.resource.ResourceException;
@@ -36,17 +39,32 @@
public class FileConnectionImpl extends BasicConnection implements FileConnection {
private File parentDirectory;
+ private Map<String, String> fileMapping;
+ private boolean allowParentPaths;
+ private static final Pattern parentRef = Pattern.compile("(^\\.\\.(\\\\{2}|/)?.*)|((\\\\{2}|/)\\.\\.)"); //$NON-NLS-1$
- public FileConnectionImpl(String parentDirectory) {
+ public FileConnectionImpl(String parentDirectory, Map<String, String> fileMapping, boolean allowParentPaths) {
this.parentDirectory = new File(parentDirectory);
+ if (fileMapping == null) {
+ fileMapping = Collections.emptyMap();
+ }
+ this.fileMapping = fileMapping;
+ this.allowParentPaths = allowParentPaths;
}
@Override
- public File getFile(String path) {
+ public File getFile(String path) throws ResourceException {
if (path == null) {
return this.parentDirectory;
}
- return new File(parentDirectory, path);
+ String altPath = fileMapping.get(path);
+ if (altPath != null) {
+ path = altPath;
+ }
+ if (!allowParentPaths && parentRef.matcher(path).matches()) {
+ throw new ResourceException(FileManagedConnectionFactory.UTIL.getString("parentpath_not_allowed", path)); //$NON-NLS-1$
+ }
+ return new File(parentDirectory, path);
}
@Override
Modified: trunk/connectors/connector-file/src/main/java/org/teiid/resource/adapter/file/FileManagedConnectionFactory.java
===================================================================
--- trunk/connectors/connector-file/src/main/java/org/teiid/resource/adapter/file/FileManagedConnectionFactory.java 2011-08-10 20:35:57 UTC (rev 3373)
+++ trunk/connectors/connector-file/src/main/java/org/teiid/resource/adapter/file/FileManagedConnectionFactory.java 2011-08-10 20:39:40 UTC (rev 3374)
@@ -21,10 +21,13 @@
*/
package org.teiid.resource.adapter.file;
+import java.util.Map;
+
import javax.resource.ResourceException;
import javax.resource.spi.InvalidPropertyException;
import org.teiid.core.BundleUtil;
+import org.teiid.core.util.StringUtil;
import org.teiid.resource.spi.BasicConnection;
import org.teiid.resource.spi.BasicConnectionFactory;
import org.teiid.resource.spi.BasicManagedConnectionFactory;
@@ -35,17 +38,20 @@
public static final BundleUtil UTIL = BundleUtil.getBundleUtil(FileManagedConnectionFactory.class);
private String parentDirectory;
+ private String fileMapping;
+ private boolean allowParentPaths = true;
@Override
public BasicConnectionFactory createConnectionFactory() throws ResourceException {
if (this.parentDirectory == null) {
throw new InvalidPropertyException(UTIL.getString("parentdirectory_not_set")); //$NON-NLS-1$
}
+ final Map<String, String> map = StringUtil.valueOf(this.fileMapping, Map.class);
return new BasicConnectionFactory() {
@Override
public BasicConnection getConnection() throws ResourceException {
- return new FileConnectionImpl(parentDirectory);
+ return new FileConnectionImpl(parentDirectory, map, allowParentPaths);
}
};
}
@@ -58,4 +64,20 @@
this.parentDirectory = parentDirectory;
}
+ public String getFileMapping() {
+ return fileMapping;
+ }
+
+ public void setFileMapping(String fileMapping) {
+ this.fileMapping = fileMapping;
+ }
+
+ public boolean isAllowParentPaths() {
+ return allowParentPaths;
+ }
+
+ public void setAllowParentPaths(boolean allowParentPaths) {
+ this.allowParentPaths = allowParentPaths;
+ }
+
}
Modified: trunk/connectors/connector-file/src/main/rar/META-INF/ra.xml
===================================================================
--- trunk/connectors/connector-file/src/main/rar/META-INF/ra.xml 2011-08-10 20:35:57 UTC (rev 3373)
+++ trunk/connectors/connector-file/src/main/rar/META-INF/ra.xml 2011-08-10 20:39:40 UTC (rev 3374)
@@ -46,6 +46,19 @@
<config-property-type>java.lang.String</config-property-type>
</config-property>
+ <config-property>
+ <description>{$display:"File Mapping"}</description>
+ <config-property-name>FileMapping</config-property-name>
+ <config-property-type>java.lang.String</config-property-type>
+ </config-property>
+
+ <config-property>
+ <description>{$display:"Allow Parent Paths"}</description>
+ <config-property-name>AllowParentPaths</config-property-name>
+ <config-property-type>java.lang.Boolean</config-property-type>
+ <config-property-value>true</config-property-value>
+ </config-property>
+
<connectionfactory-interface>javax.resource.cci.ConnectionFactory</connectionfactory-interface>
<connectionfactory-impl-class>org.teiid.resource.spi.WrappedConnectionFactory</connectionfactory-impl-class>
<connection-interface>javax.resource.cci.Connection</connection-interface>
Modified: trunk/connectors/connector-file/src/main/resources/org/teiid/resource/adapter/file/i18n.properties
===================================================================
--- trunk/connectors/connector-file/src/main/resources/org/teiid/resource/adapter/file/i18n.properties 2011-08-10 20:35:57 UTC (rev 3373)
+++ trunk/connectors/connector-file/src/main/resources/org/teiid/resource/adapter/file/i18n.properties 2011-08-10 20:39:40 UTC (rev 3374)
@@ -20,4 +20,5 @@
# 02110-1301 USA.
#
-parentdirectory_not_set=ParentDirectory is not set
\ No newline at end of file
+parentdirectory_not_set=ParentDirectory is not set
+parentpath_not_allowed=Parent path .. not allowed in file path {0}
\ No newline at end of file
Added: trunk/connectors/connector-file/src/test/java/org/teiid/resource/adapter/file/TestFileConnection.java
===================================================================
--- trunk/connectors/connector-file/src/test/java/org/teiid/resource/adapter/file/TestFileConnection.java (rev 0)
+++ trunk/connectors/connector-file/src/test/java/org/teiid/resource/adapter/file/TestFileConnection.java 2011-08-10 20:39:40 UTC (rev 3374)
@@ -0,0 +1,68 @@
+/*
+ * 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.resource.adapter.file;
+
+import static org.junit.Assert.*;
+
+import java.io.File;
+
+import javax.resource.ResourceException;
+
+import org.junit.Test;
+import org.teiid.resource.spi.BasicConnectionFactory;
+import org.teiid.translator.FileConnection;
+
+@SuppressWarnings("nls")
+public class TestFileConnection {
+
+ @Test public void testFileMapping() throws Exception {
+ FileManagedConnectionFactory fmcf = new FileManagedConnectionFactory();
+ fmcf.setParentDirectory("foo");
+ fmcf.setFileMapping("x=y,z=a");
+ BasicConnectionFactory bcf = fmcf.createConnectionFactory();
+ FileConnection fc = (FileConnection)bcf.getConnection();
+ File f = fc.getFile("x");
+ assertEquals("foo/y", f.getPath());
+ f = fc.getFile("n");
+ assertEquals("foo/n", f.getPath());
+ }
+
+ @Test(expected=ResourceException.class) public void testParentPaths() throws Exception {
+ FileManagedConnectionFactory fmcf = new FileManagedConnectionFactory();
+ fmcf.setParentDirectory("foo");
+ fmcf.setAllowParentPaths(false);
+ BasicConnectionFactory bcf = fmcf.createConnectionFactory();
+ FileConnection fc = (FileConnection)bcf.getConnection();
+ fc.getFile("../x");
+ }
+
+ @Test public void testParentPaths1() throws Exception {
+ FileManagedConnectionFactory fmcf = new FileManagedConnectionFactory();
+ fmcf.setParentDirectory("foo");
+ fmcf.setAllowParentPaths(true);
+ BasicConnectionFactory bcf = fmcf.createConnectionFactory();
+ FileConnection fc = (FileConnection)bcf.getConnection();
+ fc.getFile("../x");
+ }
+
+}
Property changes on: trunk/connectors/connector-file/src/test/java/org/teiid/resource/adapter/file/TestFileConnection.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/connectors/translator-file/src/main/java/org/teiid/translator/file/FileExecutionFactory.java
===================================================================
--- trunk/connectors/translator-file/src/main/java/org/teiid/translator/file/FileExecutionFactory.java 2011-08-10 20:35:57 UTC (rev 3373)
+++ trunk/connectors/translator-file/src/main/java/org/teiid/translator/file/FileExecutionFactory.java 2011-08-10 20:39:40 UTC (rev 3374)
@@ -34,6 +34,7 @@
import java.util.Collections;
import java.util.List;
+import javax.resource.ResourceException;
import javax.resource.cci.ConnectionFactory;
import org.teiid.core.BundleUtil;
@@ -80,7 +81,15 @@
@Override
public void execute() throws TranslatorException {
- files = FileConnection.Util.getFiles((String)command.getArguments().get(0).getArgumentValue().getValue(), fc);
+ String path = (String)command.getArguments().get(0).getArgumentValue().getValue();
+ try {
+ files = FileConnection.Util.getFiles(path, fc);
+ } catch (ResourceException e) {
+ throw new TranslatorException(e);
+ }
+ if (files == null && exceptionIfFileNotFound) {
+ throw new TranslatorException(UTIL.getString("file_not_found", path)); //$NON-NLS-1$
+ }
LogManager.logDetail(LogConstants.CTX_CONNECTOR, "Getting", files != null ? files.length : 0, "file(s)"); //$NON-NLS-1$ //$NON-NLS-2$
String name = command.getProcedureName();
if (name.equalsIgnoreCase(GETTEXTFILES)) {
@@ -136,6 +145,7 @@
public static final String SAVEFILE = "saveFile"; //$NON-NLS-1$
private Charset encoding = Charset.defaultCharset();
+ private boolean exceptionIfFileNotFound;
@TranslatorProperty(display="File Encoding",advanced=true)
public String getEncoding() {
@@ -146,6 +156,15 @@
this.encoding = Charset.forName(encoding);
}
+ @TranslatorProperty(display="Exception if file not found",advanced=true)
+ public boolean isExceptionIfFileNotFound() {
+ return exceptionIfFileNotFound;
+ }
+
+ public void setExceptionIfFileNotFound(boolean exceptionIfFileNotFound) {
+ this.exceptionIfFileNotFound = exceptionIfFileNotFound;
+ }
+
//@Override
public ProcedureExecution createProcedureExecution(final Call command,
final ExecutionContext executionContext, final RuntimeMetadata metadata,
@@ -178,6 +197,8 @@
throw new TranslatorException(e, UTIL.getString("error_writing")); //$NON-NLS-1$
} catch (SQLException e) {
throw new TranslatorException(e, UTIL.getString("error_writing")); //$NON-NLS-1$
+ } catch (ResourceException e) {
+ throw new TranslatorException(e, UTIL.getString("error_writing")); //$NON-NLS-1$
}
}
Modified: trunk/connectors/translator-file/src/main/resources/org/teiid/translator/file/i18n.properties
===================================================================
--- trunk/connectors/translator-file/src/main/resources/org/teiid/translator/file/i18n.properties 2011-08-10 20:35:57 UTC (rev 3373)
+++ trunk/connectors/translator-file/src/main/resources/org/teiid/translator/file/i18n.properties 2011-08-10 20:39:40 UTC (rev 3374)
@@ -22,4 +22,5 @@
non_null=Expected non-null values for filePath and file
unknown_type=Unknown type for file, was expecting an XML, CLOB, or BLOB value
-error_writing=Error writing file
\ No newline at end of file
+error_writing=Error writing file
+file_not_found=File not found {0}
\ No newline at end of file
Modified: trunk/documentation/admin-guide/src/main/docbook/en-US/content/vdb-deployment.xml
===================================================================
--- trunk/documentation/admin-guide/src/main/docbook/en-US/content/vdb-deployment.xml 2011-08-10 20:35:57 UTC (rev 3373)
+++ trunk/documentation/admin-guide/src/main/docbook/en-US/content/vdb-deployment.xml 2011-08-10 20:39:40 UTC (rev 3374)
@@ -134,6 +134,17 @@
<rar-name>teiid-connector-file.rar</rar-name>
<connection-definition>javax.resource.cci.ConnectionFactory</connection-definition>
<config-property name="ParentDirectory">path-to-the-directory-of-data-file</config-property>
+
+ <!-- Optional properties -->
+
+ <!-- Set FileMapping to redirect specific relative paths (case sensitive) to alternative locations.
+ The string value specifies a map in the format key=value(,key=value)*
+ -->
+ <!-- <config-property name="FileMapping" type="java.lang.String">file1.txt=fileX.txt,file2.txt=fileY.txt</config-property> -->
+
+ <!-- Set AllowParentPaths to false to disallow .. in paths.
+ This prevent requesting files that are not contained in the parent directory -->
+ <config-property name="AllowParentPaths" type="java.lang.Boolean">true</config-property>
</no-tx-connection-factory>
</connection-factories>]]></programlisting></example>
</section>
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/translators.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/translators.xml 2011-08-10 20:35:57 UTC (rev 3373)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/translators.xml 2011-08-10 20:39:40 UTC (rev 3374)
@@ -162,6 +162,11 @@
<entry>The encoding that should be used for CLOBs returned by the getTextFiles procedure</entry>
<entry>The system default encoding</entry>
</row>
+ <row>
+ <entry>ExceptionIfFileNotFound</entry>
+ <entry>Throw an exception in getFiles or getTextFiles if the specified file/directory does not exist.</entry>
+ <entry>false</entry>
+ </row>
</tbody>
</tgroup>
</table>
@@ -178,7 +183,7 @@
If the extension path is specified, then it will filter all of the file in the directory referenced by the base path.
If the extension pattern is not specified and the path is a directory,
then all files in the directory will be returned. Otherwise the single file referenced will be returned. If the path
- doesn't exist, then no results will be returned.
+ doesn't exist, then no results will be returned if ExceptionIfFileNotFound is false, otherwise an exception will be raised.
</para>
<para>
13 years, 4 months