DNA SVN: r1562 - trunk/dna-common/src/main/java/org/jboss/dna/common/text.
by dna-commits@lists.jboss.org
Author: spagop
Date: 2010-01-08 11:01:33 -0500 (Fri, 08 Jan 2010)
New Revision: 1562
Modified:
trunk/dna-common/src/main/java/org/jboss/dna/common/text/SecureHashTextEncoder.java
Log:
deleted the dependency to com.sun.org.apache.xerces.internal.impl.dv.util.Base6 and replace it the one of org.jboss.dna.common.util.Base64
Modified: trunk/dna-common/src/main/java/org/jboss/dna/common/text/SecureHashTextEncoder.java
===================================================================
--- trunk/dna-common/src/main/java/org/jboss/dna/common/text/SecureHashTextEncoder.java 2010-01-08 13:45:44 UTC (rev 1561)
+++ trunk/dna-common/src/main/java/org/jboss/dna/common/text/SecureHashTextEncoder.java 2010-01-08 16:01:33 UTC (rev 1562)
@@ -24,10 +24,10 @@
package org.jboss.dna.common.text;
import java.security.NoSuchAlgorithmException;
+import org.jboss.dna.common.util.Base64;
import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.SecureHash;
import org.jboss.dna.common.util.SecureHash.Algorithm;
-import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
/**
* A text encoder that performs a secure hash of the input text and returns that hash as the encoded text. This encoder can be
@@ -88,7 +88,7 @@
public String encode( String text ) {
try {
byte[] hash = SecureHash.getHash(algorithm, text.getBytes());
- String result = Base64.encode(hash);
+ String result = Base64.encodeBytes(hash);
return result.length() < maxLength ? result : result.substring(0, maxLength);
} catch (NoSuchAlgorithmException e) {
return text;
15 years, 11 months
DNA SVN: r1561 - in trunk: extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle and 1 other directory.
by dna-commits@lists.jboss.org
Author: blafond
Date: 2010-01-08 08:45:44 -0500 (Fri, 08 Jan 2010)
New Revision: 1561
Modified:
trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java
trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java
Log:
DNA-49 Removing System.out's in tests.
Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java 2010-01-08 11:51:30 UTC (rev 1560)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java 2010-01-08 13:45:44 UTC (rev 1561)
@@ -59,7 +59,7 @@
}
public void uploadFile(String folder, String fileName, String testMethod) throws RepositoryException, IOException {
- printStart(fileName, testMethod);
+ //printStart(fileName, testMethod);
URL url = getUrl(folder + fileName);
uploadFile(url);
Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java 2010-01-08 11:51:30 UTC (rev 1560)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java 2010-01-08 13:45:44 UTC (rev 1561)
@@ -191,7 +191,7 @@
assertNode(viewNode, "col1", "ddl:columnReference");
Node tableNode = assertNode(ddlNode, "table_5", "ddl:createTableStatement");
- printChildProperties(tableNode);
+ //printChildProperties(tableNode);
assertEquals(18, tableNode.getNodes().getSize());
}
}
Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java 2010-01-08 11:51:30 UTC (rev 1560)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java 2010-01-08 13:45:44 UTC (rev 1561)
@@ -355,8 +355,6 @@
@Test
public void shouldParseCreateMaterializedView() {
- setPrintToConsole(true);
- parser.setTestMode(isPrintToConsole());
printTest("shouldParseCreateMaterializedView()");
String content = " CREATE MATERIALIZED VIEW sales_mv" + NEWLINE
+ "BUILD IMMEDIATE" + NEWLINE
@@ -377,8 +375,6 @@
@Test
public void shouldParseCreateMaterializedViewLog() {
- setPrintToConsole(true);
- parser.setTestMode(isPrintToConsole());
printTest("shouldParseCreateMaterializedViewLog()");
String content = "CREATE MATERIALIZED VIEW LOG ON products" + NEWLINE
+ "WITH ROWID, SEQUENCE (prod_id)" + NEWLINE
15 years, 11 months
DNA SVN: r1560 - trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta.
by dna-commits@lists.jboss.org
Author: bcarothers
Date: 2010-01-08 06:51:30 -0500 (Fri, 08 Jan 2010)
New Revision: 1560
Modified:
trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta/repositoryOverlay.properties
Log:
DNA-632
Modified: trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta/repositoryOverlay.properties
===================================================================
--- trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta/repositoryOverlay.properties 2010-01-08 05:47:10 UTC (rev 1559)
+++ trunk/dna-integration-tests/src/test/resources/tck/jdbcmeta/repositoryOverlay.properties 2010-01-08 11:51:30 UTC (rev 1560)
@@ -10,4 +10,7 @@
# There's only one workspace per repository for this connector right now
javax.jcr.tck.workspacename=default
+# Need to set a real property for XPath query tests
+javax.jcr.tck.propertyname1=mj:typeName
+
15 years, 11 months
DNA SVN: r1559 - trunk/dna-jcr/src/main/java/org/jboss/dna/jcr.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2010-01-08 00:47:10 -0500 (Fri, 08 Jan 2010)
New Revision: 1559
Modified:
trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java
Log:
Removed warnings about unused exceptions in throws-clauses.
Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java 2010-01-08 05:46:48 UTC (rev 1558)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java 2010-01-08 05:47:10 UTC (rev 1559)
@@ -159,7 +159,7 @@
QueryCommand query,
Schemata schemata,
PlanHints hints,
- Map<String, Object> variables ) throws InvalidQueryException {
+ Map<String, Object> variables ) {
Graph.BuildQuery builder = workspaceGraph(workspaceName).query(query, schemata);
if (variables != null) builder.using(variables);
if (hints != null) builder.using(hints);
@@ -170,7 +170,7 @@
public QueryResults search( String workspaceName,
String searchExpression,
int maxRowCount,
- int offset ) throws InvalidQueryException {
+ int offset ) {
return workspaceGraph(workspaceName).search(searchExpression, maxRowCount, offset);
}
@@ -364,7 +364,7 @@
public QueryResults search( String workspaceName,
String searchExpression,
int maxRowCount,
- int offset ) throws InvalidQueryException {
+ int offset ) {
Graph graph = Graph.create(sourceName, connectionFactory, context);
if (workspaceName != null) {
15 years, 11 months
DNA SVN: r1558 - in trunk: dna-integration-tests/src/test/resources/tck/filesystem and 4 other directories.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2010-01-08 00:46:48 -0500 (Fri, 08 Jan 2010)
New Revision: 1558
Added:
trunk/dna-integration-tests/src/test/resources/tck/filesystem/defaultWorkspace/testroot/yetAnotherNode
Modified:
trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/basic/JodaDateTimeValueFactory.java
trunk/dna-integration-tests/src/test/resources/tck/filesystem/repositoryOverlay.properties
trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java
trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java
trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java
Log:
DNA-613 minor changes to get the FileSystemRepositoryTckTest to run with the newly-added XPath TCK tests.
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/basic/JodaDateTimeValueFactory.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/basic/JodaDateTimeValueFactory.java 2010-01-08 05:45:54 UTC (rev 1557)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/basic/JodaDateTimeValueFactory.java 2010-01-08 05:46:48 UTC (rev 1558)
@@ -64,10 +64,17 @@
try {
return new JodaDateTime(value.trim());
} catch (IllegalArgumentException err) {
- throw new ValueFormatException(value, getPropertyType(),
- GraphI18n.errorConvertingType.text(String.class.getSimpleName(),
- DateTime.class.getSimpleName(),
- value), err);
+ // See if this string represents a LONG value ...
+ try {
+ Long longValue = Long.parseLong(value);
+ return new JodaDateTime(longValue);
+ } catch (NumberFormatException e) {
+ // Guess it wasn't a long value ...
+ throw new ValueFormatException(value, getPropertyType(),
+ GraphI18n.errorConvertingType.text(String.class.getSimpleName(),
+ DateTime.class.getSimpleName(),
+ value), err);
+ }
}
}
Added: trunk/dna-integration-tests/src/test/resources/tck/filesystem/defaultWorkspace/testroot/yetAnotherNode
===================================================================
--- trunk/dna-integration-tests/src/test/resources/tck/filesystem/defaultWorkspace/testroot/yetAnotherNode (rev 0)
+++ trunk/dna-integration-tests/src/test/resources/tck/filesystem/defaultWorkspace/testroot/yetAnotherNode 2010-01-08 05:46:48 UTC (rev 1558)
@@ -0,0 +1 @@
+Test content
Modified: trunk/dna-integration-tests/src/test/resources/tck/filesystem/repositoryOverlay.properties
===================================================================
--- trunk/dna-integration-tests/src/test/resources/tck/filesystem/repositoryOverlay.properties 2010-01-08 05:45:54 UTC (rev 1557)
+++ trunk/dna-integration-tests/src/test/resources/tck/filesystem/repositoryOverlay.properties 2010-01-08 05:46:48 UTC (rev 1558)
@@ -1,6 +1,7 @@
# Placeholder for any overlaid properties for this repo configuration
javax.jcr.tck.dnaSkipImport=true
+query.xpath.pos.index=false
javax.jcr.tck.nodetype=nt\:folder
Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java 2010-01-08 05:45:54 UTC (rev 1557)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java 2010-01-08 05:46:48 UTC (rev 1558)
@@ -392,13 +392,13 @@
* @throws IllegalArgumentException If <code>executionContext</code>, <code>connectionFactory</code>,
* <code>repositorySourceName</code>, or <code>repositoryObservable</code> is <code>null</code>.
*/
- public JcrRepository( ExecutionContext executionContext,
- RepositoryConnectionFactory connectionFactory,
- String repositorySourceName,
- Observable repositoryObservable,
- RepositorySourceCapabilities repositorySourceCapabilities,
- Map<String, String> descriptors,
- Map<Option, String> options ) throws RepositoryException {
+ JcrRepository( ExecutionContext executionContext,
+ RepositoryConnectionFactory connectionFactory,
+ String repositorySourceName,
+ Observable repositoryObservable,
+ RepositorySourceCapabilities repositorySourceCapabilities,
+ Map<String, String> descriptors,
+ Map<Option, String> options ) throws RepositoryException {
CheckArg.isNotNull(executionContext, "executionContext");
CheckArg.isNotNull(connectionFactory, "connectionFactory");
CheckArg.isNotNull(repositorySourceName, "repositorySourceName");
@@ -415,11 +415,17 @@
modifiableDescriptors.put(Repository.LEVEL_2_SUPPORTED, "true");
modifiableDescriptors.put(Repository.OPTION_LOCKING_SUPPORTED, "true");
modifiableDescriptors.put(Repository.OPTION_OBSERVATION_SUPPORTED, "true");
- modifiableDescriptors.put(Repository.OPTION_QUERY_SQL_SUPPORTED, "false");
+ modifiableDescriptors.put(Repository.OPTION_QUERY_SQL_SUPPORTED, "false"); // not JCR 1.0 SQL
modifiableDescriptors.put(Repository.OPTION_TRANSACTIONS_SUPPORTED, "false");
modifiableDescriptors.put(Repository.OPTION_VERSIONING_SUPPORTED, "false");
- modifiableDescriptors.put(Repository.QUERY_XPATH_DOC_ORDER, "true");
- modifiableDescriptors.put(Repository.QUERY_XPATH_POS_INDEX, "true");
+ if (!modifiableDescriptors.containsKey(Repository.QUERY_XPATH_DOC_ORDER)) {
+ // don't override what was supplied ...
+ modifiableDescriptors.put(Repository.QUERY_XPATH_DOC_ORDER, "true");
+ }
+ if (!modifiableDescriptors.containsKey(Repository.QUERY_XPATH_POS_INDEX)) {
+ // don't override what was supplied ...
+ modifiableDescriptors.put(Repository.QUERY_XPATH_POS_INDEX, "true");
+ }
// Vendor-specific descriptors (REP_XXX) will only be initialized if not already present, allowing for customer branding.
if (!modifiableDescriptors.containsKey(Repository.REP_NAME_DESC)) {
modifiableDescriptors.put(Repository.REP_NAME_DESC, JcrI18n.REP_NAME_DESC.text());
Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java 2010-01-08 05:45:54 UTC (rev 1557)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java 2010-01-08 05:46:48 UTC (rev 1558)
@@ -293,7 +293,6 @@
Query query = manager.createQuery("//element(*,nt:unstructured) order by @jcr:primaryType", Query.XPATH);
assertThat(query, is(notNullValue()));
QueryResult result = query.execute();
- print = true;
assertResults(query, result, 21);
assertThat(result, is(notNullValue()));
assertResultsHaveColumns(result, "jcr:primaryType", "jcr:path", "jcr:score");
@@ -301,7 +300,6 @@
query = manager.createQuery("//element(*,car:Car) order by @car:year", Query.XPATH);
assertThat(query, is(notNullValue()));
result = query.execute();
- print = true;
assertResults(query, result, 12);
assertThat(result, is(notNullValue()));
assertResultsHaveColumns(result, "car:year", "jcr:path", "jcr:score");
@@ -312,7 +310,6 @@
Query query = session.getWorkspace().getQueryManager().createQuery(" /jcr:root/Cars/Hybrid/*", Query.XPATH);
assertThat(query, is(notNullValue()));
QueryResult result = query.execute();
- print = true;
assertResults(query, result, 3);
assertThat(result, is(notNullValue()));
assertResultsHaveColumns(result, "jcr:primaryType", "jcr:path", "jcr:score");
@@ -389,7 +386,6 @@
Query query = session.getWorkspace().getQueryManager().createQuery("/jcr:root/Other/NodeA", Query.XPATH);
assertThat(query, is(notNullValue()));
QueryResult result = query.execute();
- print = true;
assertResults(query, result, 1);
assertThat(result, is(notNullValue()));
assertThat(result.getNodes().nextNode().getIndex(), is(1));
@@ -398,7 +394,6 @@
query = session.getWorkspace().getQueryManager().createQuery("/jcr:root/Other/NodeA[2]", Query.XPATH);
assertThat(query, is(notNullValue()));
result = query.execute();
- print = true;
assertResults(query, result, 1);
assertThat(result, is(notNullValue()));
assertThat(result.getNodes().nextNode().getIndex(), is(2));
Modified: trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java
===================================================================
--- trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java 2010-01-08 05:45:54 UTC (rev 1557)
+++ trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java 2010-01-08 05:46:48 UTC (rev 1558)
@@ -463,7 +463,6 @@
if (fullTextSearchValue != null && fullTextSearchValue.length() != 0) {
doc.add(new Field(ContentIndex.FULL_TEXT, fullTextSearchValue.toString(), Field.Store.NO, Field.Index.ANALYZED));
}
- // System.out.println("Replaced " + doc);
getContentWriter().updateDocument(new Term(ContentIndex.PATH, pathStr), doc);
}
15 years, 11 months
DNA SVN: r1557 - in trunk: extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query and 1 other directory.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2010-01-08 00:45:54 -0500 (Fri, 08 Jan 2010)
New Revision: 1557
Modified:
trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java
trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/CompareQuery.java
trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/HasValueQuery.java
trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/IdsQuery.java
Log:
DNA-630 DNA-613 This was found while trying to fix DNA-613.
I logged this because this was so tricky. LuceneSearchEngine works by building up a (complex) Lucene Query object and executing that, then collecting the tuples from the Lucene documents that are returned in the results.
In this case, the AQM query included a constraint (among others) that LuceneSearchEngine converted into a custom HasValueQuery class (which extends Query). HasValueQuery creates a custom ExistsScorer class (which subclasses org.apache.lucene.search.Scorer), and the problem was that the 'nextDoc()' method was implemented incorrectly. It uses an internal counter to walk through the documents (handed to it in the constructor), and was not (correctly) checking whether the docId was less than the maxDoc, which is obtained from the IndexReader.maxDoc().
Essentially, the ExistsScorer was iterating through more documents than in the reader, and thus the 'read past EOF'. (The IndexReader uses a random-access mechanism to seek to the desired document, but if the document ID is too big, the seek goes beyond the EOF.)
I checked the other Query subclasses in org.jboss.dna.search.lucene.query, and found a few other classes that were also implemented incorrectly. These were fixed as well, and all tests pass.
Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java 2010-01-08 05:45:17 UTC (rev 1556)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java 2010-01-08 05:45:54 UTC (rev 1557)
@@ -177,7 +177,7 @@
// These might not all be level one tests
addTestSuite(org.apache.jackrabbit.test.api.query.XPathPosIndexTest.class);
// addTestSuite(org.apache.jackrabbit.test.api.query.XPathDocOrderTest.class);
- // addTestSuite(org.apache.jackrabbit.test.api.query.XPathOrderByTest.class);
+ addTestSuite(org.apache.jackrabbit.test.api.query.XPathOrderByTest.class);
addTestSuite(org.apache.jackrabbit.test.api.query.XPathJcrPathTest.class);
addTestSuite(org.apache.jackrabbit.test.api.query.DerefQueryLevel1Test.class);
addTestSuite(org.apache.jackrabbit.test.api.query.GetLanguageTest.class);
Modified: trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/CompareQuery.java
===================================================================
--- trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/CompareQuery.java 2010-01-08 05:45:17 UTC (rev 1556)
+++ trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/CompareQuery.java 2010-01-08 05:45:54 UTC (rev 1557)
@@ -267,14 +267,14 @@
public int nextDoc() throws IOException {
do {
++docId;
+ if (docId >= maxDocId) return Scorer.NO_MORE_DOCS;
if (reader.isDeleted(docId)) {
// We should skip this document ...
continue;
}
ValueType value = readFromDocument(reader, docId);
if (evaluator.satisfiesConstraint(value, constraintValue)) return docId;
- } while (docId < maxDocId);
- return Scorer.NO_MORE_DOCS;
+ } while (true);
}
/**
Modified: trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/HasValueQuery.java
===================================================================
--- trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/HasValueQuery.java 2010-01-08 05:45:17 UTC (rev 1556)
+++ trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/HasValueQuery.java 2010-01-08 05:45:54 UTC (rev 1557)
@@ -219,13 +219,13 @@
public int nextDoc() throws IOException {
do {
++docId;
+ if (docId >= maxDocId) return Scorer.NO_MORE_DOCS;
if (reader.isDeleted(docId)) {
// We should skip this document ...
continue;
}
if (hasValue(reader, docId)) return docId;
- } while (docId < maxDocId);
- return Scorer.NO_MORE_DOCS;
+ } while (true);
}
/**
Modified: trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/IdsQuery.java
===================================================================
--- trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/IdsQuery.java 2010-01-08 05:45:17 UTC (rev 1556)
+++ trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/query/IdsQuery.java 2010-01-08 05:45:54 UTC (rev 1557)
@@ -221,13 +221,13 @@
public int nextDoc() throws IOException {
do {
++docId;
+ if (docId >= maxDocId) return Scorer.NO_MORE_DOCS;
if (reader.isDeleted(docId)) {
// We should skip this document ...
continue;
}
if (includeDocument(reader, docId)) return docId;
- } while (docId < maxDocId);
- return Scorer.NO_MORE_DOCS;
+ } while (true);
}
/**
15 years, 11 months
DNA SVN: r1556 - in trunk: dna-graph/src/main/java/org/jboss/dna/graph/query/model and 9 other directories.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2010-01-08 00:45:17 -0500 (Fri, 08 Jan 2010)
New Revision: 1556
Added:
trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/ReplaceAliases.java
Modified:
trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Column.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/PushProjects.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/ReplaceViews.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/RewriteAsRangeCriteria.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizer.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/PlanUtil.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/validate/Validator.java
trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizerTest.java
trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java
trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslator.java
trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java
trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathParserTest.java
trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslatorTest.java
trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java
Log:
DNA-613 Found several minor issues that all conspired to make this functionality not work.
1) The XPathToQueryTranslator was incorrectly translating queries that used wildcards in the path.
2) Queries that used aliases in columns, criteria, or order-by clauses were not always being resolved correctly, resulting in the inability to locate the correct column (when constraints or order-by clauses had to be evaluated after the fact.
3) The optimizer was not always pushing SELECT nodes (e.g., criteria) down below ACCESS nodes. The rule to do this was not included by default and was instead added to the rule stack only when criteria were encountered. This was changed to simply always add the rule to the stack.
4) Columns used in constraints or order-by clauses were not always being included in the PROJECT columns. Thus it was possible that the evaluation of the criteria or order-by required data that was not in the tuples, causing an error. Note that these PROJECT columns dictate which values are included in the tuples during processing, and all of these are not necessarily included in the result columns.
5) The LuceneSearchEngine was incorrectly mapping paths into criteria values that could be applied to Lucene. If the user specified a criteria such as
PATH(table) LIKE '/Cars/Hybrid/%'
the /Cars/Hybrid/% value was used directly as the LIKE expression. But paths are stored in the indexes so that the SNS index is always included, and thus the LIKE expressions never evaluated to return any documents. Since the SNS index in the path might include the wildcard characters (e.g., '[%]' or '[_]'), we couldn't use the standard PathFactory to convert the LIKE expression value into a Path. The solution was to just use String manipulation to insert a '[1]' at the end of each segment that didn't already include a SNS index.
6) Lucene 'read past EOF' errors; see DNA-630.
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java 2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java 2010-01-08 05:45:17 UTC (rev 1556)
@@ -2666,7 +2666,8 @@
msg,
accessNode.getString(),
accessRequest.workspace(),
- graphSourceName);
+ graphSourceName,
+ accessRequest.getError().getLocalizedMessage());
return emptyTuples();
}
return accessRequest.getTuples();
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Column.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Column.java 2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/model/Column.java 2010-01-08 05:45:17 UTC (rev 1556)
@@ -134,6 +134,17 @@
}
/**
+ * Create a copy of this Column except that uses the supplied selector name instead.
+ *
+ * @param newSelectorName the new selector name
+ * @return a new Column with the supplied selector name and the property and column names from this object; never null
+ * @throws IllegalArgumentException if the supplied selector name is null
+ */
+ public Column with( SelectorName newSelectorName ) {
+ return new Column(newSelectorName, propertyName, columnName);
+ }
+
+ /**
* {@inheritDoc}
*
* @see org.jboss.dna.graph.query.model.Visitable#accept(org.jboss.dna.graph.query.model.Visitor)
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/PushProjects.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/PushProjects.java 2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/PushProjects.java 2010-01-08 05:45:17 UTC (rev 1556)
@@ -89,6 +89,11 @@
}
child.insertAsParent(project);
if (plan == access) return plan;
+
+ // We need to make sure we have all of the columns needed for any ancestor ...
+ List<Column> requiredColumns = PlanUtil.findRequiredColumns(context, project);
+ project.setProperty(Property.PROJECT_COLUMNS, requiredColumns);
+ project.addSelectors(getSelectorsFor(requiredColumns));
continue;
}
Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/ReplaceAliases.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/ReplaceAliases.java (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/ReplaceAliases.java 2010-01-08 05:45:17 UTC (rev 1556)
@@ -0,0 +1,88 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * 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.
+ * See the AUTHORS.txt file in the distribution for a full listing of
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you 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.
+ *
+ * JBoss DNA 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.graph.query.optimize;
+
+import java.util.LinkedList;
+import net.jcip.annotations.Immutable;
+import org.jboss.dna.graph.query.QueryContext;
+import org.jboss.dna.graph.query.model.SelectorName;
+import org.jboss.dna.graph.query.plan.PlanNode;
+import org.jboss.dna.graph.query.plan.PlanUtil;
+import org.jboss.dna.graph.query.plan.PlanNode.Property;
+import org.jboss.dna.graph.query.plan.PlanNode.Type;
+import org.jboss.dna.graph.query.validate.Schemata;
+import org.jboss.dna.graph.query.validate.Schemata.Table;
+
+/**
+ * An {@link OptimizerRule optimizer rule} that changes any nodes that make use of an alias for a SOURCE, including columns,
+ * including criteria, project nodes, etc. This behavior is similar to what {@link ReplaceViews} does with views that are given
+ * aliases.
+ */
+@Immutable
+public class ReplaceAliases implements OptimizerRule {
+
+ public static final ReplaceAliases INSTANCE = new ReplaceAliases();
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.graph.query.optimize.OptimizerRule#execute(org.jboss.dna.graph.query.QueryContext,
+ * org.jboss.dna.graph.query.plan.PlanNode, java.util.LinkedList)
+ */
+ public PlanNode execute( QueryContext context,
+ PlanNode plan,
+ LinkedList<OptimizerRule> ruleStack ) {
+ // For each of the SOURCE nodes ...
+ Schemata schemata = context.getSchemata();
+ for (PlanNode sourceNode : plan.findAllAtOrBelow(Type.SOURCE)) {
+
+ // Resolve the node to find the definition in the schemata ...
+ SelectorName tableName = sourceNode.getProperty(Property.SOURCE_NAME, SelectorName.class);
+ SelectorName tableAlias = sourceNode.getProperty(Property.SOURCE_ALIAS, SelectorName.class);
+ if (tableAlias != null) {
+ Table table = schemata.getTable(tableName);
+ // We also need to replace references to the alias for the view ...
+ PlanUtil.ColumnMapping aliasMappings = PlanUtil.createMappingForAliased(tableAlias, table, sourceNode);
+ // Adjust the plan nodes above the SOURCE node ...
+ PlanUtil.replaceViewReferences(context, sourceNode.getParent(), aliasMappings);
+ // And adjust the SOURCE node ...
+ sourceNode.removeProperty(Property.SOURCE_ALIAS);
+ sourceNode.getSelectors().remove(tableAlias);
+ sourceNode.addSelector(tableName);
+ }
+ }
+ return plan;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return getClass().getSimpleName();
+ }
+
+}
Property changes on: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/ReplaceAliases.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/ReplaceViews.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/ReplaceViews.java 2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/ReplaceViews.java 2010-01-08 05:45:17 UTC (rev 1556)
@@ -149,6 +149,7 @@
// is completely done ...
if (!(ruleStack.getFirst() instanceof RaiseSelectCriteria)) {
ruleStack.addFirst(RaiseSelectCriteria.INSTANCE);
+ ruleStack.addFirst(PushSelectCriteria.INSTANCE);
}
// We re-wrote at least one SOURCE, but the resulting plan tree for the view could actually reference
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/RewriteAsRangeCriteria.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/RewriteAsRangeCriteria.java 2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/RewriteAsRangeCriteria.java 2010-01-08 05:45:17 UTC (rev 1556)
@@ -165,6 +165,16 @@
}
/**
+ * {@inheritDoc}
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return getClass().getSimpleName();
+ }
+
+ /**
* Rewrite the supplied comparisons, returning the new constraint and nulling in the supplied list those comparisons that were
* rewritten (and leaving those that were not rewritten)
*
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizer.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizer.java 2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizer.java 2010-01-08 05:45:17 UTC (rev 1556)
@@ -69,15 +69,14 @@
*/
protected void populateRuleStack( LinkedList<OptimizerRule> ruleStack,
PlanHints hints ) {
+ ruleStack.addFirst(ReplaceAliases.INSTANCE);
ruleStack.addFirst(RewriteAsRangeCriteria.INSTANCE);
if (hints.hasJoin) {
ruleStack.addFirst(ChooseJoinAlgorithm.USE_ONLY_NESTED_JOIN_ALGORITHM);
ruleStack.addFirst(RewriteIdentityJoins.INSTANCE);
}
ruleStack.addFirst(PushProjects.INSTANCE);
- if (hints.hasCriteria) {
- ruleStack.addFirst(PushSelectCriteria.INSTANCE);
- }
+ ruleStack.addFirst(PushSelectCriteria.INSTANCE);
ruleStack.addFirst(AddAccessNodes.INSTANCE);
ruleStack.addFirst(RightOuterToLeftOuterJoins.INSTANCE);
ruleStack.addFirst(CopyCriteria.INSTANCE);
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/PlanUtil.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/PlanUtil.java 2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/plan/PlanUtil.java 2010-01-08 05:45:17 UTC (rev 1556)
@@ -69,6 +69,7 @@
import org.jboss.dna.graph.query.model.Visitors.AbstractVisitor;
import org.jboss.dna.graph.query.plan.PlanNode.Property;
import org.jboss.dna.graph.query.plan.PlanNode.Type;
+import org.jboss.dna.graph.query.validate.Schemata.Table;
import org.jboss.dna.graph.query.validate.Schemata.View;
/**
@@ -98,13 +99,11 @@
PlanNode planNode ) {
List<Column> columns = null;
PlanNode node = planNode;
- PlanNode projectNode = null;
// First find the columns from the nearest PROJECT ancestor ...
do {
switch (node.getType()) {
case PROJECT:
columns = node.getPropertyAsList(Property.PROJECT_COLUMNS, Column.class);
- projectNode = node;
node = null;
break;
default:
@@ -113,14 +112,12 @@
}
} while (node != null);
- // If the supplied node is a PROJECT, just return the PROJECT node's column list ...
- if (projectNode == planNode) return columns;
-
// Find the names of the selectors ...
Set<SelectorName> names = new HashSet<SelectorName>();
for (PlanNode source : planNode.findAllAtOrBelow(Type.SOURCE)) {
names.add(source.getProperty(Property.SOURCE_NAME, SelectorName.class));
- names.add(source.getProperty(Property.SOURCE_ALIAS, SelectorName.class));
+ SelectorName alias = source.getProperty(Property.SOURCE_ALIAS, SelectorName.class);
+ if (alias != null) names.add(alias);
}
// Add the PROJECT columns first ...
@@ -131,7 +128,7 @@
}
}
- // Now add the columns from the JOIN and SELECT ancestors ...
+ // Now add the columns from the JOIN, SELECT, PROJECT and SORT ancestors ...
node = planNode;
do {
switch (node.getType()) {
@@ -145,9 +142,23 @@
criteria = node.getProperty(Property.SELECT_CRITERIA, Constraint.class);
Visitors.visitAll(criteria, collectionVisitor);
break;
+ case SORT:
+ List<Object> orderBys = node.getPropertyAsList(Property.SORT_ORDER_BY, Object.class);
+ if (orderBys != null && !orderBys.isEmpty()) {
+ if (orderBys.get(0) instanceof Ordering) {
+ for (int i = 0; i != orderBys.size(); ++i) {
+ Ordering ordering = (Ordering)orderBys.get(i);
+ Visitors.visitAll(ordering, collectionVisitor);
+ }
+ }
+ }
+ break;
case PROJECT:
- // Already handled above, but we can stop looking for columns ...
- return collectionVisitor.getRequiredColumns();
+ if (node != planNode) {
+ // Already handled above, but we can stop looking for columns ...
+ return collectionVisitor.getRequiredColumns();
+ }
+ break;
default:
break;
}
@@ -203,16 +214,28 @@
*/
@Override
public void visit( Column column ) {
- requireColumn(column.getSelectorName(), column.getPropertyName());
+ requireColumn(column.getSelectorName(), column.getPropertyName(), column.getColumnName());
}
protected void requireColumn( SelectorName selector,
String propertyName ) {
+ requireColumn(selector, propertyName, null);
+ }
+
+ protected void requireColumn( SelectorName selector,
+ String propertyName,
+ String alias ) {
if (names.contains(selector)) {
// The column is part of the table we're interested in ...
- if (requiredColumnNames.add(propertyName)) {
- String alias = propertyName;
- columns.add(new Column(selector, propertyName, alias));
+ if (alias != null && !alias.equals(propertyName)) {
+ if (requiredColumnNames.add(propertyName) && requiredColumnNames.add(alias)) {
+ columns.add(new Column(selector, propertyName, alias));
+ }
+ } else {
+ if (requiredColumnNames.add(propertyName)) {
+ alias = propertyName;
+ columns.add(new Column(selector, propertyName, alias));
+ }
}
}
}
@@ -558,7 +581,10 @@
}
break;
case ACCESS:
- // Nothing to do here, as the selector names are fixed elsewhere
+ // Add all the selectors used by the subnodes ...
+ for (PlanNode child : node) {
+ node.addSelectors(child.getSelectors());
+ }
break;
case SORT:
// The selector names and Ordering objects needs to be changed ...
@@ -886,6 +912,31 @@
return mapping;
}
+ public static ColumnMapping createMappingForAliased( SelectorName tableAlias,
+ Table table,
+ PlanNode tableSourceNode ) {
+ ColumnMapping mapping = new ColumnMapping(tableAlias);
+
+ // Find the projected columns on the nearest PROJECT ...
+ PlanNode project = tableSourceNode.findAncestor(Type.PROJECT);
+ assert project != null;
+
+ // Get the Columns from the PROJECT in the plan node ...
+ List<Column> projectedColumns = project.getPropertyAsList(Property.PROJECT_COLUMNS, Column.class);
+
+ for (int i = 0; i != projectedColumns.size(); ++i) {
+ Column projectedColumn = projectedColumns.get(i);
+ Column projectedColumnInTable = projectedColumns.get(i).with(table.getName());
+ org.jboss.dna.graph.query.validate.Schemata.Column column = table.getColumn(projectedColumnInTable.getPropertyName());
+ mapping.map(column.getName(), projectedColumnInTable);
+ if (projectedColumn.getColumnName() != null) {
+ // The projected column has an alias, so add a mapping for it, too
+ mapping.map(projectedColumn.getColumnName(), projectedColumnInTable);
+ }
+ }
+ return mapping;
+ }
+
/**
* Defines how the view columns are mapped (or resolved) into the columns from the source tables.
*/
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/validate/Validator.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/validate/Validator.java 2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/query/validate/Validator.java 2010-01-08 05:45:17 UTC (rev 1556)
@@ -49,6 +49,7 @@
import org.jboss.dna.graph.query.model.NodePath;
import org.jboss.dna.graph.query.model.PropertyExistence;
import org.jboss.dna.graph.query.model.PropertyValue;
+import org.jboss.dna.graph.query.model.Query;
import org.jboss.dna.graph.query.model.SameNode;
import org.jboss.dna.graph.query.model.SameNodeJoinCondition;
import org.jboss.dna.graph.query.model.SelectorName;
@@ -66,6 +67,7 @@
private final Problems problems;
private final Map<SelectorName, Table> selectorsByNameOrAlias;
private final Map<SelectorName, Table> selectorsByName;
+ private final Map<String, Schemata.Column> columnsByAlias;
/**
* @param context the query context
@@ -80,6 +82,7 @@
for (Table table : selectorsByName.values()) {
this.selectorsByName.put(table.getName(), table);
}
+ this.columnsByAlias = new HashMap<String, Schemata.Column>();
}
/**
@@ -340,6 +343,28 @@
/**
* {@inheritDoc}
*
+ * @see org.jboss.dna.graph.query.model.Visitors.AbstractVisitor#visit(org.jboss.dna.graph.query.model.Query)
+ */
+ @Override
+ public void visit( Query obj ) {
+ // Collect the map of columns by alias for this query ...
+ this.columnsByAlias.clear();
+ for (Column column : obj.getColumns()) {
+ // Find the schemata column ...
+ Table table = tableWithNameOrAlias(column.getSelectorName());
+ if (table != null) {
+ Schemata.Column tableColumn = table.getColumn(column.getPropertyName());
+ if (tableColumn != null) {
+ this.columnsByAlias.put(column.getColumnName(), tableColumn);
+ }
+ }
+ }
+ super.visit(obj);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
* @see org.jboss.dna.graph.query.model.Visitors.AbstractVisitor#visit(org.jboss.dna.graph.query.model.SameNode)
*/
@Override
@@ -392,7 +417,11 @@
}
Schemata.Column column = table.getColumn(propertyName);
if (column == null) {
- problems.addError(GraphI18n.columnDoesNotExistOnTable, propertyName, selectorName.getName());
+ // Maybe the supplied property name is really an alias ...
+ column = this.columnsByAlias.get(propertyName);
+ if (column == null) {
+ problems.addError(GraphI18n.columnDoesNotExistOnTable, propertyName, selectorName.getName());
+ }
}
return column;
}
Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizerTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizerTest.java 2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/query/optimize/RuleBasedOptimizerTest.java 2010-01-08 05:45:17 UTC (rev 1556)
@@ -74,7 +74,7 @@
private List<Integer> ruleExecutionOrder;
private QueryContext context;
private PlanNode node;
- private final boolean print = false;
+ private boolean print;
@Before
public void beforeEach() {
@@ -124,6 +124,7 @@
ruleStack.addAll(rules);
}
};
+ print = false;
}
// ----------------------------------------------------------------------------------------------------------------
@@ -193,12 +194,11 @@
public void shouldOptimizePlanForSimpleQueryWithSelectStarWithAlias() {
node = optimize("SELECT * FROM t1 AS x1");
// Create the expected plan ...
- PlanNode expected = new PlanNode(Type.ACCESS, selector("x1"));
- PlanNode project = new PlanNode(Type.PROJECT, expected, selector("x1"));
- project.setProperty(Property.PROJECT_COLUMNS, columns(column("x1", "c11"), column("x1", "c12"), column("x1", "c13")));
- PlanNode source = new PlanNode(Type.SOURCE, project, selector("x1"));
+ PlanNode expected = new PlanNode(Type.ACCESS, selector("t1"));
+ PlanNode project = new PlanNode(Type.PROJECT, expected, selector("t1"));
+ project.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11"), column("t1", "c12"), column("t1", "c13")));
+ PlanNode source = new PlanNode(Type.SOURCE, project, selector("t1"));
source.setProperty(Property.SOURCE_NAME, selector("t1"));
- source.setProperty(Property.SOURCE_ALIAS, selector("x1"));
source.setProperty(Property.SOURCE_COLUMNS, context.getSchemata().getTable(selector("t1")).getColumns());
// Compare the expected and actual plan ...
assertThat(node.isSameAs(expected), is(true));
@@ -208,15 +208,14 @@
public void shouldOptimizePlanForSimpleQueryWithSelectStarFromTableWithAliasAndValueCriteria() {
node = optimize("SELECT * FROM t1 AS x1 WHERE c13 < CAST('3' AS LONG)");
// Create the expected plan ...
- PlanNode expected = new PlanNode(Type.ACCESS, selector("x1"));
- PlanNode project = new PlanNode(Type.PROJECT, expected, selector("x1"));
- project.setProperty(Property.PROJECT_COLUMNS, columns(column("x1", "c11"), column("x1", "c12"), column("x1", "c13")));
- PlanNode select = new PlanNode(Type.SELECT, project, selector("x1"));
- select.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("x1"), "c13"), Operator.LESS_THAN,
+ PlanNode expected = new PlanNode(Type.ACCESS, selector("t1"));
+ PlanNode project = new PlanNode(Type.PROJECT, expected, selector("t1"));
+ project.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11"), column("t1", "c12"), column("t1", "c13")));
+ PlanNode select = new PlanNode(Type.SELECT, project, selector("t1"));
+ select.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c13"), Operator.LESS_THAN,
new Literal(3L)));
- PlanNode source = new PlanNode(Type.SOURCE, select, selector("x1"));
+ PlanNode source = new PlanNode(Type.SOURCE, select, selector("t1"));
source.setProperty(Property.SOURCE_NAME, selector("t1"));
- source.setProperty(Property.SOURCE_ALIAS, selector("x1"));
source.setProperty(Property.SOURCE_COLUMNS, context.getSchemata().getTable(selector("t1")).getColumns());
// Compare the expected and actual plan ...
assertThat(node.isSameAs(expected), is(true));
@@ -348,7 +347,7 @@
PlanNode leftAccess = new PlanNode(Type.ACCESS, join, selector("t1"));
PlanNode leftProject = new PlanNode(Type.PROJECT, leftAccess, selector("t1"));
- leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11")));
+ leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11", "c1")));
PlanNode leftSelect1 = new PlanNode(Type.SELECT, leftProject, selector("t1"));
leftSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c11"),
Operator.EQUAL_TO, new Literal('x')));
@@ -451,7 +450,7 @@
PlanNode leftAccess = new PlanNode(Type.ACCESS, join, selector("all"));
PlanNode leftProject = new PlanNode(Type.PROJECT, leftAccess, selector("all"));
- leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("all", "a1"), column("all", "a2")));
+ leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("all", "a1"), column("all", "a2"), column("all", "a3")));
PlanNode leftSelect1 = new PlanNode(Type.SELECT, leftProject, selector("all"));
leftSelect1.setProperty(Property.SELECT_CRITERIA, new SetCriteria(new PropertyValue(selector("all"), "primaryType"),
new Literal("t1"), new Literal("t0")));
@@ -464,7 +463,7 @@
PlanNode rightAccess = new PlanNode(Type.ACCESS, join, selector("all"));
PlanNode rightProject = new PlanNode(Type.PROJECT, rightAccess, selector("all"));
- rightProject.setProperty(Property.PROJECT_COLUMNS, columns(column("all", "a3"), column("all", "a4")));
+ rightProject.setProperty(Property.PROJECT_COLUMNS, columns(column("all", "a3"), column("all", "a4"), column("all", "a2")));
PlanNode rightSelect1 = new PlanNode(Type.SELECT, rightProject, selector("all"));
rightSelect1.setProperty(Property.SELECT_CRITERIA, new SetCriteria(new PropertyValue(selector("all"), "primaryType"),
new Literal("t2"), new Literal("t0")));
@@ -514,7 +513,83 @@
}
@Test
- public void shouldOptimizePlanForQueryWithOrderByClause() {
+ public void shouldOptimizePlanForQueryUsingTableAndOrderByClause() {
+ print = true;
+ node = optimize("SELECT t1.c11 AS c1 FROM t1 WHERE t1.c11 = 'x' AND t1.c12 = 'y' ORDER BY t1.c11, t1.c12 DESC");
+
+ // Create the expected plan ...
+ PlanNode sort = new PlanNode(Type.SORT, selector("t1"));
+ sort.setProperty(Property.SORT_ORDER_BY, orderings(ascending("t1", "c11"), descending("t1", "c12")));
+ PlanNode leftAccess = new PlanNode(Type.ACCESS, sort, selector("t1"));
+ PlanNode leftProject = new PlanNode(Type.PROJECT, leftAccess, selector("t1"));
+ leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11", "c1"), column("t1", "c12")));
+ PlanNode leftSelect1 = new PlanNode(Type.SELECT, leftProject, selector("t1"));
+ leftSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c11"),
+ Operator.EQUAL_TO, new Literal("x")));
+ PlanNode leftSelect2 = new PlanNode(Type.SELECT, leftSelect1, selector("t1"));
+ leftSelect2.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c12"),
+ Operator.EQUAL_TO, new Literal("y")));
+ PlanNode leftSource = new PlanNode(Type.SOURCE, leftSelect2, selector("t1"));
+ leftSource.setProperty(Property.SOURCE_NAME, selector("t1"));
+ leftSource.setProperty(Property.SOURCE_COLUMNS, context.getSchemata().getTable(selector("t1")).getColumns());
+
+ // Compare the expected and actual plan ...
+ assertThat(node.isSameAs(sort), is(true));
+ }
+
+ @Test
+ public void shouldOptimizePlanForQueryUsingTableWithAliasAndOrderByClause() {
+ print = true;
+ node = optimize("SELECT X.c11 AS c1 FROM t1 AS X WHERE X.c11 = 'x' AND X.c12 = 'y' ORDER BY X.c11, X.c12 DESC");
+
+ // Create the expected plan ...
+ PlanNode sort = new PlanNode(Type.SORT, selector("t1"));
+ sort.setProperty(Property.SORT_ORDER_BY, orderings(ascending("t1", "c11"), descending("t1", "c12")));
+ PlanNode leftAccess = new PlanNode(Type.ACCESS, sort, selector("t1"));
+ PlanNode leftProject = new PlanNode(Type.PROJECT, leftAccess, selector("t1"));
+ leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11", "c1"), column("t1", "c12")));
+ PlanNode leftSelect1 = new PlanNode(Type.SELECT, leftProject, selector("t1"));
+ leftSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c11"),
+ Operator.EQUAL_TO, new Literal("x")));
+ PlanNode leftSelect2 = new PlanNode(Type.SELECT, leftSelect1, selector("t1"));
+ leftSelect2.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c12"),
+ Operator.EQUAL_TO, new Literal("y")));
+ PlanNode leftSource = new PlanNode(Type.SOURCE, leftSelect2, selector("t1"));
+ leftSource.setProperty(Property.SOURCE_NAME, selector("t1"));
+ leftSource.setProperty(Property.SOURCE_COLUMNS, context.getSchemata().getTable(selector("t1")).getColumns());
+
+ // Compare the expected and actual plan ...
+ assertThat(node.isSameAs(sort), is(true));
+ }
+
+ @Test
+ public void shouldOptimizePlanForQueryUsingTableWithAliasAndOrderByClauseUsingAliasedColumn() {
+ print = true;
+ node = optimize("SELECT X.c11 AS c1 FROM t1 AS X WHERE X.c11 = 'x' AND X.c12 = 'y' ORDER BY X.c1, X.c12 DESC");
+
+ // Create the expected plan ...
+ PlanNode sort = new PlanNode(Type.SORT, selector("t1"));
+ sort.setProperty(Property.SORT_ORDER_BY, orderings(ascending("t1", "c11"), descending("t1", "c12")));
+ PlanNode leftAccess = new PlanNode(Type.ACCESS, sort, selector("t1"));
+ PlanNode leftProject = new PlanNode(Type.PROJECT, leftAccess, selector("t1"));
+ leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11", "c1"), column("t1", "c12")));
+ PlanNode leftSelect1 = new PlanNode(Type.SELECT, leftProject, selector("t1"));
+ leftSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c11"),
+ Operator.EQUAL_TO, new Literal("x")));
+ PlanNode leftSelect2 = new PlanNode(Type.SELECT, leftSelect1, selector("t1"));
+ leftSelect2.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c12"),
+ Operator.EQUAL_TO, new Literal("y")));
+ PlanNode leftSource = new PlanNode(Type.SOURCE, leftSelect2, selector("t1"));
+ leftSource.setProperty(Property.SOURCE_NAME, selector("t1"));
+ leftSource.setProperty(Property.SOURCE_COLUMNS, context.getSchemata().getTable(selector("t1")).getColumns());
+
+ // Compare the expected and actual plan ...
+ assertThat(node.isSameAs(sort), is(true));
+ }
+
+ @Test
+ public void shouldOptimizePlanForQueryUsingViewAndOrderByClause() {
+ print = true;
node = optimize("SELECT v2.c11 AS c1 FROM v2 WHERE v2.c11 = 'x' AND v2.c12 = 'y' ORDER BY v2.c11, v2.c12 DESC");
// Create the expected plan ...
@@ -529,7 +604,7 @@
PlanNode leftAccess = new PlanNode(Type.ACCESS, join, selector("t1"));
PlanNode leftProject = new PlanNode(Type.PROJECT, leftAccess, selector("t1"));
- leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11")));
+ leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11", "c1")));
PlanNode leftSelect1 = new PlanNode(Type.SELECT, leftProject, selector("t1"));
leftSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c11"),
Operator.EQUAL_TO, new Literal("x")));
@@ -555,6 +630,48 @@
}
@Test
+ public void shouldOptimizePlanForQueryUsingViewWithAliasAndOrderByClause() {
+ print = true;
+ node = optimize("SELECT Q.c11 AS c1 FROM v2 AS Q WHERE Q.c11 = 'x' AND Q.c12 = 'y' ORDER BY Q.c11, Q.c12 DESC");
+
+ // Create the expected plan ...
+ PlanNode sort = new PlanNode(Type.SORT, selector("t1"));
+ sort.setProperty(Property.SORT_ORDER_BY, orderings(ascending("t1", "c11"), descending("t1", "c12")));
+ PlanNode project = new PlanNode(Type.PROJECT, sort, selector("t1"));
+ project.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11", "c1")));
+ PlanNode join = new PlanNode(Type.JOIN, project, selector("t2"), selector("t1"));
+ join.setProperty(Property.JOIN_ALGORITHM, JoinAlgorithm.NESTED_LOOP);
+ join.setProperty(Property.JOIN_TYPE, JoinType.INNER);
+ join.setProperty(Property.JOIN_CONDITION, new EquiJoinCondition(selector("t1"), "c11", selector("t2"), "c21"));
+
+ PlanNode leftAccess = new PlanNode(Type.ACCESS, join, selector("t1"));
+ PlanNode leftProject = new PlanNode(Type.PROJECT, leftAccess, selector("t1"));
+ leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11", "c1")));
+ PlanNode leftSelect1 = new PlanNode(Type.SELECT, leftProject, selector("t1"));
+ leftSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c11"),
+ Operator.EQUAL_TO, new Literal("x")));
+ PlanNode leftSelect2 = new PlanNode(Type.SELECT, leftSelect1, selector("t1"));
+ leftSelect2.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c12"),
+ Operator.EQUAL_TO, new Literal("y")));
+ PlanNode leftSource = new PlanNode(Type.SOURCE, leftSelect2, selector("t1"));
+ leftSource.setProperty(Property.SOURCE_NAME, selector("t1"));
+ leftSource.setProperty(Property.SOURCE_COLUMNS, context.getSchemata().getTable(selector("t1")).getColumns());
+
+ PlanNode rightAccess = new PlanNode(Type.ACCESS, join, selector("t2"));
+ PlanNode rightProject = new PlanNode(Type.PROJECT, rightAccess, selector("t2"));
+ rightProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t2", "c21")));
+ PlanNode rightSelect1 = new PlanNode(Type.SELECT, rightProject, selector("t2"));
+ rightSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t2"), "c21"),
+ Operator.EQUAL_TO, new Literal("x")));
+ PlanNode rightSource = new PlanNode(Type.SOURCE, rightSelect1, selector("t2"));
+ rightSource.setProperty(Property.SOURCE_NAME, selector("t2"));
+ rightSource.setProperty(Property.SOURCE_COLUMNS, context.getSchemata().getTable(selector("t2")).getColumns());
+
+ // Compare the expected and actual plan ...
+ assertThat(node.isSameAs(sort), is(true));
+ }
+
+ @Test
public void shouldOptimizePlanForQueryWithOrderByClauseThatUsesScoreFunction() {
node = optimize("SELECT v2.c11 AS c1 FROM v2 WHERE v2.c11 = 'x' AND v2.c12 = 'y' ORDER BY SCORE(v2) ASC");
@@ -570,7 +687,7 @@
PlanNode leftAccess = new PlanNode(Type.ACCESS, join, selector("t1"));
PlanNode leftProject = new PlanNode(Type.PROJECT, leftAccess, selector("t1"));
- leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11")));
+ leftProject.setProperty(Property.PROJECT_COLUMNS, columns(column("t1", "c11", "c1")));
PlanNode leftSelect1 = new PlanNode(Type.SELECT, leftProject, selector("t1"));
leftSelect1.setProperty(Property.SELECT_CRITERIA, new Comparison(new PropertyValue(selector("t1"), "c11"),
Operator.EQUAL_TO, new Literal("x")));
@@ -656,9 +773,9 @@
PlanNode optimized = new RuleBasedOptimizer().optimize(context, plan);
assertThat("Problems optimizing query: " + sql + "\n" + problems, problems.hasErrors(), is(false));
if (print) {
- System.out.println();
System.out.println(sql);
System.out.println(optimized);
+ System.out.println();
}
return optimized;
}
Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java 2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryQueryManager.java 2010-01-08 05:45:17 UTC (rev 1556)
@@ -494,7 +494,8 @@
msg,
accessNode.getString(),
accessRequest.workspace(),
- sourceName);
+ sourceName,
+ accessRequest.getError().getLocalizedMessage());
return emptyTuples();
}
return accessRequest.getTuples();
Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslator.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslator.java 2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslator.java 2010-01-08 05:45:17 UTC (rev 1556)
@@ -24,9 +24,11 @@
package org.jboss.dna.jcr.xpath;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -157,12 +159,16 @@
AxisStep axis = (AxisStep)step;
NodeTest nodeTest = axis.getNodeTest();
if (nodeTest instanceof NameTest) {
- NameTest nameTest = (NameTest)nodeTest;
- if (!nameTest.isWildcard()) {
+ if (appliesToPathConstraint(axis.getPredicates())) {
+ // Everything in this axis/step applies to the path, so add it and we'll translate it below ...
path.add(step);
- }
- if (!appliesToPathConstraint(axis.getPredicates())) {
- // The constraints are more complicated, so we need to define a new source/table ...
+ } else {
+ // The constraints are more complicated than can be applied to the path ...
+ // if (!nameTest.isWildcard()) {
+ // There is a non-wildcard name test that we still need to add to the path ...
+ path.add(step);
+ // }
+ // We need to define a new source/table ...
tableName = translateSource(tableName, path, where);
translatePredicates(axis.getPredicates(), tableName, where);
path.clear();
@@ -464,6 +470,9 @@
// This adds the criteria that the attribute exists, and adds it to the select ...
AttributeNameTest attribute = (AttributeNameTest)predicate;
String propertyName = nameFrom(attribute.getNameTest());
+ // There is nothing in the JCR 1.0 spec that says that a property constrain implies it should be included in the
+ // result columns
+ // builder.select(tableName + "." + propertyName);
where.hasProperty(tableName, propertyName);
} else if (predicate instanceof NameTest) {
// This adds the criteria that the child node exists ...
@@ -679,17 +688,28 @@
protected boolean translatePathExpressionConstraint( PathExpression pathExrp,
ConstraintBuilder where,
String tableName ) {
- String[] paths = relativePathLikeExpressions(pathExrp);
- if (paths == null || paths.length == 0) return false;
+ RelativePathLikeExpressions expressions = relativePathLikeExpressions(pathExrp);
+ if (expressions.isEmpty()) return false;
where = where.openParen();
boolean first = true;
int number = 0;
- for (String path : paths) {
- if (path == null || path.length() == 0 || path.equals("%/")) continue;
+ for (String path : expressions) {
+ if (path == null || path.length() == 0 || path.equals("%/") || path.equals("%/%") || path.equals("%//%")) continue;
if (first) first = false;
else where.or();
if (path.indexOf('%') != -1) {
where.path(tableName).isLike(path);
+ switch (expressions.depthMode) {
+ case AT_LEAST:
+ where.and().depth(tableName).isGreaterThanOrEqualTo().cast(expressions.depth).asLong();
+ break;
+ case EXACT:
+ where.and().depth(tableName).isEqualTo().cast(expressions.depth).asLong();
+ break;
+ case DEFAULT:
+ // don't have to add the DEPTH criteria ...
+ break;
+ }
} else {
where.path(tableName).isEqualTo(path);
}
@@ -699,19 +719,59 @@
return true;
}
- protected String[] relativePathLikeExpressions( PathExpression pathExpression ) {
+ protected static enum DepthMode {
+ DEFAULT,
+ EXACT,
+ AT_LEAST;
+ }
+
+ protected static class RelativePathLikeExpressions implements Iterable<String> {
+ protected final List<String> paths;
+ protected final int depth;
+ protected final DepthMode depthMode;
+
+ protected RelativePathLikeExpressions() {
+ this.paths = null;
+ this.depth = 0;
+ this.depthMode = DepthMode.DEFAULT;
+ }
+
+ protected RelativePathLikeExpressions( String[] paths,
+ int depth,
+ DepthMode depthMode ) {
+ this.paths = Arrays.asList(paths);
+ this.depth = depth;
+ this.depthMode = depthMode;
+ }
+
+ protected boolean isEmpty() {
+ return paths == null || paths.isEmpty();
+ }
+
+ public Iterator<String> iterator() {
+ return paths.iterator();
+ }
+ }
+
+ protected RelativePathLikeExpressions relativePathLikeExpressions( PathExpression pathExpression ) {
List<StepExpression> steps = pathExpression.getSteps();
- if (steps.isEmpty()) return new String[] {};
- if (steps.size() == 1 && steps.get(0) instanceof DescendantOrSelf) return new String[] {};
+ if (steps.isEmpty()) return new RelativePathLikeExpressions();
+ if (steps.size() == 1 && steps.get(0) instanceof DescendantOrSelf) return new RelativePathLikeExpressions();
PathLikeBuilder builder = new SinglePathLikeBuilder();
- for (StepExpression step : steps) {
+ int depth = 0;
+ DepthMode depthMode = DepthMode.EXACT;
+ for (Iterator<StepExpression> iterator = steps.iterator(); iterator.hasNext();) {
+ StepExpression step = iterator.next();
if (step instanceof DescendantOrSelf) {
+ ++depth;
+ depthMode = DepthMode.DEFAULT;
if (builder.isEmpty()) {
builder.append("%/");
} else {
builder = new DualPathLikeBuilder(builder.clone(), builder.append("/%"));
}
} else if (step instanceof AxisStep) {
+ ++depth;
AxisStep axis = (AxisStep)step;
NodeTest nodeTest = axis.getNodeTest();
assert !(nodeTest instanceof ElementTest);
@@ -764,7 +824,7 @@
}
}
}
- return builder.getPaths();
+ return new RelativePathLikeExpressions(builder.getPaths(), depth, depthMode);
}
protected static interface PathLikeBuilder {
Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java 2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrQueryManagerTest.java 2010-01-08 05:45:17 UTC (rev 1556)
@@ -42,6 +42,7 @@
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import javax.jcr.query.Query;
+import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
import org.jboss.dna.graph.property.Name;
@@ -130,9 +131,9 @@
// Create a branch that contains some same-name-siblings ...
Node other = session.getRootNode().addNode("Other", "nt:unstructured");
- other.addNode("NodeA", "nt:unstructured");
- other.addNode("NodeA", "nt:unstructured");
- other.addNode("NodeA", "nt:unstructured");
+ other.addNode("NodeA", "nt:unstructured").setProperty("something", "value3");
+ other.addNode("NodeA", "nt:unstructured").setProperty("something", "value2");
+ other.addNode("NodeA", "nt:unstructured").setProperty("something", "value1");
session.save();
// Prime creating a first XPath query and SQL query ...
@@ -258,8 +259,12 @@
@Test
public void shouldBeAbleToCreateXPathQuery() throws RepositoryException {
- Query query = session.getWorkspace().getQueryManager().createQuery("//element(*,nt:unstructured)", Query.XPATH);
+ Query query = session.getWorkspace().getQueryManager().createQuery("//element(*,car:Car)", Query.XPATH);
assertThat(query, is(notNullValue()));
+ assertResults(query, query.execute(), 12);
+
+ query = session.getWorkspace().getQueryManager().createQuery("//element(*,nt:unstructured)", Query.XPATH);
+ assertThat(query, is(notNullValue()));
assertResults(query, query.execute(), 21);
}
@@ -284,18 +289,91 @@
@Test
public void shouldBeAbleToExecuteXPathQueryToFindAllUnstructuredNodesOrderedByPropertyValue() throws RepositoryException {
+ QueryManager manager = session.getWorkspace().getQueryManager();
+ Query query = manager.createQuery("//element(*,nt:unstructured) order by @jcr:primaryType", Query.XPATH);
+ assertThat(query, is(notNullValue()));
+ QueryResult result = query.execute();
+ print = true;
+ assertResults(query, result, 21);
+ assertThat(result, is(notNullValue()));
+ assertResultsHaveColumns(result, "jcr:primaryType", "jcr:path", "jcr:score");
+
+ query = manager.createQuery("//element(*,car:Car) order by @car:year", Query.XPATH);
+ assertThat(query, is(notNullValue()));
+ result = query.execute();
+ print = true;
+ assertResults(query, result, 12);
+ assertThat(result, is(notNullValue()));
+ assertResultsHaveColumns(result, "car:year", "jcr:path", "jcr:score");
+ }
+
+ @Test
+ public void shouldBeAbleToExecuteXPathQueryToFindNodesUnderNode() throws RepositoryException {
+ Query query = session.getWorkspace().getQueryManager().createQuery(" /jcr:root/Cars/Hybrid/*", Query.XPATH);
+ assertThat(query, is(notNullValue()));
+ QueryResult result = query.execute();
+ print = true;
+ assertResults(query, result, 3);
+ assertThat(result, is(notNullValue()));
+ assertResultsHaveColumns(result, "jcr:primaryType", "jcr:path", "jcr:score");
+ }
+
+ @Test
+ public void shouldBeAbleToExecuteXPathQueryToFindNodesUnderNodeAndWithProperty() throws RepositoryException {
+ Query query = session.getWorkspace().getQueryManager().createQuery(" /jcr:root/Cars/Hybrid/*[@car:year]", Query.XPATH);
+ assertThat(query, is(notNullValue()));
+ QueryResult result = query.execute();
+ assertResults(query, result, 3);
+ assertThat(result, is(notNullValue()));
+ assertResultsHaveColumns(result, "jcr:primaryType", "jcr:path", "jcr:score");
+ }
+
+ @Test
+ public void shouldBeAbleToExecuteXPathQueryToFindNodesUnderNodeAndWithPropertyOrderedByProperty() throws RepositoryException {
Query query = session.getWorkspace()
.getQueryManager()
- .createQuery("//element(*,nt:unstructured) order by @jcr:primaryType", Query.XPATH);
+ .createQuery(" /jcr:root/Cars/Hybrid/*[@car:year] order by @car:year ascending", Query.XPATH);
assertThat(query, is(notNullValue()));
QueryResult result = query.execute();
+ assertResults(query, result, 3);
+ assertThat(result, is(notNullValue()));
+ assertResultsHaveColumns(result, "car:year", "jcr:path", "jcr:score");
+ }
+
+ @Test
+ public void shouldBeAbleToExecuteXPathQueryToFindNodesUnderPath() throws RepositoryException {
+ Query query = session.getWorkspace().getQueryManager().createQuery(" /jcr:root/Cars//*", Query.XPATH);
+ assertThat(query, is(notNullValue()));
+ QueryResult result = query.execute();
print = true;
- assertResults(query, result, 21);
+ assertResults(query, result, 16);
assertThat(result, is(notNullValue()));
assertResultsHaveColumns(result, "jcr:primaryType", "jcr:path", "jcr:score");
}
@Test
+ public void shouldBeAbleToExecuteXPathQueryToFindNodesUnderPathAndWithProperty() throws RepositoryException {
+ Query query = session.getWorkspace().getQueryManager().createQuery(" /jcr:root/Cars//*[@car:year]", Query.XPATH);
+ assertThat(query, is(notNullValue()));
+ QueryResult result = query.execute();
+ assertResults(query, result, 16);
+ assertThat(result, is(notNullValue()));
+ assertResultsHaveColumns(result, "jcr:primaryType", "jcr:path", "jcr:score");
+ }
+
+ @Test
+ public void shouldBeAbleToExecuteXPathQueryToFindNodesUnderPathAndWithPropertyOrderedByProperty() throws RepositoryException {
+ Query query = session.getWorkspace()
+ .getQueryManager()
+ .createQuery(" /jcr:root/Cars//*[@car:year] order by @car:year ascending", Query.XPATH);
+ assertThat(query, is(notNullValue()));
+ QueryResult result = query.execute();
+ assertResults(query, result, 16);
+ assertThat(result, is(notNullValue()));
+ assertResultsHaveColumns(result, "car:year", "jcr:path", "jcr:score");
+ }
+
+ @Test
public void shouldBeAbleToExecuteXPathQueryToFindAllUnstructuredNodesOrderedByScore() throws RepositoryException {
Query query = session.getWorkspace().getQueryManager().createQuery("//element(*,nt:unstructured) order by jcr:score()",
Query.XPATH);
Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathParserTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathParserTest.java 2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathParserTest.java 2010-01-08 05:45:17 UTC (rev 1556)
@@ -189,6 +189,23 @@
literal("3")))));
}
+ @Test
+ public void shouldParsePathExpressionWithNameTestsAndWildcard() {
+ assertThat(parser.parsePathExpr(tokenize("/jcr:root/a/b/*")), is(pathExpr(axisStep(nameTest("jcr", "root")),
+ axisStep(nameTest("a")),
+ axisStep(nameTest("b")),
+ axisStep(wildcard()))));
+ }
+
+ @Test
+ public void shouldParsePathExpressionWithNameTestsAndWildcardAndPropertyExistence() {
+ assertThat(parser.parsePathExpr(tokenize("/jcr:root/a/b/*[@prop]")),
+ is(pathExpr(axisStep(nameTest("jcr", "root")),
+ axisStep(nameTest("a")),
+ axisStep(nameTest("b")),
+ axisStep(wildcard(), attributeNameTest(nameTest("prop"))))));
+ }
+
// ----------------------------------------------------------------------------------------------------------------
// Relative path expression
// ----------------------------------------------------------------------------------------------------------------
Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslatorTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslatorTest.java 2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/xpath/XPathToQueryTranslatorTest.java 2010-01-08 05:45:17 UTC (rev 1556)
@@ -112,6 +112,18 @@
}
@Test
+ public void shouldTranslateFromXPathUsingNameTestsAndWildcardWithNoPredicates() {
+ assertThat(xpath("/jcr:root/testroot/*"),
+ isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ as nodeSet1 WHERE PATH(nodeSet1) LIKE '/testroot/%' AND DEPTH(nodeSet1) = CAST(2 AS LONG)"));
+ }
+
+ @Test
+ public void shouldTranslateFromXPathUsingNameTestsAndWildcardWithPredicates() {
+ assertThat(xpath("/jcr:root/testroot/*[@prop1]"),
+ isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ as nodeSet1 WHERE (PATH(nodeSet1) LIKE '/testroot/%' AND DEPTH(nodeSet1) = CAST(2 AS LONG)) AND nodeSet1.prop1 IS NOT NULL"));
+ }
+
+ @Test
public void shouldTranslateFromXPathContainingPathWithDescendantOrSelf() {
assertThat(xpath("/jcr:root/a/b//c"),
isSql("SELECT nodeSet1.[jcr:primaryType] FROM __ALLNODES__ AS nodeSet1 WHERE PATH(nodeSet1) = '/a/b/c' OR PATH(nodeSet1) LIKE '/a/b/%/c'"));
@@ -272,11 +284,15 @@
}
@Test
- public void shouldTranslateFromXPathUsingOrderBy() {
+ public void shouldTranslateFromXPathUsingElementWildcardAndOrderBy() {
assertThat(xpath("//element(*,*) order by @title"),
isSql("SELECT nodeSet1.title FROM __ALLNODES__ AS nodeSet1 ORDER BY nodeSet1.title"));
+ }
+
+ @Test
+ public void shouldTranslateFromXPathUsingNameTestsAndWildcardOrderBy() {
assertThat(xpath("/jcr:root/testroot/*[@prop1] order by @prop1 ascending"),
- isSql("SELECT nodeSet1.prop1 FROM __ALLNODES__ as nodeSet1 WHERE PATH(nodeSet1) = '/testroot' AND nodeSet1.prop1 IS NOT NULL ORDER BY nodeSet1.prop1"));
+ isSql("SELECT nodeSet1.prop1 FROM __ALLNODES__ as nodeSet1 WHERE (PATH(nodeSet1) LIKE '/testroot/%' AND DEPTH(nodeSet1) = CAST(2 AS LONG)) AND nodeSet1.prop1 IS NOT NULL ORDER BY nodeSet1.prop1"));
}
@Test
Modified: trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java
===================================================================
--- trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java 2010-01-07 22:24:56 UTC (rev 1555)
+++ trunk/extensions/dna-search-lucene/src/main/java/org/jboss/dna/search/lucene/LuceneSearchSession.java 2010-01-08 05:45:17 UTC (rev 1556)
@@ -441,8 +441,8 @@
for (Object value : property) {
if (value == null) continue;
stringValue = processor.stringFactory.create(value);
- // Add a separate field for each property value ...
- doc.add(new Field(nameString, stringValue, rule.getStoreOption(), rule.getIndexOption()));
+ // Add a separate field for each property value in exact form (not analyzed) ...
+ doc.add(new Field(nameString, stringValue, rule.getStoreOption(), Field.Index.NOT_ANALYZED));
if (rule.getIndexOption() != Field.Index.NO) {
// This field is to be full-text searchable ...
@@ -463,6 +463,7 @@
if (fullTextSearchValue != null && fullTextSearchValue.length() != 0) {
doc.add(new Field(ContentIndex.FULL_TEXT, fullTextSearchValue.toString(), Field.Store.NO, Field.Index.ANALYZED));
}
+ // System.out.println("Replaced " + doc);
getContentWriter().updateDocument(new Term(ContentIndex.PATH, pathStr), doc);
}
@@ -883,6 +884,22 @@
return new MatchNoneQuery();
}
+ protected String likeExpresionForWildcardPath( String path ) {
+ if (path.equals("/") || path.equals("%")) return path;
+ StringBuilder sb = new StringBuilder();
+ for (String segment : path.split("/")) {
+ if (segment.length() == 0) continue;
+ sb.append("/");
+ sb.append(segment);
+ if (segment.equals("%") || segment.equals("_")) continue;
+ if (!segment.endsWith("]")) {
+ sb.append("[1]");
+ }
+ }
+ if (path.endsWith("/")) sb.append("/");
+ return sb.toString();
+ }
+
public Query findNodesWith( NodePath nodePath,
Operator operator,
Object value,
@@ -897,6 +914,7 @@
return new NotQuery(findNodeAt(pathValue));
case LIKE:
String likeExpression = processor.stringFactory.create(value);
+ likeExpression = likeExpresionForWildcardPath(likeExpression);
query = findNodesLike(ContentIndex.PATH, likeExpression, caseSensitive);
break;
case GREATER_THAN:
15 years, 11 months
DNA SVN: r1555 - in trunk/docs/reference/src/main/docbook/en-US/content: jcr and 1 other directory.
by dna-commits@lists.jboss.org
Author: elvisisking
Date: 2010-01-07 17:24:56 -0500 (Thu, 07 Jan 2010)
New Revision: 1555
Modified:
trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml
Log:
DNA-629 Document The REST Client API In The Reference Guide: Added new section and modified introduction. Reviewed by Brian C.
Modified: trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml 2010-01-07 19:12:33 UTC (rev 1554)
+++ trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml 2010-01-07 22:24:56 UTC (rev 1555)
@@ -519,6 +519,14 @@
can be consulted as a template for how to deploy the RESTful services in a custom implementation.
</para>
</listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong">dna-web-jcr-rest-client</emphasis>
+ is an API that uses POJOs to access the REST web service. This API eliminates the need for applications to know how
+ to create HTTP request URLs and payloads, and how to parse the JSON responses. It can be used to publish (upload)
+ and unpublish (delete) files from DNA repositories.
+ </para>
+ </listitem>
</itemizedlist>
There are also documentation modules (located in the source under the
<code>docs/</code>
Modified: trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml 2010-01-07 19:12:33 UTC (rev 1554)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml 2010-01-07 22:24:56 UTC (rev 1555)
@@ -578,5 +578,66 @@
repository should shutdown and clean up any resources that are in use.
</para>
</sect1>
+
+ <sect1 id="dna_rest_client_api">
+ <title>DNA REST Client API</title>
+ <para>
+ The DNA REST Client API provides a POJO way of using the DNA REST web service to publish (upload) and
+ unpublish (delete) files from DNA repositories. Java objects open the HTTP connection, create the HTTP request URLs,
+ attach the payload associated with <code>PUT</code> and <code>POST</code> requests, parse the HTTP JSON response back
+ into Java objects, and close the HTTP connection.
+ </para>
+ <para>
+ Here are the Java business objects you will need (all found in the <code>org.jboss.dna.web.jcr.rest.client.domain</code>
+ package):
+
+ <itemizedlist>
+ <listitem>
+ <para><code>Server</code> - hosts one or more DNA JCR repositories,</para>
+ </listitem>
+ <listitem>
+ <para><code>Repository</code> - a DNA JCR repository containing one or more workspaces, and</para>
+ </listitem>
+ <listitem>
+ <para><code>Workspace</code> - a DNA JCR repository workspace.</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ Along with the POJOs above, an <code>org.jboss.dna.web.jcr.rest.client.IRestClient</code> is needed. The
+ <code>IRestClient</code> is responsible for executing the publishing and unpublishing operations. You can also use the
+ <code>IRestClient</code> to find out what repositories and workspaces are available on a DNA server.
+
+ <note>
+ <para>
+ The only implementation of <code>IRestClient</code> is <code>JsonRestClient</code> as JSON-encoded responses are
+ all that are currently available.
+ </para>
+ </note>
+
+ Here's a code snippet that publishes (uploads) a file:
+
+ <programlisting><![CDATA[
+// Setup POJOs
+Server server = new Server("http://localhost:8080", "username", "password");
+Repository repository = new Repository("repositoryName", server);
+Workspace workspace = new Workspace("workspaceName", repository);
+
+// Publish
+File file = new File("/path/to/file");
+IRestClient restClient = new JsonRestClient();
+Status status = restClient.publish(workspace, "/workspace/path/", file);
+
+if (status.isError() {
+ // Handle error here
+}
+ ]]></programlisting>
+ </para>
+ <para>
+ Results of successfully executing the above code is a JCR folder node (<code>nt:folder</code>) for each segment of the
+ workspace path (a node is created if it doesn't already exist). Also, a JCR file node (a node with primary type <code>nt:file</code>) is
+ created or updated under the last folder node and the file contents are encoded and uploaded into a child node of that file node.
+ </para>
+ </sect1>
</chapter>
15 years, 11 months
DNA SVN: r1554 - in trunk: dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby and 7 other directories.
by dna-commits@lists.jboss.org
Author: blafond
Date: 2010-01-07 14:12:33 -0500 (Thu, 07 Jan 2010)
New Revision: 1554
Added:
trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/alter_table_statements.ddl
Modified:
trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java
trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java
trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdlSequencerIntegrationTest.java
trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdlSequencerIntegrationTest.java
trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd
trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/datatype/DataTypeParser.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java
trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/schema_definition.ddl
Log:
DNA-49 Beefed up integration tests. Added parsing methods for Domain, Collation, etc.. Misc. fixes/tweaks.
Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java 2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlIntegrationTestUtil.java 2010-01-07 19:12:33 UTC (rev 1554)
@@ -23,6 +23,7 @@
*/
package org.jboss.dna.test.integration.sequencer.ddl;
+import static org.junit.Assert.assertNotNull;
import java.io.IOException;
import java.net.URL;
import java.util.Calendar;
@@ -53,7 +54,17 @@
public JcrTools tools;
public static final String ddlTestResourceRootFolder = "org/jboss/dna/test/integration/sequencer/ddl/";
+ protected URL getUrl(String urlStr) {
+ return this.getClass().getClassLoader().getResource(urlStr);
+ }
+ public void uploadFile(String folder, String fileName, String testMethod) throws RepositoryException, IOException {
+ printStart(fileName, testMethod);
+
+ URL url = getUrl(folder + fileName);
+ uploadFile(url);
+ }
+
public void uploadFile(URL url) throws RepositoryException, IOException {
// Grab the last segment of the URL path, using it as the filename
String filename = url.getPath().replaceAll("([^/]*/)*", "");
@@ -316,6 +327,29 @@
return null;
}
+ public Node assertNode(Node node, String name, String type) throws Exception {
+ Node existingNode = findNode(node, name, type);
+ assertNotNull(node);
+
+ return existingNode;
+ }
+
+ public void printPropertiesRecursive( Node node ) throws RepositoryException, PathNotFoundException, ValueFormatException {
+ printProperties(node);
+
+ for (NodeIterator iter = node.getNodes(); iter.hasNext();) {
+ printPropertiesRecursive(iter.nextNode());
+ }
+
+ }
+
+ public void printChildProperties( Node node ) throws RepositoryException, PathNotFoundException, ValueFormatException {
+ for (NodeIterator iter = node.getNodes(); iter.hasNext();) {
+ printProperties(iter.nextNode());
+ }
+
+ }
+
public void printProperties( Node node ) throws RepositoryException, PathNotFoundException, ValueFormatException {
System.out.println("\n >>> NODE PATH: " + node.getPath() );
@@ -345,4 +379,12 @@
//props.put(name, stringValue);
}
}
+
+ public void printStart(String fileName, String testMethod) {
+ System.out.println("STARTED: " + testMethod + "(" + fileName +")");
+ }
+
+ public void printEnd(String fileName, String testMethod) {
+ System.out.println("ENDED: " + testMethod + "(" + fileName +")");
+ }
}
Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java 2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/DdlSequencerIntegrationTest.java 2010-01-07 19:12:33 UTC (rev 1554)
@@ -24,8 +24,6 @@
package org.jboss.dna.test.integration.sequencer.ddl;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import java.net.URL;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
@@ -85,9 +83,6 @@
}
- private URL getUrl(String urlStr) {
- return this.getClass().getClassLoader().getResource(urlStr);
- }
@After
public void afterEach() throws Exception {
@@ -101,9 +96,8 @@
@Test
public void shouldSequenceCreateSchemaDdlFile() throws Exception {
- System.out.println("STARTED: shouldSequenceCreateSchemaDdlFile(create_schema.ddl)");
- URL url = getUrl(ddlTestResourceRootFolder + "create_schema.ddl");
- uploadFile(url);
+
+ uploadFile(ddlTestResourceRootFolder, "create_schema.ddl", "shouldSequenceCreateSchemaDdlFile");
waitUntilSequencedNodesIs(1);
@@ -126,15 +120,12 @@
}
}
- System.out.println("FINISHED: shouldSequenceCreateSchemaDdlFile(create_schema.ddl)");
}
@Test
public void shouldSequenceStandardDdlFile() throws Exception {
- System.out.println("STARTED: shouldSequenceStandardDdlFile(standard_test_statements.ddl)");
- URL url = getUrl(ddlTestResourceRootFolder + "standard_test_statements.ddl");
- uploadFile(url);
-
+ uploadFile(ddlTestResourceRootFolder, "standard_test_statements.ddl", "shouldSequenceStandardDdlFile");
+
waitUntilSequencedNodesIs(1);
// Find the node ...
@@ -147,22 +138,70 @@
for (NodeIterator iter = ddlsNode.getNodes(); iter.hasNext();) {
Node ddlNode = iter.nextNode();
- //printNodeProperties(ddlNode);
+ //printPropertiesRecursive(ddlNode);
+ // printChildProperties(ddlNode.getNodes().nextNode());
+
long numStatements = ddlNode.getNodes().nextNode().getNodes().getSize();
- assertEquals(numStatements, 7);
+ assertEquals(44, numStatements);
+
+
+ // assertNotNull <ns001:startLineNumber = 40, jcr:primaryType = nt:unstructured, ns001:startColumnNumber = 1, jcr:mixinTypes = ns001:createAssertionStatement, ns001:expression = CREATE ASSERTION assertNotNull CHECK (value != null) NOT DEFERRABLE, ns001:startCharIndex = 1400, ns001:searchCondition = value ! = null>
+ // CONSTRAINT_ATTRIBUTE <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:constraintAttribute, ns001:propValue = NOT DEFERRABLE>
+ // assertIsZero <ns001:startLineNumber = 42, jcr:primaryType = nt:unstructured, ns001:startColumnNumber = 1, jcr:mixinTypes = ns001:createAssertionStatement, ns001:expression = CREATE ASSERTION assertIsZero CHECK (value != null and value == 0) INITIALLY DEFERRED, ns001:startCharIndex = 1469, ns001:searchCondition = value ! = null and value = = 0>
+ // CONSTRAINT_ATTRIBUTE <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:constraintAttribute, ns001:propValue = INITIALLY DEFERRED>
+ Node stmtNode = assertNode(ddlNode, "assertNotNull", "ddl:createAssertionStatement");
+ Node constraintAttribute = assertNode(stmtNode, "CONSTRAINT_ATTRIBUTE", "ddl:constraintAttribute");
+ verifySingleValueProperty(constraintAttribute, "ddl:propValue", "NOT DEFERRABLE");
+
+ stmtNode = assertNode(ddlNode, "assertIsZero", "ddl:createAssertionStatement");
+ constraintAttribute = assertNode(stmtNode, "CONSTRAINT_ATTRIBUTE", "ddl:constraintAttribute");
+ verifySingleValueProperty(constraintAttribute, "ddl:propValue", "INITIALLY DEFERRED");
+ // employee <ns001:startLineNumber = 40, jcr:primaryType = nt:unstructured, ns001:startColumnNumber = 1, jcr:mixinTypes = ns001:createTableStatement, ns001:expression = CREATE TABLE employee (
+ // empno NUMBER(4) NOT NULL,
+ // empname CHAR(10),
+ // job CHAR(9),
+ // deptno NUMBER(2) NOT NULL,
+ // CONSTRAINT emp_fk1 FOREIGN KEY (deptno) REFERENCES dept (deptno) INITIALLY IMMEDIATE,
+ // CONSTRAINT emp_pk PRIMARY KEY (empno));, ns001:startCharIndex = 1404>
+ // empno <ns001:datatypeName = NUMBER, jcr:primaryType = nt:unstructured, ns001:datatypePrecision = 4, ns001:nullable = NOT NULL, jcr:mixinTypes = ns001:columnDefinition, ns001:datatypeScale = 0>
+ // empname <ns001:datatypeName = CHAR, ns001:datatypeLength = 10, jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:columnDefinition>
+ // job <ns001:datatypeName = CHAR, ns001:datatypeLength = 9, jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:columnDefinition>
+ // deptno <ns001:datatypeName = NUMBER, jcr:primaryType = nt:unstructured, ns001:datatypePrecision = 2, ns001:nullable = NOT NULL, jcr:mixinTypes = ns001:columnDefinition, ns001:datatypeScale = 0>
+ // emp_fk1 <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:tableConstraint, ns001:constraintType = 1>
+ // deptno <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:columnReference>
+ // dept <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:tableReference>
+ // deptno <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:fkColumnReference>
+ // CONSTRAINT_ATTRIBUTE <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:constraintAttribute, ns001:propValue = INITIALLY IMMEDIATE>
+ // emp_pk <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:tableConstraint, ns001:constraintType = 2>
+ // empno <jcr:primaryType = nt:unstructured, jcr:mixinTypes = ns001:columnReference>
+
+ Node tbleNode = assertNode(ddlNode, "employee", "ddl:createTableStatement");
+ Node columnNode = assertNode(ddlNode, "empname", "ddl:columnDefinition");
+ verifySingleValueProperty(columnNode, "ddl:datatypeName", "CHAR");
+ verifySingleValueProperty(columnNode, "ddl:datatypeLength", 10);
+ Node constraintNode = assertNode(tbleNode, "emp_fk1", "ddl:tableConstraint");
+ constraintAttribute = assertNode(constraintNode, "CONSTRAINT_ATTRIBUTE", "ddl:constraintAttribute");
+ verifySingleValueProperty(constraintAttribute, "ddl:propValue", "INITIALLY IMMEDIATE");
+ assertNode(constraintNode, "deptno", "ddl:columnReference");
+ assertNode(constraintNode, "dept", "ddl:tableReference");
+ assertNode(constraintNode, "deptno", "ddl:fkColumnReference");
+
+ Node viewNode = assertNode(ddlNode, "view_1", "ddl:createViewStatement");
+ assertNode(viewNode, "col1", "ddl:columnReference");
+
+ Node tableNode = assertNode(ddlNode, "table_5", "ddl:createTableStatement");
+ printChildProperties(tableNode);
+ assertEquals(18, tableNode.getNodes().getSize());
}
}
}
-
- System.out.println("FINISHED: shouldSequenceStandardDdlFile(standard_test_statements.ddl)");
}
@Test
public void shouldSequenceStandardDdlGrantStatements() throws Exception {
- System.out.println("STARTED: shouldSequenceStandardDdlGrantStatements(grant_test_statements.ddl)");
- URL url = getUrl(ddlTestResourceRootFolder + "grant_test_statements.ddl");
- uploadFile(url);
+
+ uploadFile(ddlTestResourceRootFolder, "grant_test_statements.ddl", "shouldSequenceStandardDdlGrantStatements");
waitUntilSequencedNodesIs(1);
@@ -182,35 +221,27 @@
assertEquals(numStatements, 4);
//GRANT SELECT ON TABLE purchaseOrders TO maria,harry;
- Node grantNode = findNode(ddlNode, "purchaseOrders", "ddl:grantOnTableStatement");
- assertNotNull(grantNode);
- Node granteeNode = findNode(grantNode, "maria", "ddl:grantee");
- assertNotNull(granteeNode);
- Node privNode = findNode(grantNode, "privilege", "ddl:grantPrivilege");
- assertNotNull(privNode);
+ Node grantNode = assertNode(ddlNode, "purchaseOrders", "ddl:grantOnTableStatement");
+ assertNode(grantNode, "maria", "ddl:grantee");
+ Node privNode = assertNode(grantNode, "privilege", "ddl:grantPrivilege");
verifySingleValueProperty(privNode, "ddl:type", "SELECT");
//GRANT UPDATE, USAGE ON TABLE purchaseOrders FROM anita,zhi;
- grantNode = findNode(ddlNode, "billedOrders", "ddl:grantOnTableStatement");
- assertNotNull(grantNode);
- privNode = findNode(grantNode, "privilege", "ddl:grantPrivilege");
- assertNotNull(privNode);
+ grantNode = assertNode(ddlNode, "billedOrders", "ddl:grantOnTableStatement");
+ privNode = assertNode(grantNode, "privilege", "ddl:grantPrivilege");
verifySingleValueProperty(privNode, "ddl:type", "UPDATE");
- granteeNode = findNode(grantNode, "anita", "ddl:grantee");
- assertNotNull(granteeNode);
+ assertNode(grantNode, "anita", "ddl:grantee");
}
}
}
-
- System.out.println("FINISHED: shouldSequenceStandardDdlGrantStatements(grant_test_statements.ddl)");
+
}
@Test
public void shouldSequenceStandardDdlRevokeStatements() throws Exception {
- System.out.println("STARTED: shouldSequenceStandardDdlRevokeStatements(revoke_test_statements.ddl)");
- URL url = getUrl(ddlTestResourceRootFolder + "revoke_test_statements.ddl");
- uploadFile(url);
+ uploadFile(ddlTestResourceRootFolder, "revoke_test_statements.ddl", "shouldSequenceStandardDdlRevokeStatements");
+
waitUntilSequencedNodesIs(1);
// Find the node ...
@@ -229,27 +260,86 @@
assertEquals(numStatements, 4);
//REVOKE SELECT ON TABLE purchaseOrders FROM maria,harry;
- Node revokeNode = findNode(ddlNode, "purchaseOrders", "ddl:revokeOnTableStatement");
- assertNotNull(revokeNode);
- Node granteeNode = findNode(revokeNode, "maria", "ddl:grantee");
- assertNotNull(granteeNode);
- Node privNode = findNode(revokeNode, "privilege", "ddl:grantPrivilege");
- assertNotNull(privNode);
+ Node revokeNode = assertNode(ddlNode, "purchaseOrders", "ddl:revokeOnTableStatement");
+ assertNode(revokeNode, "maria", "ddl:grantee");
+ Node privNode = assertNode(revokeNode, "privilege", "ddl:grantPrivilege");
verifySingleValueProperty(privNode, "ddl:type", "SELECT");
//REVOKE UPDATE, USAGE ON TABLE purchaseOrders FROM anita,zhi CASCADE;
- revokeNode = findNode(ddlNode, "orderDetails", "ddl:revokeOnTableStatement");
- assertNotNull(revokeNode);
- privNode = findNode(revokeNode, "privilege", "ddl:grantPrivilege");
- assertNotNull(privNode);
+ revokeNode = assertNode(ddlNode, "orderDetails", "ddl:revokeOnTableStatement");
+ privNode = assertNode(revokeNode, "privilege", "ddl:grantPrivilege");
verifySingleValueProperty(privNode, "ddl:type", "UPDATE");
- granteeNode = findNode(revokeNode, "anita", "ddl:grantee");
- assertNotNull(granteeNode);
+ assertNode(revokeNode, "anita", "ddl:grantee");
}
}
}
+ }
+
+ @Test
+ public void shouldSequenceStandardAlterTableStatements() throws Exception {
+
+ uploadFile(ddlTestResourceRootFolder, "alter_table_statements.ddl", "shouldSequenceStandardAlterTableStatements");
- System.out.println("FINISHED: shouldSequenceStandardDdlRevokeStatements(revoke_test_statements.ddl)");
+ waitUntilSequencedNodesIs(1);
+
+ // Find the node ...
+ Node root = session.getRootNode();
+
+ if (root.hasNode("ddls") ) {
+ if (root.hasNode("ddls")) {
+ Node ddlsNode = root.getNode("ddls");
+ //System.out.println(" | NAME: " + ddlsNode.getName() + " PATH: " + ddlsNode.getPath());
+ for (NodeIterator iter = ddlsNode.getNodes(); iter.hasNext();) {
+ Node ddlNode = iter.nextNode();
+
+ //printNodeProperties(ddlNode);
+
+ long numStatements = ddlNode.getNodes().nextNode().getNodes().getSize();
+ assertEquals(numStatements, 14);
+
+ // ALTER TABLE table_name_1 ADD COLUMN column_name VARCHAR(25) NOT NULL;
+ Node alterNode = assertNode(ddlNode, "table_name_1", "ddl:alterTableStatement");
+ assertEquals(alterNode.getNodes().getSize(), 1);
+ Node addColumnNode = assertNode(alterNode, "column_name", "ddl:columnDefinition");
+ verifySingleValueProperty(addColumnNode, "ddl:datatypeName", "VARCHAR");
+ verifySingleValueProperty(addColumnNode, "ddl:datatypeLength", 25);
+ verifySingleValueProperty(addColumnNode, "ddl:nullable", "NOT NULL");
+
+ // ALTER TABLE schema_2.table_name_2 ADD schema_2.table_name_2.column_name INTEGER NOT NULL DEFAULT (25);
+ alterNode = assertNode(ddlNode, "schema_2.table_name_2", "ddl:alterTableStatement");
+ assertEquals(alterNode.getNodes().getSize(), 1);
+ addColumnNode = assertNode(alterNode, "schema_2.table_name_2.column_name", "ddl:columnDefinition");
+ verifySingleValueProperty(addColumnNode, "ddl:datatypeName", "INTEGER");
+ verifySingleValueProperty(addColumnNode, "ddl:nullable", "NOT NULL");
+ verifySingleValueProperty(addColumnNode, "ddl:defaultValue", "25");
+
+ // ALTER TABLE table_name_4 ALTER COLUMN column_name SET DEFAULT (0);
+ alterNode = assertNode(ddlNode, "table_name_4", "ddl:alterTableStatement");
+ assertEquals(alterNode.getNodes().getSize(), 1);
+ addColumnNode = assertNode(alterNode, "column_name", "ddl:alterColumnDefinition");
+ verifySingleValueProperty(addColumnNode, "ddl:defaultValue", "0");
+
+ // ALTER TABLE table_name_7 DROP COLUMN column_name RESTRICT;
+ alterNode = assertNode(ddlNode, "table_name_7", "ddl:alterTableStatement");
+ assertEquals(alterNode.getNodes().getSize(), 1);
+ Node dropColumnNode = assertNode(alterNode, "column_name", "ddl:dropColumnDefinition");
+ verifySingleValueProperty(dropColumnNode, "ddl:dropBehavior", "RESTRICT");
+
+ // ALTER TABLE table_name_10 ADD CONSTRAINT pk_name PRIMARY KEY (column_name);
+ alterNode = assertNode(ddlNode, "table_name_10", "ddl:alterTableStatement");
+ assertEquals(alterNode.getNodes().getSize(), 1);
+ Node constraintNode = assertNode(alterNode, "pk_name", "ddl:addTableConstraintDefinition");
+ verifySingleValueProperty(constraintNode, "ddl:constraintType", "PRIMARY KEY");
+ assertNode(constraintNode, "column_name", "ddl:columnReference");
+
+ // ALTER TABLE table_name_14 DROP CONSTRAINT fk_name RESTRICT;
+ alterNode = assertNode(ddlNode, "table_name_14", "ddl:alterTableStatement");
+ assertEquals(alterNode.getNodes().getSize(), 1);
+ Node dropConstraintNode = assertNode(alterNode, "fk_name", "ddl:dropTableConstraintDefinition");
+ verifySingleValueProperty(dropConstraintNode, "ddl:dropBehavior", "RESTRICT");
+ }
+ }
+ }
}
}
Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdlSequencerIntegrationTest.java 2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/derby/DerbyDdlSequencerIntegrationTest.java 2010-01-07 19:12:33 UTC (rev 1554)
@@ -25,7 +25,6 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
-import java.net.URL;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
@@ -87,10 +86,6 @@
}
- private URL getUrl(String urlStr) {
- return this.getClass().getClassLoader().getResource(urlStr);
- }
-
@After
public void afterEach() throws Exception {
if (this.session != null) {
@@ -103,9 +98,8 @@
@Test
public void shouldSequenceDerbyDdlFile() throws Exception {
- System.out.println("STARTED: shouldSequenceDerbyDdlFile(derby_test_statements.ddl)");
- URL url = getUrl(resourceFolder + "derby_test_statements.ddl");
- uploadFile(url);
+
+ uploadFile(resourceFolder, "derby_test_statements.ddl", "shouldSequenceDerbyDdlFile");
waitUntilSequencedNodesIs(1);
@@ -214,7 +208,5 @@
}
}
}
-
- System.out.println("FINISHED: shouldSequenceDerbyDdlFile(derby_test_statements.ddl)");
}
}
Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdlSequencerIntegrationTest.java 2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/postgres/PostgresDdlSequencerIntegrationTest.java 2010-01-07 19:12:33 UTC (rev 1554)
@@ -25,7 +25,6 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
-import java.net.URL;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
@@ -86,10 +85,6 @@
}
- private URL getUrl(String urlStr) {
- return this.getClass().getClassLoader().getResource(urlStr);
- }
-
@After
public void afterEach() throws Exception {
if (this.session != null) {
@@ -102,9 +97,8 @@
@Test
public void shouldSequencePostgresDdlFile() throws Exception {
- System.out.println("STARTED: shouldSequencePostgresDdlFile(postgres_test_statements.ddl)");
- URL url = getUrl(resourceFolder + "postgres_test_statements.ddl");
- uploadFile(url);
+
+ uploadFile(resourceFolder, "postgres_test_statements.ddl", "shouldSequencePostgresDdlFile");
waitUntilSequencedNodesIs(1);
@@ -155,7 +149,5 @@
}
}
}
-
- System.out.println("FINISHED: shouldSequencePostgresDdlFile(postgres_test_statements.ddl)");
}
}
Modified: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd 2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/StandardDdl.cnd 2010-01-07 19:12:33 UTC (rev 1554)
@@ -81,7 +81,29 @@
[ddl:tableConstraintOperand] > ddl:operand abstract
[ddl:referenceOperand] > ddl:operand abstract
+
// =============================================================================
+// SIMPLE STRING PROPERTY
+// =============================================================================
+[ddl:simpleProperty] mixin
+ - ddl:propValue (STRING) mandatory
+
+[ddl:constraintAttribute] > ddl:simpleProperty mixin
+
+// =============================================================================
+// STATEMENT OPTION
+// =============================================================================
+[ddl:statementOption] mixin
+ - ddl:value (STRING) mandatory
+
+// =============================================================================
+// DDL PROBLEM
+// =============================================================================
+[ddl:ddlProblem] mixin
+ - ddl:problemLevel (LONG) mandatory
+ - ddl:message (STRING) mandatory
+
+// =============================================================================
// COLUMN
// =============================================================================
[ddl:columnDefinition] > ddl:creatable, ddl:columnOperand mixin
@@ -101,7 +123,7 @@
// =============================================================================
// TABLE CONSTRAINT
// =============================================================================
-[ddl:tableConstraintDefinition] > ddl:creatable, ddl:tableConstraintOperand mixin
+[ddl:tableConstraint] > ddl:creatable, ddl:tableConstraintOperand mixin
- ddl:constraintType (STRING) mandatory
< 'UNIQUE', 'PRIMARY KEY', 'FOREIGN KEY', 'CHECK'
- ddl:deferrable (STRING)
@@ -111,7 +133,7 @@
+ * (ddl:columnReference) = ddl:columnReference multiple
+ * (ddl:tableReference) = ddl:tableReference
+ * (ddl:fkColumnReference) = ddl:fkColumnReference multiple
- + ddl:constraintAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
+ + ddl:constAttribute (ddl:constraintAttribute) = ddl:constraintAttribute multiple
// =============================================================================
// REFERENCE
@@ -122,25 +144,6 @@
[ddl:grantee] > ddl:referenceOperand mixin
// =============================================================================
-// SIMPLE STRING PROPERTY
-// =============================================================================
-[ddl:simpleProperty] mixin
- - ddl:propValue (STRING) mandatory
-
-// =============================================================================
-// STATEMENT OPTION
-// =============================================================================
-[ddl:statementOption] mixin
- - ddl:value (STRING) mandatory
-
-// =============================================================================
-// DDL PROBLEM
-// =============================================================================
-[ddl:ddlProblem] mixin
- - ddl:problemLevel (LONG) mandatory
- - ddl:message (STRING) mandatory
-
-// =============================================================================
// CREATE SCHEMA
// =============================================================================
[ddl:schemaDefinition] > ddl:statement, ddl:creatable, ddl:schemaOperand mixin
@@ -156,7 +159,7 @@
- ddl:onCommitValue (STRING)
< 'DELETE ROWS', 'PRESERVE ROWS'
+ * (ddl:columnDefinition) = ddl:columnDefinition multiple
- + * (ddl:tableConstraintDefinition) = ddl:tableConstraintDefinition multiple
+ + * (ddl:tableConstraint) = ddl:tableConstraint multiple
+ * (ddl:statementOption) = ddl:statementOption multiple
// =============================================================================
@@ -181,15 +184,14 @@
- ddl:defaultValue (STRING)
- ddl:defaultPrecision (LONG)
- ddl:collationName (STRING)
- + ddl:domainConstraintDefinition (ddl:tableConstraintDefinition) = ddl:tableConstraintDefinition multiple
+ + ddl:domainConstraintDefinition (ddl:tableConstraint) = ddl:tableConstraint multiple
// =============================================================================
// CREATE ASSERTION
// =============================================================================
-[ddl:createAssertionStatement] > ddl:statement, ddl:creatable, ddl:assertionOperand mixin
- - ddl:constraintName (STRING) mandatory
+[ddl:createAssertionStatement] > ddl:statement, ddl:creatable, ddl:tableConstraintOperand mixin
- ddl:searchCondition (STRING) mandatory
- + ddl:constraintAttribute (ddl:simpleProperty) = ddl:simpleProperty multiple
+ + ddl:constAttribute (ddl:constraintAttribute) = ddl:constraintAttribute multiple
// =============================================================================
// CREATE CHARACTER SET
@@ -248,8 +250,8 @@
[ddl:alterColumnDefinition] > ddl:columnDefinition, ddl:alterable mixin
[ddl:addColumnDefinition] > ddl:columnDefinition, ddl:creatable mixin
[ddl:dropColumnDefinition] > ddl:columnDefinition, ddl:droppable mixin
-[ddl:addTableConstraintDefinition] > ddl:tableConstraintDefinition, ddl:creatable mixin
-[ddl:dropTableConstraintDefinition] > ddl:tableConstraintDefinition, ddl:droppable mixin
+[ddl:addTableConstraintDefinition] > ddl:tableConstraint, ddl:creatable mixin
+[ddl:dropTableConstraintDefinition] > ddl:tableConstraint, ddl:droppable mixin
// =============================================================================
// MISC STATEMENTS
Added: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/alter_table_statements.ddl
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/alter_table_statements.ddl (rev 0)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/alter_table_statements.ddl 2010-01-07 19:12:33 UTC (rev 1554)
@@ -0,0 +1,74 @@
+-- ==================================================================
+-- ALTER TABLE Statement
+-- ==================================================================
+--<alter table statement> ::=
+-- ALTER TABLE <table name> <alter table action>
+--
+--<alter table action> ::=
+-- <add column definition>
+-- | <alter column definition>
+-- | <drop column definition>
+-- | <add table constraint definition>
+-- | <drop table constraint definition>
+--
+--<add column definition> ::=
+-- ADD [ COLUMN ] <column definition>
+--
+--<column definition> ::=
+-- <column name> { <data type> | <domain name> }
+-- [ <default clause> ]
+-- [ <column constraint definition>... ]
+-- [ <collate clause> ]
+
+ALTER TABLE table_name_1 ADD COLUMN column_name VARCHAR(25) NOT NULL;
+
+ALTER TABLE schema_2.table_name_2 ADD schema_2.table_name_2.column_name INTEGER NOT NULL DEFAULT (25);
+
+--<alter column definition> ::=
+-- ALTER [ COLUMN ] <column name> <alter column action>
+--
+--<alter column action> ::=
+-- <set column default clause>
+-- | <drop column default clause>
+--
+--<set column default clause> ::=
+-- SET <default clause>
+--
+--<drop column default clause> ::=
+-- DROP DEFAULT
+--
+
+ALTER TABLE table_name_3 ALTER column_name SET DEFAULT (0);
+
+ALTER TABLE table_name_4 ALTER COLUMN column_name SET DEFAULT (0);
+
+ALTER TABLE table_name_5 ALTER column_name DROP DEFAULT;
+
+--<drop column definition> ::=
+-- DROP [ COLUMN ] <column name> <drop behavior>
+--
+ALTER TABLE table_name_6 DROP COLUMN column_name CASCADE;
+
+ALTER TABLE table_name_7 DROP COLUMN column_name RESTRICT;
+
+ALTER TABLE table_name_8 DROP column_name CASCADE;
+
+ALTER TABLE table_name_9 DROP column_name RESTRICT;
+
+--<add table constraint definition> ::=
+-- ADD <table constraint definition>
+--
+
+ALTER TABLE table_name_10 ADD CONSTRAINT pk_name PRIMARY KEY (column_name);
+
+ALTER TABLE table_name_11 ADD CONSTRAINT pk_name PRIMARY KEY (column1_name, schema_name_11.table_name_11.column2_name);
+
+ALTER TABLE table_name_12 ADD CONSTRAINT fk_name FOREIGN KEY (ref_col_name) REFERENCES ref_table_name(ref_table_column_name);
+
+--<drop table constraint definition> ::=
+-- DROP CONSTRAINT <constraint name> <drop behavior>
+--
+
+ALTER TABLE table_name_13 DROP CONSTRAINT fk_name CASCADE;
+
+ALTER TABLE table_name_14 DROP CONSTRAINT fk_name RESTRICT;
\ No newline at end of file
Modified: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl 2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/standard_test_statements.ddl 2010-01-07 19:12:33 UTC (rev 1554)
@@ -1,28 +1,28 @@
-CREATE TABLE MORE_ACTIVITIES (CITY_ID INT NOT NULL,
- SEASON VARCHAR(20), ACTIVITY VARCHAR(32) NOT NULL);
-
CREATE SCHEMA AUTHORIZATION oe
CREATE TABLE new_product
(color VARCHAR(10) PRIMARY KEY, quantity NUMERIC)
CREATE VIEW new_product_view
AS SELECT color, quantity FROM new_product WHERE color = 'RED'
GRANT select ON new_product_view TO hr;
-
+
+CREATE SCHEMA schema_name_1
+ CREATE TABLE table_name_15 (
+ column_name_1 VARCHAR(255)
+ REFERENCES ref_table_name (ref_column_name_1)
+ ON UPDATE NO ACTION )
+ CREATE VIEW SAMP.V1 (COL_SUM, COL_DIFF)
+ AS SELECT COMM + BONUS, COMM - BONUS
+ FROM SAMP.EMPLOYEE
+ CREATE TABLE table_name26 (
+ column_name_1 VARCHAR(255),
+ UNIQUE (ref_column_name_1));
+
+CREATE TABLE MORE_ACTIVITIES (CITY_ID INT NOT NULL,
+ SEASON VARCHAR(20), ACTIVITY VARCHAR(32) NOT NULL);
+
CREATE TABLE PEOPLE
(PERSON_ID INT NOT NULL CONSTRAINT PEOPLE_PK PRIMARY KEY, PERSON VARCHAR(26));
-
-CREATE SCHEMA schema_name_1
- CREATE TABLE table_name_15 (
- column_name_1 VARCHAR(255)
- REFERENCES ref_table_name (ref_column_name_1)
- ON UPDATE NO ACTION )
- CREATE VIEW SAMP.V1 (COL_SUM, COL_DIFF)
- AS SELECT COMM + BONUS, COMM - BONUS
- FROM SAMP.EMPLOYEE
- CREATE TABLE table_name26 (
- column_name_1 VARCHAR(255),
- UNIQUE (ref_column_name_1));
-
+
CREATE TABLE table_name29 (
column_name_1 VARCHAR(255),
CONSTRAINT fk_name FOREIGN KEY (ref_column_name_1, ref_column_name_2)
@@ -36,3 +36,68 @@
CREATE TABLE HOTELAVAILABILITY
(HOTEL_ID INT NOT NULL, BOOKING_DATE DATE NOT NULL,
ROOMS_TAKEN INT DEFAULT 0, PRIMARY KEY (HOTEL_ID, BOOKING_DATE));
+
+CREATE TABLE employee (
+ empno NUMBER(4) NOT NULL,
+ empname CHAR(10),
+ job CHAR(9),
+ deptno NUMBER(2) NOT NULL,
+ CONSTRAINT emp_fk1 FOREIGN KEY (deptno) REFERENCES dept (deptno) INITIALLY IMMEDIATE,
+ CONSTRAINT emp_pk PRIMARY KEY (empno));
+
+CREATE ASSERTION assertNotNull CHECK (value != null) NOT DEFERRABLE;
+
+CREATE ASSERTION assertIsZero CHECK (value != null and value == 0) INITIALLY DEFERRED;
+
+CREATE ASSERTION Avgs CHECK( 3.0 < (SELECT avg(GPA) FROM Student) AND 1000 > (SELECT avg(sizeHS) FROM Student));
+
+CREATE DOMAIN full_domain CHAR DEFAULT null;
+
+CREATE DOMAIN partial_domain AS INTEGER DEFAULT (25);
+
+create domain mydecimal decimal(10) default 1 check (mydecimal>=0) initially immediate not deferrable;
+create domain myinteger as integer constraint myintegconstr1 check(myinteger is not null);
+create domain mynchar as nchar(100) collate schema1.collation2;
+create character set cs1 get WIN1250 collation from desc(collation1);
+create character set cs2 as get unicode collate collation2;
+create character set cs3 as get WIN1250;
+create character set cs4 get WIN1250 collation from external('externcollat2');
+create character set cs5 get WIN1250 collation from translation tn1 then collation collation1;
+create collation collation1 for cs1 from default no pad;
+create collation collation2 for cs2 from translation tn1 then collation collation1;
+create collation collation3 for cs3 from external('externcollat2') pad space;
+create translation tn1 for cs1 to cs2 from external('externtransl2');
+create translation tn2 for cs2 to cs3 from identity;
+create translation tn3 for cs3 to cs4 from tn2;
+create assertion assertconstr1 check(1=(select count(*) from a)) initially immediate not deferrable;
+create assertion assertconstr2 check((select max(b) from c)>0);
+
+create schema schema_1 authorization ADM default character set UNICODE
+ create table table_1 (col1 varchar(20) not null, col2 nchar default current_user)
+ create view view_1 (col1, col2) as select*from a with check option
+;
+create schema schema_2;
+create global temporary table table_3 (col1 dec(10,2) default 0) on commit delete rows;
+create local temporary table table_4 (col1 dec default null primary key) on commit preserve rows;
+create table table_5 (
+ col1 integer unique, col2 smallint unique,
+ col3 numeric(5,0) references table_3(col1) match full on delete cascade,
+ col4 numeric(5,0) references table_4(col1) match partial on delete set default on update set null,
+ col5 numeric(5,0) references table_1(col1) on update no action on delete cascade check (col5<col4),
+ col6 date not null check (col5<col4 and col6<=date'2003-12-31') unique,
+ unique (col1,col4) initially immediate not deferrable,
+ constraint pk5 primary key (col1) initially deferred,
+ foreign key (col4,col5) references table_7(col2,col3) not deferrable initially immediate,
+ constraint ck2 check (col5 is not null)
+);
+create view view_1 (col1,col2) as values (1,2);
+create view view_1 (col1,col2) as values (1,2) with check option;
+create view view_1 (col1,col2) as select a,b from c with local check option;
+create view view_1 (col1,col2) as table c with cascaded check option;
+grant all privileges on table_1 to public with grant option;
+grant delete,insert(col1,col2),update, references on table table_1 to user1, user1;
+grant usage on domain dom1 to user3;
+grant usage on collation col1 to user4, user5;
+grant usage on character set cs1 to user6;
+grant usage on translation tn1 to user7;
+
Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java 2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlConstants.java 2010-01-07 19:12:33 UTC (rev 1554)
@@ -25,6 +25,9 @@
public static final int CONSTRAINT_FK = 1;
public static final int CONSTRAINT_PK = 2;
public static final int CONSTRAINT_C = 3;
+
+ public static final String PRIMARY_KEY = "PRIMARY KEY";
+ public static final String FOREIGN_KEY = "FOREIGN KEY";
/*
* Common DDL Keywords
Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java 2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.java 2010-01-07 19:12:33 UTC (rev 1554)
@@ -43,10 +43,10 @@
public static I18n alterTableOptionNotFound;
public static I18n unusedTokensParsingCreateIndex;
public static I18n missingReturnTypeForFunction;
+ public static I18n unsupportedProcedureParameterDeclaration;
// public static I18n
// public static I18n
// public static I18n
-// public static I18n
static {
Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java 2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlLexicon.java 2010-01-07 19:12:33 UTC (rev 1554)
@@ -150,7 +150,6 @@
public static final Name SQL = new BasicName(Namespace.URI, "sql");
public static final Name TEMPORARY = new BasicName(Namespace.URI, "temporary");
public static final Name ON_COMMIT_VALUE = new BasicName(Namespace.URI, "onCommitValue");
- public static final Name COLUMN_DEFINITIONS = new BasicName(Namespace.URI, "datatypeScale");
public static final Name NULLABLE = new BasicName(Namespace.URI, "nullable");
public static final Name DEFAULT_OPTION = new BasicName(Namespace.URI, "defaultOption");
public static final Name COLLATION_NAME = new BasicName(Namespace.URI, "collationName");
Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java 2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java 2010-01-07 19:12:33 UTC (rev 1554)
@@ -482,15 +482,15 @@
} else if (tokens.matches(STMT_CREATE_VIEW) || tokens.matches(STMT_CREATE_OR_REPLACE_VIEW)) {
stmtNode = parseCreateViewStatement(tokens, parentNode);
} else if (tokens.matches(STMT_CREATE_ASSERTION)) {
- stmtNode = parseStatement(tokens, STMT_CREATE_ASSERTION, parentNode, TYPE_CREATE_ASSERTION_STATEMENT);
+ stmtNode = parseCreateAssertionStatement(tokens, parentNode);
} else if (tokens.matches(STMT_CREATE_CHARACTER_SET)) {
- stmtNode = parseStatement(tokens, STMT_CREATE_CHARACTER_SET, parentNode, TYPE_CREATE_CHARACTER_SET_STATEMENT);
+ stmtNode = parseCreateCharacterSetStatement(tokens, parentNode);
} else if (tokens.matches(STMT_CREATE_COLLATION)) {
- stmtNode = parseStatement(tokens, STMT_CREATE_COLLATION, parentNode, TYPE_CREATE_COLLATION_STATEMENT);
+ stmtNode = parseCreateCollationStatement(tokens, parentNode);
} else if (tokens.matches(STMT_CREATE_TRANSLATION)) {
- stmtNode = parseStatement(tokens, STMT_CREATE_TRANSLATION, parentNode, TYPE_CREATE_TRANSLATION_STATEMENT);
+ stmtNode = parseCreateTranslationStatement(tokens, parentNode);
} else if (tokens.matches(STMT_CREATE_DOMAIN)) {
- stmtNode = parseStatement(tokens, STMT_CREATE_DOMAIN, parentNode, TYPE_CREATE_DOMAIN_STATEMENT);
+ stmtNode = parseCreateDomainStatement(tokens, parentNode);
} else {
markStartOfStatement(tokens);
@@ -766,7 +766,7 @@
}
/**
- * Parses DDL INSERT {@link AstNode} based on SQL 92 specifications.
+ * Parses DDL GRANT statement {@link AstNode} based on SQL 92 specifications.
*
* @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
* @param parentNode the parent {@link AstNode} node; may not be null
@@ -997,7 +997,127 @@
return revokeNode;
}
+
/**
+ * Parses DDL CREATE DOMAIN {@link AstNode} based on SQL 92 specifications.
+ *
+ * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
+ * @param parentNode the parent {@link AstNode} node; may not be null
+ * @return the parsed statement node {@link AstNode}
+ * @throws ParsingException
+ */
+ protected AstNode parseCreateDomainStatement( DdlTokenStream tokens,
+ AstNode parentNode ) throws ParsingException {
+ assert tokens != null;
+ assert parentNode != null;
+
+ //<domain definition> ::=
+ // CREATE DOMAIN <domain name>
+ // [ AS ] <data type>
+ // [ <default clause> ]
+ // [ <domain constraint>... ]
+ // [ <collate clause> ]
+
+ markStartOfStatement(tokens);
+
+ tokens.consume(STMT_CREATE_DOMAIN);
+
+ String name = parseName(tokens);
+
+ AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_DOMAIN_STATEMENT);
+
+ parseUntilTerminator(tokens);
+
+ markEndOfStatement(tokens, node);
+
+ return node;
+ }
+
+ /**
+ * Parses DDL CREATE COLLATION {@link AstNode} based on SQL 92 specifications.
+ *
+ * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
+ * @param parentNode the parent {@link AstNode} node; may not be null
+ * @return the parsed statement node {@link AstNode}
+ * @throws ParsingException
+ */
+ protected AstNode parseCreateCollationStatement( DdlTokenStream tokens,
+ AstNode parentNode ) throws ParsingException {
+ assert tokens != null;
+ assert parentNode != null;
+
+ markStartOfStatement(tokens);
+
+ tokens.consume(STMT_CREATE_COLLATION);
+
+ String name = parseName(tokens);
+
+ AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_COLLATION_STATEMENT);
+
+ parseUntilTerminator(tokens);
+
+ markEndOfStatement(tokens, node);
+
+ return node;
+ }
+
+ /**
+ * Parses DDL CREATE TRANSLATION {@link AstNode} based on SQL 92 specifications.
+ *
+ * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
+ * @param parentNode the parent {@link AstNode} node; may not be null
+ * @return the parsed statement node {@link AstNode}
+ * @throws ParsingException
+ */
+ protected AstNode parseCreateTranslationStatement( DdlTokenStream tokens,
+ AstNode parentNode ) throws ParsingException {
+ assert tokens != null;
+ assert parentNode != null;
+
+ markStartOfStatement(tokens);
+
+ tokens.consume(STMT_CREATE_TRANSLATION);
+
+ String name = parseName(tokens);
+
+ AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_TRANSLATION_STATEMENT);
+
+ parseUntilTerminator(tokens);
+
+ markEndOfStatement(tokens, node);
+
+ return node;
+ }
+
+ /**
+ * Parses DDL CREATE CHARACTER SET {@link AstNode} based on SQL 92 specifications.
+ *
+ * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
+ * @param parentNode the parent {@link AstNode} node; may not be null
+ * @return the parsed statement node {@link AstNode}
+ * @throws ParsingException
+ */
+ protected AstNode parseCreateCharacterSetStatement( DdlTokenStream tokens,
+ AstNode parentNode ) throws ParsingException {
+ assert tokens != null;
+ assert parentNode != null;
+
+ markStartOfStatement(tokens);
+
+ tokens.consume(STMT_CREATE_CHARACTER_SET);
+
+ String name = parseName(tokens);
+
+ AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_CHARACTER_SET_STATEMENT);
+
+ parseUntilTerminator(tokens);
+
+ markEndOfStatement(tokens, node);
+
+ return node;
+ }
+
+ /**
* Catch-all method to parse unknown (not registered or handled by sub-classes) statements.
*
* @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
@@ -1377,7 +1497,7 @@
// CONSTRAINT P_KEY_2a UNIQUE (PERMISSIONUID)
tokens.consume("UNIQUE"); // UNIQUE
- constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_UC);
+ constraintNode.setProperty(CONSTRAINT_TYPE, UNIQUE);
// CONSUME COLUMNS
parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1388,7 +1508,7 @@
tokens.consume("PRIMARY"); // PRIMARY
tokens.consume("KEY"); // KEY
- constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_PK);
+ constraintNode.setProperty(CONSTRAINT_TYPE, PRIMARY_KEY);
// CONSUME COLUMNS
parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1400,7 +1520,7 @@
// COLUMN_NAME DATATYPE NOT NULL DEFAULT (0) CONSTRAINT SOME_FK_NAME REFERENCES SOME_TABLE_NAME (SOME_COLUMN_NAME,
// ...)
- constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_FK);
+ constraintNode.setProperty(CONSTRAINT_TYPE, FOREIGN_KEY);
nodeFactory().node(colName, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1416,7 +1536,7 @@
AstNode constraintNode = nodeFactory().node(uc_name, columnNode.getParent(), mixinType);
- constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_UC);
+ constraintNode.setProperty(CONSTRAINT_TYPE, UNIQUE);
nodeFactory().node(colName, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1428,7 +1548,7 @@
AstNode constraintNode = nodeFactory().node(pk_name, columnNode.getParent(), mixinType);
- constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_PK);
+ constraintNode.setProperty(CONSTRAINT_TYPE, PRIMARY_KEY);
nodeFactory().node(colName, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1444,7 +1564,7 @@
AstNode constraintNode = nodeFactory().node(constraintName, columnNode.getParent(), mixinType);
- constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_FK);
+ constraintNode.setProperty(CONSTRAINT_TYPE, FOREIGN_KEY);
nodeFactory().node(colName, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1461,7 +1581,7 @@
AstNode constraintNode = nodeFactory().node(constraintName, columnNode.getParent(), mixinType);
- constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_FK);
+ constraintNode.setProperty(CONSTRAINT_TYPE, FOREIGN_KEY);
nodeFactory().node(colName, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1475,7 +1595,7 @@
AstNode constraintNode = nodeFactory().node(ck_name, columnNode.getParent(), mixinType);
constraintNode.setProperty(NAME, ck_name);
- constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_C);
+ constraintNode.setProperty(CONSTRAINT_TYPE, CHECK);
String clause = consumeParenBoundedTokens(tokens, true);
constraintNode.setProperty(CHECK_SEARCH_CONDITION, clause);
@@ -1552,7 +1672,7 @@
tokens.consume(); // UNIQUE
AstNode constraintNode = nodeFactory().node(uc_name, tableNode, mixinType);
- constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_UC);
+ constraintNode.setProperty(CONSTRAINT_TYPE, UNIQUE);
// CONSUME COLUMNS
parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1565,7 +1685,7 @@
tokens.consume("PRIMARY", "KEY"); // PRIMARY KEY
AstNode constraintNode = nodeFactory().node(pk_name, tableNode, mixinType);
- constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_PK);
+ constraintNode.setProperty(CONSTRAINT_TYPE, PRIMARY_KEY);
// CONSUME COLUMNS
parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1583,7 +1703,7 @@
}
AstNode constraintNode = nodeFactory().node(fk_name, tableNode, mixinType);
- constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_FK);
+ constraintNode.setProperty(CONSTRAINT_TYPE, FOREIGN_KEY);
// CONSUME COLUMNS
parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1602,7 +1722,7 @@
tokens.consume("UNIQUE"); // UNIQUE
AstNode constraintNode = nodeFactory().node(uc_name, tableNode, mixinType);
- constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_UC);
+ constraintNode.setProperty(CONSTRAINT_TYPE, UNIQUE);
// CONSUME COLUMNS
parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1617,7 +1737,7 @@
tokens.consume("PRIMARY", "KEY"); // PRIMARY KEY
AstNode constraintNode = nodeFactory().node(pk_name, tableNode, mixinType);
- constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_PK);
+ constraintNode.setProperty(CONSTRAINT_TYPE, PRIMARY_KEY);
// CONSUME COLUMNS
parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1634,7 +1754,7 @@
AstNode constraintNode = nodeFactory().node(fk_name, tableNode, mixinType);
- constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_FK);
+ constraintNode.setProperty(CONSTRAINT_TYPE, FOREIGN_KEY);
// CONSUME COLUMNS
parseColumnNameList(tokens, constraintNode, TYPE_COLUMN_REFERENCE);
@@ -1653,7 +1773,7 @@
tokens.consume("CHECK"); // CHECK
AstNode constraintNode = nodeFactory().node(ck_name, tableNode, mixinType);
- constraintNode.setProperty(CONSTRAINT_TYPE, CONSTRAINT_C);
+ constraintNode.setProperty(CONSTRAINT_TYPE, CHECK);
String clause = consumeParenBoundedTokens(tokens, true);
constraintNode.setProperty(CHECK_SEARCH_CONDITION, clause);
@@ -1867,7 +1987,45 @@
return schemaNode;
}
+ /**
+ * Parses DDL CREATE ASSERTION {@link AstNode} based on SQL 92 specifications. Initial implementation here does not parse the
+ * statement's search condition in detail.
+ *
+ * @param tokens the {@link DdlTokenStream} representing the tokenized DDL content; may not be null
+ * @param parentNode the parent {@link AstNode} node; may not be null
+ * @return the parsed schema node
+ * @throws ParsingException
+ */
+ protected AstNode parseCreateAssertionStatement( DdlTokenStream tokens,
+ AstNode parentNode ) throws ParsingException {
+ markStartOfStatement(tokens);
+ // <assertion definition> ::=
+ // CREATE ASSERTION <constraint name> CHECK <left paren> <search condition> <right paren> [ <constraint attributes> ]
+
+ AstNode node = null;
+
+ tokens.consume("CREATE", "ASSERTION");
+
+ String name = parseName(tokens);
+
+ // Must have one or the other or both
+
+ node = nodeFactory().node(name, parentNode, TYPE_CREATE_ASSERTION_STATEMENT);
+
+ tokens.consume("CHECK");
+
+ String searchCondition = consumeParenBoundedTokens(tokens, false);
+
+ node.setProperty(CHECK_SEARCH_CONDITION, searchCondition);
+
+ parseConstraintAttributes(tokens, node);
+
+ markEndOfStatement(tokens, node);
+
+ return node;
+ }
+
// ===========================================================================================================================
// PARSING CREATE XXXXX (Typed Statements)
// ===========================================================================================================================
Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/datatype/DataTypeParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/datatype/DataTypeParser.java 2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/datatype/DataTypeParser.java 2010-01-07 19:12:33 UTC (rev 1554)
@@ -64,6 +64,7 @@
basicCharStringTypes.add(DataTypes.DTYPE_CHAR_VARYING);
basicCharStringTypes.add(DataTypes.DTYPE_VARCHAR);
+ basicNationalCharStringTypes.add(DataTypes.DTYPE_NCHAR);
basicNationalCharStringTypes.add(DataTypes.DTYPE_NATIONAL_CHARACTER);
basicNationalCharStringTypes.add(DataTypes.DTYPE_NATIONAL_CHARACTER_VARYING);
basicNationalCharStringTypes.add(DataTypes.DTYPE_NATIONAL_CHAR);
Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java 2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParser.java 2010-01-07 19:12:33 UTC (rev 1554)
@@ -228,7 +228,7 @@
// | { NO SQL | CONTAINS SQL | READS SQL DATA }
// | { RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT }
// }
- tokens.consume(CREATE, "FUNCTION"); // CREATE
+ tokens.consume(CREATE, "FUNCTION");
String functionName = parseName(tokens);
@@ -330,11 +330,11 @@
}
/**
- * Parses DDL CREATE FUNCTION statement
+ * Parses DDL CREATE PROCEDURE statement
*
* @param tokens the tokenized {@link DdlTokenStream} of the DDL input content; may not be null
* @param parentNode the parent {@link AstNode} node; may not be null
- * @return the parsed CREATE FUNCTION statement node
+ * @return the parsed CREATE PROCEDURE statement node
* @throws ParsingException
*/
protected AstNode parseCreateProcedure( DdlTokenStream tokens,
@@ -344,7 +344,7 @@
markStartOfStatement(tokens);
- tokens.consume(CREATE, "PROCEDURE"); // CREATE
+ tokens.consume(CREATE, "PROCEDURE");
String functionName = parseName(tokens);
Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java 2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java 2010-01-07 19:12:33 UTC (rev 1554)
@@ -340,7 +340,7 @@
SubgraphNode pk_1_Node = tableNode.getNode(path("PK_1"));
assertNotNull(pk_1_Node);
assertThat(verifyPrimaryType(pk_1_Node, "nt:unstructured"), is(true));
- assertThat(verifyProperty(pk_1_Node, "ddl:constraintType", "2"), is(true));
+ assertThat(verifyProperty(pk_1_Node, "ddl:constraintType", "PRIMARY KEY"), is(true));
assertThat(verifyMixinType(pk_1_Node, "ddl:tableConstraint"), is(true));
// One column reference
@@ -597,7 +597,7 @@
// <name = "CREATE OR REPLACE DIRECTORY" startLineNumber = "164" primaryType = "nt:unstructured" uuid = "c45eb2bb-1b85-469d-9dfc-0012fdfd8ac4" startColumnNumber = "1" mixinTypes = "oracleddl:createDirectoryStatement" expression = "CREATE OR REPLACE DIRECTORY bfile_dir AS '/private1/LOB/files';" startCharIndex = "3887">
SubgraphNode createOrReplDirNode = statementsNode.getNode(path("CREATE OR REPLACE DIRECTORY"));
assertNotNull(createOrReplDirNode);
- verifyBaseProperties(createOrReplDirNode, "nt:unstructured", "164", "1", "3887", 0);
+ verifyBaseProperties(createOrReplDirNode, "nt:unstructured", "164", "1", "3886", 0);
assertThat(verifyMixinType(createOrReplDirNode, "oracleddl:createDirectoryStatement"), is(true));
// <name = "countries" startLineNumber = "9" primaryType = "nt:unstructured" uuid = "70f45acc-57b0-41c9-b166-bcba4f8c75b8" startColumnNumber = "1" mixinTypes = "ddl:alterTableStatement" expression = "ALTER TABLE countries
@@ -623,7 +623,7 @@
SubgraphNode check_1_node = countriesNode.getNode(path("CHECK_1"));
assertNotNull(check_1_node);
assertThat(verifyPrimaryType(check_1_node, "nt:unstructured"), is(true));
- assertThat(verifyProperty(check_1_node, "ddl:constraintType", "3"), is(true));
+ assertThat(verifyProperty(check_1_node, "ddl:constraintType", "CHECK"), is(true));
assertThat(verifyMixinType(check_1_node, "ddl:addTableConstraintDefinition"), is(true));
assertThat(verifyProperty(check_1_node, "ddl:searchCondition", "( duty_pct < 10 . 5 )"), is(true));
Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java 2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java 2010-01-07 19:12:33 UTC (rev 1554)
@@ -256,7 +256,7 @@
assertEquals(1, alterTableNode.getChildCount());
AstNode constraintNode = alterTableNode.getChild(0); // / FOREIGN KEY
assertEquals("fk_name", constraintNode.getName().getString());
- assertEquals(DdlConstants.CONSTRAINT_FK, constraintNode.getProperty(CONSTRAINT_TYPE).getFirstValue());
+ assertEquals(DdlConstants.FOREIGN_KEY, constraintNode.getProperty(CONSTRAINT_TYPE).getFirstValue());
assertTrue(hasMixinType(constraintNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_ADD_TABLE_CONSTRAINT_DEFINITION));
// Expect 3 references: COLUMN REFERENCE for this table, External Table reference and column reference in external table
@@ -298,7 +298,7 @@
String content = getFileContent(DDL_FILE_PATH + "schema_definition.ddl");
parser.parse(content, rootNode);
- assertEquals(11, rootNode.getChildCount());
+ assertEquals(13, rootNode.getChildCount());
List<AstNode> schemaNodes = parser.nodeFactory().getChildrenForType(rootNode, TYPE_CREATE_SCHEMA_STATEMENT);
@@ -600,7 +600,7 @@
AstNode foreignKeyNode = parser.nodeFactory().getChildforNameAndType(tableNode, "FK_SUPPLIER", TYPE_TABLE_CONSTRAINT);
- assertEquals(DdlConstants.CONSTRAINT_FK, foreignKeyNode.getProperty(CONSTRAINT_TYPE).getFirstValue());
+ assertEquals(DdlConstants.FOREIGN_KEY, foreignKeyNode.getProperty(CONSTRAINT_TYPE).getFirstValue());
assertEquals(3, foreignKeyNode.getChildCount()); // 2 COLUMN REFERENCES + 1 TABLE REFERENCE
}
@@ -860,4 +860,18 @@
assertThat(true, is(success));
assertThat(rootNode.getChildCount(), is(4));
}
+
+ @Test
+ public void shouldParseSchemaWithTableAndView() {
+ printTest("shouldParseSchemaWithTableAndView()");
+ String content =
+ "create schema schema_1 authorization ADM default character set UNICODE" + NEWLINE
+ + " create table table_1 (col1 varchar(20) not null, col2 nchar default current_user)" + NEWLINE
+ + " create view view_1 (col1, col2) as select*from a with check option" + NEWLINE
+ + ";";
+
+ boolean success = parser.parse(content, rootNode);
+ assertThat(true, is(success));
+ assertThat(rootNode.getChildCount(), is(1));
+ }
}
Modified: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/schema_definition.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/schema_definition.ddl 2010-01-07 19:11:34 UTC (rev 1553)
+++ trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/schema_definition.ddl 2010-01-07 19:12:33 UTC (rev 1554)
@@ -105,8 +105,17 @@
);
-- ==================================================================
--- DOMAIN DEFINITION
+-- ASSERTION DEFINITION
-- ==================================================================
+--<assertion definition> ::=
+-- CREATE ASSERTION <constraint name> <assertion check>
+-- [ <constraint attributes> ]
+--
+--<assertion check> ::=
+-- CHECK
+-- <left paren> <search condition> <right paren>
+CREATE ASSERTION assertNotNull CHECK (value != null) NOT DEFERRABLE
+CREATE ASSERTION assertIsZero CHECK (value != null and value == 0) INITIALLY DEFERRED
15 years, 11 months
DNA SVN: r1553 - in trunk: dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle and 5 other directories.
by dna-commits@lists.jboss.org
Author: blafond
Date: 2010-01-07 14:11:34 -0500 (Thu, 07 Jan 2010)
New Revision: 1553
Added:
trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/create_procedure_statements.ddl
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd
trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/create_procedure_statements.ddl
Removed:
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd
Modified:
trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdlSequencerIntegrationTest.java
trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdl.cnd
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlConstants.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlLexicon.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java
trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java
trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/oracle_test_statements_2.ddl
Log:
DNA-49 Oracle Sequencer/Parser fixes/changes. Cleaned up COMMIT statements & added Create Materialized View
Modified: trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdlSequencerIntegrationTest.java
===================================================================
--- trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdlSequencerIntegrationTest.java 2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/dna-integration-tests/src/test/java/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdlSequencerIntegrationTest.java 2010-01-07 19:11:34 UTC (rev 1553)
@@ -24,7 +24,6 @@
package org.jboss.dna.test.integration.sequencer.ddl.dialect.oracle;
import static org.junit.Assert.assertEquals;
-import java.net.URL;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
@@ -39,7 +38,6 @@
import org.junit.Test;
/**
- * @author blafond
*
*/
public class OracleDdlSequencerIntegrationTest extends DdlIntegrationTestUtil {
@@ -86,10 +84,6 @@
}
- private URL getUrl(String urlStr) {
- return this.getClass().getClassLoader().getResource(urlStr);
- }
-
@After
public void afterEach() throws Exception {
if (this.session != null) {
@@ -103,9 +97,8 @@
@Test
public void shouldSequenceOracleDdlFile() throws Exception {
- System.out.println("STARTED: shouldSequenceOracleDdlFile(oracle_test_statements.ddl)");
- URL url = getUrl(resourceFolder + "oracle_test_statements.ddl");
- uploadFile(url);
+
+ uploadFile(resourceFolder, "oracle_test_statements.ddl", "shouldSequenceOracleDdlFile");
waitUntilSequencedNodesIs(1);
@@ -134,7 +127,77 @@
}
}
}
+ }
+
+ @Test
+ public void shouldSequenceOracleCreateProceduresAndFunctions() throws Exception {
+
+ uploadFile(resourceFolder, "create_procedure_statements.ddl", "shouldSequenceOracleCreateProceduresAndFunctions");
- System.out.println("FINISHED: shouldSequenceOracleDdlFile(oracle_test_statements.ddl)");
+ waitUntilSequencedNodesIs(1);
+
+ // Find the node ...
+ Node root = session.getRootNode();
+
+ if (root.hasNode("ddls") ) {
+ if (root.hasNode("ddls")) {
+ Node ddlsNode = root.getNode("ddls");
+ //System.out.println(" | NAME: " + ddlsNode.getName() + " PATH: " + ddlsNode.getPath());
+ for (NodeIterator iter = ddlsNode.getNodes(); iter.hasNext();) {
+ Node ddlNode = iter.nextNode();
+
+ long numStatements = ddlNode.getNodes().nextNode().getNodes().getSize();
+ assertEquals(4, numStatements);
+
+ //printNodeProperties(ddlNode);
+ //remove_emp <ns001:startLineNumber = 1, jcr:primaryType = nt:unstructured, ns001:startColumnNumber = 1, jcr:mixinTypes = ns002:createProcedureStatement, ns001:expression =
+ // CREATE PROCEDURE remove_emp (employee_id NUMBER) AS tot_emps NUMBER;
+ // BEGIN
+ // DELETE FROM employees
+ // WHERE employees.employee_id = remove_emp.employee_id;
+ // tot_emps := tot_emps - 1;
+ // END;
+ // /, ns001:startCharIndex = 0>
+ // employee_id <ns001:datatypeName = NUMBER, jcr:primaryType = nt:unstructured, ns001:datatypePrecision = 0, jcr:mixinTypes = ns002:functionParameter, ns001:datatypeScale = 0>
+
+ Node node = assertNode(ddlNode, "remove_emp", "oracleddl:createProcedureStatement");
+ assertEquals(1, node.getNodes().getSize());
+ Node paramNode = assertNode(node, "employee_id", "oracleddl:functionParameter");
+ verifySimpleStringProperty(paramNode, "ddl:datatypeName", "NUMBER");
+
+ //find_root <ns001:startLineNumber = 9, jcr:primaryType = nt:unstructured, ns001:startColumnNumber = 1, jcr:mixinTypes = ns002:createProcedureStatement, ns001:expression =
+ // CREATE PROCEDURE find_root ( x IN REAL )
+ // IS LANGUAGE C
+ // NAME c_find_root
+ // LIBRARY c_utils
+ // PARAMETERS ( x BY REFERENCE );, ns001:startCharIndex = 211>
+ // x <ns001:datatypeName = REAL, jcr:primaryType = nt:unstructured, ns002:inOutNoCopy = IN, jcr:mixinTypes = ns002:functionParameter>
+ node = assertNode(ddlNode, "find_root", "oracleddl:createProcedureStatement");
+ assertEquals(1, node.getNodes().getSize());
+ paramNode = assertNode(node, "x", "oracleddl:functionParameter");
+ verifySimpleStringProperty(paramNode, "ddl:datatypeName", "REAL");
+ verifySimpleStringProperty(paramNode, "oracleddl:inOutNoCopy", "IN");
+
+ //CREATE FUNCTION SecondMax (input NUMBER) RETURN NUMBER
+ // PARALLEL_ENABLE AGGREGATE USING SecondMaxImpl;
+ node = assertNode(ddlNode, "SecondMax", "oracleddl:createFunctionStatement");
+ assertEquals(1, node.getNodes().getSize());
+ paramNode = assertNode(node, "input", "oracleddl:functionParameter");
+ verifySimpleStringProperty(paramNode, "ddl:datatypeName", "NUMBER");
+
+ //CREATE OR REPLACE FUNCTION text_length(a CLOB)
+ // RETURN NUMBER DETERMINISTIC IS
+ // BEGIN
+ // RETURN DBMS_LOB.GETLENGTH(a);
+ // END;
+ ///
+ node = assertNode(ddlNode, "text_length", "oracleddl:createFunctionStatement");
+ assertEquals(1, node.getNodes().getSize());
+ verifySimpleStringProperty(node, "ddl:datatypeName", "NUMBER");
+ paramNode = assertNode(node, "a", "oracleddl:functionParameter");
+ verifySimpleStringProperty(paramNode, "ddl:datatypeName", "CLOB");
+ }
+ }
+ }
}
}
Modified: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdl.cnd
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdl.cnd 2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/OracleDdl.cnd 2010-01-07 19:11:34 UTC (rev 1553)
@@ -51,6 +51,7 @@
[oracleddl:operatorOperand] > ddl:operand abstract
[oracleddl:outlineOperand] > ddl:operand abstract
[oracleddl:packageOperand] > ddl:operand abstract
+[oracleddl:parameterOperand] > ddl:operand abstract
[oracleddl:pfileOperand] > ddl:operand abstract
[oracleddl:procedureOperand] > ddl:operand abstract
[oracleddl:profileOperand] > ddl:operand abstract
@@ -72,7 +73,18 @@
// =============================================================================
[oracleddl:columnDefinition] > ddl:columnDefinition
- oracleddl:dropDefault (boolean)
-
+
+//
+
+[oracleddl:functionParameter] > oracleddl:parameterOperand mixin
+ - ddl:datatypeName (STRING) mandatory
+ - ddl:datatypeLength (LONG)
+ - ddl:datatypePrecision (LONG)
+ - ddl:datatypeScale (LONG)
+ - oracleddl:default (STRING)
+ - oracleddl:defaultExpresssion (STRING)
+ - oracleddl:inOutNoCopy (STRING)
+
// =============================================================================
// ALTER STATEMENTS
// =============================================================================
@@ -119,6 +131,11 @@
[oracleddl:createDirectoryStatement] > ddl:creatable, ddl:statement, oracleddl:directoryOperand mixin
[oracleddl:createDiskgroupStatement] > ddl:creatable, ddl:statement, oracleddl:diskgroupOperand mixin
[oracleddl:createFunctionStatement] > ddl:creatable, ddl:statement, oracleddl:functionOperand mixin
+ - ddl:datatypeName (STRING) mandatory
+ - ddl:datatypeLength (LONG)
+ - ddl:datatypePrecision (LONG)
+ - ddl:datatypeScale (LONG)
+ + oracleddl:parameter (oracleddl:functionParameter) = oracleddl:functionParameter multiple
[oracleddl:createIndexStatement] > ddl:creatable, ddl:statement, oracleddl:indexOperand mixin
- oracleddl:tableName (string) mandatory
- oracleddl:unique (boolean)
@@ -133,6 +150,7 @@
[oracleddl:createPackageStatement] > ddl:creatable, ddl:statement, oracleddl:packageOperand mixin
[oracleddl:createPfileStatement] > ddl:creatable, ddl:statement, oracleddl:pfileOperand mixin
[oracleddl:createProcedureStatement] > ddl:creatable, ddl:statement, oracleddl:procedureOperand mixin
+ + oracleddl:parameter (oracleddl:functionParameter) = oracleddl:functionParameter multiple
[oracleddl:createRoleStatement] > ddl:creatable, ddl:statement, oracleddl:roleOperand mixin
[oracleddl:createRollbackStatement] > ddl:creatable, ddl:statement, oracleddl:rollbackOperand mixin
[oracleddl:createSequenceStatement] > ddl:creatable, ddl:statement, oracleddl:sequenceOperand mixin
Added: trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/create_procedure_statements.ddl
===================================================================
--- trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/create_procedure_statements.ddl (rev 0)
+++ trunk/dna-integration-tests/src/test/resources/org/jboss/dna/test/integration/sequencer/ddl/dialect/oracle/create_procedure_statements.ddl 2010-01-07 19:11:34 UTC (rev 1553)
@@ -0,0 +1,24 @@
+CREATE PROCEDURE remove_emp (employee_id NUMBER) AS tot_emps NUMBER;
+ BEGIN
+ DELETE FROM employees
+ WHERE employees.employee_id = remove_emp.employee_id;
+ tot_emps := tot_emps - 1;
+ END;
+/
+
+CREATE PROCEDURE find_root
+ ( x IN REAL )
+ IS LANGUAGE C
+ NAME c_find_root
+ LIBRARY c_utils
+ PARAMETERS ( x BY REFERENCE );
+
+CREATE FUNCTION SecondMax (input NUMBER) RETURN NUMBER
+ PARALLEL_ENABLE AGGREGATE USING SecondMaxImpl;
+
+CREATE OR REPLACE FUNCTION text_length(a CLOB)
+ RETURN NUMBER DETERMINISTIC IS
+ BEGIN
+ RETURN DBMS_LOB.GETLENGTH(a);
+ END;
+/
\ No newline at end of file
Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlConstants.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlConstants.java 2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlConstants.java 2010-01-07 19:11:34 UTC (rev 1553)
@@ -84,7 +84,28 @@
static final String[] STMT_ANALYZE = {"ANALYZE"};
static final String[] STMT_ASSOCIATE_STATISTICS = {"ASSOCIATE", "STATISTICS"};
static final String[] STMT_AUDIT = {"AUDIT"};
- static final String[] STMT_COMMIT = {"COMMIT"};
+
+ /*
+ COMMIT [ WORK ] [ [ COMMENT string ]
+ | [ WRITE [ IMMEDIATE | BATCH ] [ WAIT | NOWAIT ] ]
+ | FORCE string [, integer ] ] ;
+
+ COMMIT WORK COMMENT "some comment"
+
+ COMMIT COMMENT "some comment"
+
+ COMMIT WORK WRITE [ IMMEDIATE | BATCH ] [ WAIT | NOWAIT ]
+
+ COMMIT WRITE IMMEDIATE NOWAIT;
+
+ COMMIT WORK WRITE IMMEDIATE NOWAIT;
+
+ COMMIT FORCE "some string", 10;
+ */
+ static final String[] STMT_COMMIT_WORK = {"COMMIT", "WORK"};
+ static final String[] STMT_COMMIT_WRITE = {"COMMIT", "WRITE"};
+ static final String[] STMT_COMMIT_FORCE = {"COMMIT", "FORCE"};
+ static final String[] STMT_COMMIT = {"COMMIT"}; // DON"T REGISTER THIS STMT
static final String[] STMT_COMMENT_ON = {"COMMENT", "ON"};
static final String[] STMT_CREATE_CLUSTER = {CREATE, "CLUSTER"};
@@ -99,7 +120,8 @@
static final String[] STMT_CREATE_INDEXTYPE = {CREATE, "INDEXTYPE"};
static final String[] STMT_CREATE_JAVA = {CREATE, "JAVA"};
static final String[] STMT_CREATE_LIBRARY = {CREATE, "LIBRARY"}; // PARSE UNTIL '/'
- static final String[] STMT_CREATE_MATERIALIZED = {CREATE, "MATERIALIZED"};
+ static final String[] STMT_CREATE_MATERIALIZED_VIEW = {CREATE, "MATERIALIZED", "VIEW"};
+ static final String[] STMT_CREATE_MATERIALIZED_VEIW_LOG = {CREATE, "MATERIALIZED", "VIEW", "LOG"};
static final String[] STMT_CREATE_OPERATOR = {CREATE, "OPERATOR"};
static final String[] STMT_CREATE_OR_REPLACE_DIRECTORY = {CREATE, "OR", "REPLACE", "DIRECTORY"}; // PARSE UNTIL '/'
static final String[] STMT_CREATE_OR_REPLACE_FUNCTION = {CREATE, "OR", "REPLACE", "FUNCTION"}; // PARSE UNTIL '/'
@@ -108,6 +130,7 @@
static final String[] STMT_CREATE_OR_REPLACE_PUBLIC_OUTLINE = {CREATE,"OR", "REPLACE", "PUBLIC", "OUTLINE"}; // TODO: BML
static final String[] STMT_CREATE_OR_REPLACE_PRIVATE_OUTLINE = {CREATE,"OR", "REPLACE", "PRIVATE", "OUTLINE"}; // TODO: BML
static final String[] STMT_CREATE_OR_REPLACE_PACKAGE = {CREATE,"OR", "REPLACE", "PACKAGE"};
+ static final String[] STMT_CREATE_OR_REPLACE_PROCEDURE = {CREATE,"OR", "REPLACE", "PROCEDURE"}; // PARSE UNTIL '/'
static final String[] STMT_CREATE_OR_REPLACE_PUBLIC_SYNONYM = {CREATE, "OR", "REPLACE", "PUBLIC", "SYNONYM"};
static final String[] STMT_CREATE_OR_REPLACE_SYNONYM = {CREATE, "OR", "REPLACE", "SYNONYM"};
static final String[] STMT_CREATE_OR_REPLACE_TRIGGER = {CREATE, "OR", "REPLACE", "TRIGGER"}; // PARSE UNTIL '/
@@ -135,24 +158,29 @@
public static final String[][] CREATE_PHRASES = {
STMT_CREATE_CLUSTER, STMT_CREATE_CONTEXT, STMT_CREATE_CONTROLFILE, STMT_CREATE_DATABASE, STMT_CREATE_DIMENSION,
STMT_CREATE_DIRECTORY, STMT_CREATE_DISKGROUP, STMT_CREATE_FUNCTION, STMT_CREATE_INDEX, STMT_CREATE_INDEXTYPE,
- STMT_CREATE_JAVA, STMT_CREATE_MATERIALIZED, STMT_CREATE_OPERATOR, STMT_CREATE_OR_REPLACE_DIRECTORY,
- STMT_CREATE_OR_REPLACE_OUTLINE,
- STMT_CREATE_OR_REPLACE_PUBLIC_SYNONYM, STMT_CREATE_OR_REPLACE_SYNONYM,
+ STMT_CREATE_JAVA, STMT_CREATE_MATERIALIZED_VIEW, STMT_CREATE_MATERIALIZED_VEIW_LOG, STMT_CREATE_OPERATOR,
+ STMT_CREATE_OR_REPLACE_DIRECTORY, STMT_CREATE_OR_REPLACE_FUNCTION, STMT_CREATE_LIBRARY,
+ STMT_CREATE_OR_REPLACE_LIBRARY, STMT_CREATE_OR_REPLACE_OUTLINE, STMT_CREATE_OR_REPLACE_PROCEDURE,
+ STMT_CREATE_OR_REPLACE_PUBLIC_SYNONYM, STMT_CREATE_OR_REPLACE_SYNONYM, STMT_CREATE_OR_REPLACE_PACKAGE, STMT_CREATE_OR_REPLACE_TRIGGER,
STMT_CREATE_OR_REPLACE_TYPE, STMT_CREATE_OUTLINE, STMT_CREATE_PACKAGE, STMT_CREATE_PFILE, STMT_CREATE_PROCEDURE,
STMT_CREATE_PROFILE, STMT_CREATE_PUBLIC_DATABASE, STMT_CREATE_PUBLIC_ROLLBACK, STMT_CREATE_PUBLIC_SYNONYM, STMT_CREATE_ROLE,
- STMT_CREATE_ROLLBACK, STMT_CREATE_SEQUENCE, STMT_CREATE_SPFILE, STMT_CREATE_SYNONYM, STMT_CREATE_TABLESPACE,
+ STMT_CREATE_ROLLBACK, STMT_CREATE_SEQUENCE, STMT_CREATE_SPFILE, STMT_CREATE_SYNONYM, STMT_CREATE_TABLESPACE, STMT_CREATE_TRIGGER,
STMT_CREATE_TYPE, STMT_CREATE_USER, STMT_CREATE_UNIQUE_INDEX, STMT_CREATE_BITMAP_INDEX,
STMT_CREATE_TABLESPACE, STMT_CREATE_PROCEDURE
};
- public static final String[][] IGNORABLE_CREATE_PHRASES_WITH_SLASHES = {
- STMT_CREATE_LIBRARY, STMT_CREATE_OR_REPLACE_FUNCTION,
- STMT_CREATE_OR_REPLACE_LIBRARY,
- STMT_CREATE_OR_REPLACE_PACKAGE, STMT_CREATE_OR_REPLACE_TRIGGER,
- STMT_CREATE_TRIGGER
- };
+ static final String[][] SLASHED_STMT_PHRASES = {
+ STMT_CREATE_FUNCTION,
+ STMT_CREATE_LIBRARY,
+ STMT_CREATE_OR_REPLACE_DIRECTORY,
+ STMT_CREATE_OR_REPLACE_FUNCTION,
+ STMT_CREATE_OR_REPLACE_LIBRARY,
+ STMT_CREATE_OR_REPLACE_PROCEDURE,
+ STMT_CREATE_OR_REPLACE_TRIGGER,
+ STMT_CREATE_PACKAGE,
+ STMT_CREATE_PROCEDURE
+ };
-
static final String[] STMT_DISASSOCIATE_STATISTICS = {"DISASSOCIATE", "STATISTICS"};
static final String[] STMT_DROP_CLUSTER = {DROP, "CLUSTER"};
@@ -214,7 +242,8 @@
};
static final String[][] MISC_PHRASES = {
- STMT_ANALYZE, STMT_ASSOCIATE_STATISTICS, STMT_AUDIT, STMT_COMMIT, STMT_COMMENT_ON, STMT_DISASSOCIATE_STATISTICS,
+ STMT_ANALYZE, STMT_ASSOCIATE_STATISTICS, STMT_AUDIT, STMT_COMMIT_WORK, STMT_COMMIT_WRITE, STMT_COMMIT_FORCE,
+ STMT_COMMENT_ON, STMT_DISASSOCIATE_STATISTICS,
STMT_EXPLAIN_PLAN, STMT_FLASHBACK, STMT_LOCK_TABLE, STMT_MERGE, STMT_NOAUDIT, STMT_PURGE,
STMT_RENAME, STMT_ROLLBACK_TO_SAVEPOINT, STMT_ROLLBACK_WORK, STMT_ROLLBACK, STMT_SAVEPOINT, STMT_TRUNCATE
};
Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlLexicon.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlLexicon.java 2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlLexicon.java 2010-01-07 19:11:34 UTC (rev 1553)
@@ -51,7 +51,8 @@
public static final Name TYPE_CREATE_INDEXTYPE_STATEMENT = new BasicName(Namespace.URI, "createIndextypeStatement");
public static final Name TYPE_CREATE_JAVA_STATEMENT = new BasicName(Namespace.URI, "createJavaStatement");
public static final Name TYPE_CREATE_LIBRARY_STATEMENT = new BasicName(Namespace.URI, "createLibraryStatement");
- public static final Name TYPE_CREATE_MATERIALIZED_STATEMENT = new BasicName(Namespace.URI, "createMaterializedStatement");
+ public static final Name TYPE_CREATE_MATERIALIZED_VIEW_STATEMENT = new BasicName(Namespace.URI, "createMaterializedViewStatement");
+ public static final Name TYPE_CREATE_MATERIALIZED_VIEW_LOG_STATEMENT = new BasicName(Namespace.URI, "createMaterializedViewLogStatement");
public static final Name TYPE_CREATE_OPERATOR_STATEMENT = new BasicName(Namespace.URI, "createOperatorStatement");
public static final Name TYPE_CREATE_OUTLINE_STATEMENT = new BasicName(Namespace.URI, "createOutlineStatement");
public static final Name TYPE_CREATE_PACKAGE_STATEMENT = new BasicName(Namespace.URI, "createPackageStatement");
@@ -149,13 +150,19 @@
public static final Name TYPE_RENAME_COLUMN = new BasicName(Namespace.URI, "renameColumn");
public static final Name TYPE_RENAME_CONSTRAINT = new BasicName(Namespace.URI, "renameConstraint");
+ public static final Name TYPE_FUNCTION_PARAMETER = new BasicName(Namespace.URI, "functionParameter");
// PROPERTY NAMES
public static final Name TARGET_OBJECT_TYPE = new BasicName(Namespace.URI, "targetObjectType");
public static final Name TARGET_OBJECT_NAME = new BasicName(Namespace.URI, "targetObjectName");
- public static final Name COMMENT = new BasicName(Namespace.URI, "comment");
- public static final Name UNIQUE_INDEX = new BasicName(Namespace.URI, "unique");
- public static final Name BITMAP_INDEX = new BasicName(Namespace.URI, "bitmap");
- public static final Name TABLE_NAME = new BasicName(Namespace.URI, "tableName");
+ public static final Name COMMENT = new BasicName(Namespace.URI, "comment");
+ public static final Name UNIQUE_INDEX = new BasicName(Namespace.URI, "unique");
+ public static final Name BITMAP_INDEX = new BasicName(Namespace.URI, "bitmap");
+ public static final Name TABLE_NAME = new BasicName(Namespace.URI, "tableName");
+ public static final Name DEFAULT = new BasicName(Namespace.URI, "default");
+ public static final Name DEFAULT_EXPRESSION = new BasicName(Namespace.URI, "defaultExpression");
+ public static final Name IN_OUT_NO_COPY = new BasicName(Namespace.URI, "inOutNoCopy");
+ public static final Name AUTHID_VALUE = new BasicName(Namespace.URI, "authIdValue");
+
}
Modified: trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java 2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java 2010-01-07 19:11:34 UTC (rev 1553)
@@ -24,20 +24,18 @@
package org.jboss.dna.sequencer.ddl.dialect.oracle;
import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.CREATE_VIEW_QUERY_EXPRESSION;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_REFERENCE;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT;
import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DROP_BEHAVIOR;
import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.DROP_OPTION_TYPE;
import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.NEW_NAME;
import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_ALTER_TABLE_STATEMENT;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_COLUMN_REFERENCE;
+import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_CREATE_VIEW_STATEMENT;
import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_COLUMN_DEFINITION;
import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_TABLE_CONSTRAINT_DEFINITION;
import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_DROP_TABLE_STATEMENT;
import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_GRANT_STATEMENT;
-import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_MISSING_TERMINATOR;
import static org.jboss.dna.sequencer.ddl.StandardDdlLexicon.TYPE_UNKNOWN_STATEMENT;
import static org.jboss.dna.sequencer.ddl.dialect.oracle.OracleDdlLexicon.*;
-import static org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon.TYPE_PREPARE_STATEMENT;
import java.util.ArrayList;
import java.util.List;
import org.jboss.dna.common.text.ParsingException;
@@ -101,7 +99,6 @@
registerStatementStartPhrase(ALTER_PHRASES);
registerStatementStartPhrase(CREATE_PHRASES);
registerStatementStartPhrase(DROP_PHRASES);
- registerStatementStartPhrase(IGNORABLE_CREATE_PHRASES_WITH_SLASHES);
registerStatementStartPhrase(MISC_PHRASES);
registerStatementStartPhrase(SET_PHRASES);
}
@@ -112,29 +109,17 @@
assert tokens != null;
assert rootNode != null;
- // We may hava a prepare statement that is followed by a missing terminator node
+ // We may have a prepare statement that is followed by a missing terminator node
// We also may have nodes that have an extra terminator node representing the '/' backslash
// These nodes will have type "TYPE_BACKSLASH_TERMINATOR".
List<AstNode> copyOfNodes = new ArrayList<AstNode>(rootNode.getChildren());
- AstNode prepareNode = null;
+
AstNode complexNode = null;
- boolean mergeNextStatement = false;
+
for (AstNode child : copyOfNodes) {
- if (prepareNode != null && mergeNextStatement) {
- mergeNodes(tokens, prepareNode, child);
- rootNode.removeChild(child);
- prepareNode = null;
- }
- if (prepareNode != null && nodeFactory().hasMixinType(child, TYPE_MISSING_TERMINATOR)) {
- mergeNextStatement = true;
- } else {
- prepareNode = null;
- mergeNextStatement = false;
- }
-
if ((complexNode != null && nodeFactory().hasMixinType(child, TYPE_UNKNOWN_STATEMENT))
|| (complexNode != null && nodeFactory().hasMixinType(child, TYPE_BACKSLASH_TERMINATOR))) {
mergeNodes(tokens, complexNode, child);
@@ -143,16 +128,13 @@
complexNode = null;
}
- if (nodeFactory().hasMixinType(child, TYPE_PREPARE_STATEMENT)) {
- prepareNode = child;
- complexNode = null;
- } else if (nodeFactory().hasMixinType(child, TYPE_CREATE_FUNCTION_STATEMENT)
+
+ if (nodeFactory().hasMixinType(child, TYPE_CREATE_FUNCTION_STATEMENT)
|| nodeFactory().hasMixinType(child, TYPE_CREATE_TRIGGER_STATEMENT)
|| nodeFactory().hasMixinType(child, TYPE_CREATE_LIBRARY_STATEMENT)
|| nodeFactory().hasMixinType(child, TYPE_CREATE_PACKAGE_STATEMENT)
|| nodeFactory().hasMixinType(child, TYPE_CREATE_PROCEDURE_STATEMENT)) {
complexNode = child;
- prepareNode = null;
}
}
@@ -249,7 +231,7 @@
return parseStatement(tokens, STMT_ASSOCIATE_STATISTICS, parentNode, TYPE_ASSOCIATE_STATISTICS_STATEMENT);
} else if (tokens.matches(STMT_AUDIT)) {
return parseStatement(tokens, STMT_AUDIT, parentNode, TYPE_AUDIT_STATEMENT);
- } else if (tokens.matches(STMT_COMMIT)) {
+ } else if (tokens.matches(STMT_COMMIT_FORCE) || tokens.matches(STMT_COMMIT_WORK) || tokens.matches(STMT_COMMIT_WRITE)) {
return parseStatement(tokens, STMT_COMMIT, parentNode, TYPE_COMMIT_STATEMENT);
} else if (tokens.matches(STMT_DISASSOCIATE_STATISTICS)) {
return parseStatement(tokens, STMT_DISASSOCIATE_STATISTICS, parentNode, TYPE_DISASSOCIATE_STATISTICS_STATEMENT);
@@ -314,10 +296,10 @@
return parseStatement(tokens, STMT_CREATE_DISKGROUP, parentNode, TYPE_CREATE_DISKGROUP_STATEMENT);
} else if (tokens.matches(STMT_CREATE_FUNCTION)) {
// ============ > PARSE UNTIL '/' for STMT_CREATE_FUNCTION
- return parseStatement(tokens, STMT_CREATE_FUNCTION, parentNode, TYPE_CREATE_FUNCTION_STATEMENT);
+ return parseCreateFunctionStatement(tokens, parentNode);
} else if (tokens.matches(STMT_CREATE_OR_REPLACE_FUNCTION)) {
// ============ > PARSE UNTIL '/' for STMT_CREATE_OR_REPLACE_FUNCTION
- return parseStatement(tokens, STMT_CREATE_OR_REPLACE_FUNCTION, parentNode, TYPE_CREATE_FUNCTION_STATEMENT);
+ return parseCreateFunctionStatement(tokens, parentNode);
} else if (tokens.matches(STMT_CREATE_INDEXTYPE)) {
return parseStatement(tokens, STMT_CREATE_INDEXTYPE, parentNode, TYPE_CREATE_INDEXTYPE_STATEMENT);
} else if (tokens.matches(STMT_CREATE_JAVA)) {
@@ -328,8 +310,8 @@
} else if (tokens.matches(STMT_CREATE_OR_REPLACE_LIBRARY)) {
// ============ > PARSE UNTIL '/' STMT_CREATE_OR_REPLACE_LIBRARY
return parseStatement(tokens, STMT_CREATE_OR_REPLACE_LIBRARY, parentNode, TYPE_CREATE_LIBRARY_STATEMENT);
- } else if (tokens.matches(STMT_CREATE_MATERIALIZED)) {
- return parseStatement(tokens, STMT_CREATE_MATERIALIZED, parentNode, TYPE_CREATE_MATERIALIZED_STATEMENT);
+ } else if (tokens.matches(STMT_CREATE_MATERIALIZED_VIEW)) {
+ return parseMaterializedViewStatement(tokens, parentNode);
} else if (tokens.matches(STMT_CREATE_OPERATOR)) {
return parseStatement(tokens, STMT_CREATE_OPERATOR, parentNode, TYPE_CREATE_OPERATOR_STATEMENT);
} else if (tokens.matches(STMT_CREATE_OUTLINE)) {
@@ -346,7 +328,10 @@
return parseStatement(tokens, STMT_CREATE_PFILE, parentNode, TYPE_CREATE_PFILE_STATEMENT);
} else if (tokens.matches(STMT_CREATE_PROCEDURE)) {
// ============ > PARSE UNTIL '/' for STMT_CREATE_PROCEDURE
- return parseStatement(tokens, STMT_CREATE_PROCEDURE, parentNode, TYPE_CREATE_PROCEDURE_STATEMENT);
+ return parseCreateProcedureStatement(tokens, parentNode);
+ } else if (tokens.matches(STMT_CREATE_OR_REPLACE_PROCEDURE)) {
+ // ============ > PARSE UNTIL '/' for STMT_CREATE_PROCEDURE
+ return parseCreateProcedureStatement(tokens, parentNode);
} else if (tokens.matches(STMT_CREATE_PROFILE)) {
return parseStatement(tokens, STMT_CREATE_PROFILE, parentNode, TYPE_CREATE_PROFILE_STATEMENT);
} else if (tokens.matches(STMT_CREATE_ROLE)) {
@@ -413,7 +398,263 @@
return node;
}
+
+ /**
+ * Parses DDL CREATE FUNCTION statement
+ *
+ * @param tokens the tokenized {@link DdlTokenStream} of the DDL input content; may not be null
+ * @param parentNode the parent {@link AstNode} node; may not be null
+ * @return the parsed CREATE FUNCTION statement node
+ * @throws ParsingException
+ */
+ protected AstNode parseCreateFunctionStatement( DdlTokenStream tokens,
+ AstNode parentNode ) throws ParsingException {
+ assert tokens != null;
+ assert parentNode != null;
+ markStartOfStatement(tokens);
+
+ /* ----------------------------------------------------------------------
+ CREATE [ OR REPLACE ] FUNCTION [ schema. ] function_name
+ [ ( parameter_declaration [, parameter_declaration] )
+ ]
+ RETURN datatype
+ [ { invoker_rights_clause
+ | DETERMINISTIC
+ | parallel_enable_clause
+ | result_cache_clause
+ }...
+ ]
+ { { AGGREGATE | PIPELINED }
+ USING [ schema. ] implementation_type
+ | [ PIPELINED ] { IS | AS } { [ declare_section ] body | call_spec }
+ } ;
+
+ parameter_declaration = parameter_name [ IN | { { OUT | { IN OUT }} [ NOCOPY ] } ] datatype [ { := | DEFAULT } expression ]
+ ---------------------------------------------------------------------- */
+
+ boolean isReplace = tokens.canConsume(STMT_CREATE_OR_REPLACE_FUNCTION);
+
+ tokens.canConsume(STMT_CREATE_FUNCTION);
+
+ String name = parseName(tokens);
+
+ AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_FUNCTION_STATEMENT);
+
+ if (isReplace) {
+ // TODO: SET isReplace = TRUE to node (possibly a cnd mixin of "replaceable"
+ }
+
+ boolean ok = parseParameters(tokens, node);
+
+ if( ok ) {
+ if( tokens.canConsume("RETURN")) {
+ DataType dType = getDatatypeParser().parse(tokens);
+ if( dType != null ) {
+ getDatatypeParser().setPropertiesOnNode(node, dType);
+ }
+ }
+ }
+
+ parseUntilFwdSlash(tokens, false);
+
+ tokens.canConsume("/");
+
+ markEndOfStatement(tokens, node);
+
+ return node;
+ }
+
+ /**
+ * Parses DDL CREATE PROCEDURE statement
+ *
+ * @param tokens the tokenized {@link DdlTokenStream} of the DDL input content; may not be null
+ * @param parentNode the parent {@link AstNode} node; may not be null
+ * @return the parsed CREATE PROCEDURE statement node
+ * @throws ParsingException
+ */
+ protected AstNode parseCreateProcedureStatement( DdlTokenStream tokens,
+ AstNode parentNode ) throws ParsingException {
+ assert tokens != null;
+ assert parentNode != null;
+
+ markStartOfStatement(tokens);
+ /* ----------------------------------------------------------------------
+ CREATE [ OR REPLACE ] PROCEDURE [ schema. ] procedure_name
+ [ ( parameter_declaration [, parameter_declaration ] ) ]
+ [ AUTHID { CURRENT_USER | DEFINER ]
+ { IS | AS }
+ { [ declare_section ] body | call_spec | EXTERNAL} ;
+
+ call_spec = LANGUAGE { Java_declaration | C_declaration }
+
+ Java_declaration = JAVA NAME string
+
+ C_declaration =
+ C [ NAME name ]
+ LIBRARY lib_name
+ [ AGENT IN (argument[, argument ]...) ]
+ [ WITH CONTEXT ]
+ [ PARAMETERS (parameter[, parameter ]...) ]
+
+ parameter_declaration = parameter_name [ IN | { { OUT | { IN OUT }} [ NOCOPY ] } ] datatype [ { := | DEFAULT } expression ]
+ ---------------------------------------------------------------------- */
+
+ boolean isReplace = tokens.canConsume(STMT_CREATE_OR_REPLACE_PROCEDURE);
+
+ tokens.canConsume(STMT_CREATE_PROCEDURE);
+
+ String name = parseName(tokens);
+
+ AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_PROCEDURE_STATEMENT);
+
+ if (isReplace) {
+ // TODO: SET isReplace = TRUE to node (possibly a cnd mixin of "replaceable"
+ }
+
+ boolean ok = parseParameters(tokens, node);
+
+ if( ok ) {
+ if( tokens.canConsume("AUTHID")) {
+ if( tokens.canConsume("CURRENT_USER")) {
+ node.setProperty(AUTHID_VALUE, "AUTHID CURRENT_USER");
+ } else {
+ tokens.consume("DEFINER");
+ node.setProperty(AUTHID_VALUE, "DEFINER");
+ }
+ }
+ }
+
+ parseUntilFwdSlash(tokens, false);
+
+ tokens.canConsume("/");
+
+ markEndOfStatement(tokens, node);
+
+ return node;
+ }
+
+
+ private boolean parseParameters( DdlTokenStream tokens, AstNode procedureNode) throws ParsingException {
+ assert tokens != null;
+ assert procedureNode != null;
+
+ // parameter_declaration = parameter_name [ IN | { { OUT | { IN OUT }} [ NOCOPY ] } ] datatype [ { := | DEFAULT } expression ]
+ // Assume we start with open parenthesis '(', then we parse comma separated list of function parameters
+ // which have the form: [ parameter-Name ] DataType
+ // So, try getting datatype, if datatype == NULL, then parseName() & parse datatype, then repeat as long as next token is ","
+
+ tokens.consume(L_PAREN); // EXPECTED
+
+ while (!tokens.canConsume(R_PAREN)) {
+
+ String paramName = parseName(tokens);
+ String inOutStr = null;
+ if( tokens.matches("IN")) {
+ if( tokens.canConsume("IN", "OUT")){
+ if( tokens.canConsume("NOCOPY")) {
+ inOutStr = "IN OUT NOCOPY";
+ } else {
+ inOutStr = "IN OUT";
+ }
+ } else {
+ tokens.consume("IN");
+ inOutStr = "IN";
+ }
+
+ } else if( tokens.matches("OUT")) {
+ if( tokens.canConsume("OUT", "NOCOPY")) {
+ inOutStr = "OUT NOCOPY";
+ } else {
+ tokens.consume("OUT");
+ inOutStr = "OUT";
+ }
+ }
+
+ DataType datatype = getDatatypeParser().parse(tokens);
+ AstNode paramNode = nodeFactory().node(paramName, procedureNode, TYPE_FUNCTION_PARAMETER);
+ if( datatype != null ) {
+ getDatatypeParser().setPropertiesOnNode(paramNode, datatype);
+ }
+
+ if( tokens.matchesAnyOf(":=", "DEFAULT") || !tokens.matchesAnyOf(COMMA, R_PAREN)) {
+ String msg = DdlSequencerI18n.unsupportedProcedureParameterDeclaration.text(procedureNode.getProperty(StandardDdlLexicon.NAME));
+ DdlParserProblem problem = new DdlParserProblem(Problems.WARNING, getCurrentMarkedPosition(), msg);
+ addProblem(problem, procedureNode);
+ return false;
+ }
+
+ if( inOutStr != null ) {
+ paramNode.setProperty(IN_OUT_NO_COPY, inOutStr);
+ }
+
+ tokens.canConsume(COMMA);
+ }
+
+ return true;
+ }
+
+ /**
+ * Parses DDL CREATE MATERIALIZED VIEW statement
+ *
+ * This could either be a standard view or a VIEW LOG ON statement.
+ *
+ * @param tokens the tokenized {@link DdlTokenStream} of the DDL input content; may not be null
+ * @param parentNode the parent {@link AstNode} node; may not be null
+ * @return the parsed CREATE MATERIALIZED VIEW statement node
+ * @throws ParsingException
+ */
+ protected AstNode parseMaterializedViewStatement( DdlTokenStream tokens,
+ AstNode parentNode ) throws ParsingException {
+ assert tokens != null;
+ assert parentNode != null;
+
+ markStartOfStatement(tokens);
+
+ /* ----------------------------------------------------------------------
+ CREATE MATERIALIZED VIEW
+ [ schema. ]materialized_view
+ [ column_alias [, column_alias]... ]
+ [ OF [ schema. ]object_type ] .................... (MORE...)
+
+ EXAMPLES:
+
+ CREATE MATERIALIZED VIEW LOG ON products
+ WITH ROWID, SEQUENCE (prod_id)
+ INCLUDING NEW VALUES;
+
+ CREATE MATERIALIZED VIEW sales_mv
+ BUILD IMMEDIATE
+ REFRESH FAST ON COMMIT
+ AS SELECT t.calendar_year, p.prod_id,
+ SUM(s.amount_sold) AS sum_sales
+ FROM times t, products p, sales s
+ WHERE t.time_id = s.time_id AND p.prod_id = s.prod_id
+ GROUP BY t.calendar_year, p.prod_id;
+ ---------------------------------------------------------------------- */
+
+ boolean isLog = tokens.canConsume(STMT_CREATE_MATERIALIZED_VEIW_LOG);
+
+ tokens.canConsume(STMT_CREATE_MATERIALIZED_VIEW);
+
+ String name = parseName(tokens);
+
+ AstNode node = null;
+
+ if( isLog ) {
+ node = nodeFactory().node(name, parentNode, TYPE_CREATE_MATERIALIZED_VIEW_LOG_STATEMENT);
+ } else {
+ node = nodeFactory().node(name, parentNode, TYPE_CREATE_MATERIALIZED_VIEW_STATEMENT);
+ }
+
+ parseUntilTerminator(tokens);
+
+ markEndOfStatement(tokens, node);
+
+ return node;
+ }
+
+
@Override
protected AstNode parseGrantStatement( DdlTokenStream tokens,
AstNode parentNode ) throws ParsingException {
@@ -1192,7 +1433,7 @@
// TODO: Oracle has changed some things between versions 9i, and 10/11,
// Basically they've added column properties (i.e. SORT option, ENCRYPT encryption_spec)
- // Need to 1) Override parseColumnDefinition to handle these.
+ // Need to 1) Override parseColumnDefinition shouldParseOracleProceduresAndFunctionsto handle these.
String tableElementString = getTableElementsString(tokens, false);
@@ -1265,17 +1506,32 @@
boolean stopAtStatementStart ) throws ParsingException {
StringBuffer sb = new StringBuffer();
if (stopAtStatementStart) {
- while (tokens.hasNext() && !tokens.matches(DdlTokenizer.STATEMENT_KEY) && !tokens.matches('/')) { // !tokens.matches(DdlTokenizer.STATEMENT_KEY)
+ while (tokens.hasNext()
+
+ && !tokens.matches(DdlTokenizer.STATEMENT_KEY)
+ && !tokens.matches('/')) { // !tokens.matches(DdlTokenizer.STATEMENT_KEY)
// &&
sb.append(SPACE).append(tokens.consume());
}
} else {
- while (tokens.hasNext() && !tokens.matches('/')) { // !tokens.matches(DdlTokenizer.STATEMENT_KEY) &&
+ while (tokens.hasNext()
+ && !isFwdSlashedStatement(tokens)
+ && !tokens.matches('/')) { // !tokens.matches(DdlTokenizer.STATEMENT_KEY) &&
sb.append(SPACE).append(tokens.consume());
}
}
return sb.toString();
}
+
+ private boolean isFwdSlashedStatement( DdlTokenStream tokens ) throws ParsingException {
+ for(int i=0; i< SLASHED_STMT_PHRASES.length; i++ ) {
+ if( tokens.matches(SLASHED_STMT_PHRASES[i])) {
+ return true;
+ }
+ }
+
+ return false;
+ }
private void consumeSlash( DdlTokenStream tokens ) throws ParsingException {
tokens.canConsume("/");
Modified: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties 2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/DdlSequencerI18n.properties 2010-01-07 19:11:34 UTC (rev 1553)
@@ -30,4 +30,5 @@
unusedTokensParsingColumnDefinition = The following unused tokens were found parsing a column definition for table: {0}.
alterTableOptionNotFound = ALTER TABLE Option not found. Check your DDL for incomplete statement near line {0}, column {1}
unusedTokensParsingCreateIndex = The following unused tokens were found parsing a create index statement: {0}.
-missingReturnTypeForFunction = The function {0} is missing a return data type.
\ No newline at end of file
+missingReturnTypeForFunction = The function {0} is missing a return data type.
+unsupportedProcedureParameterDeclaration = The procedure {0} contains parameters with unsupported expression info.
\ No newline at end of file
Deleted: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd 2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd 2010-01-07 19:11:34 UTC (rev 1553)
@@ -1,202 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * 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.
- * See the AUTHORS.txt file in the distribution for a full listing of
- * individual contributors.
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you 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.
- *
- * JBoss DNA 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
- //------------------------------------------------------------------------------
-// N A M E S P A C E S
-//------------------------------------------------------------------------------
-<jcr='http://www.jcp.org/jcr/1.0'>
-<nt='http://www.jcp.org/jcr/nt/1.0'>
-<mix='http://www.jcp.org/jcr/mix/1.0'>
-<ddl='http://www.jboss.org/dna/ddl/1.0'>
-<oracleddl='http://www.jboss.org/dna/ddl/oracle/1.0'>
-
-// =============================================================================
-// OPERANDS
-// =============================================================================
-[oracleddl:clusterOperand] > ddl:operand abstract
-[oracleddl:commentOperand] > ddl:operand abstract
-[oracleddl:contextOperand] > ddl:operand abstract
-[oracleddl:controlfileOperand] > ddl:operand abstract
-[oracleddl:databaseOperand] > ddl:operand abstract
-[oracleddl:dimensionOperand] > ddl:operand abstract
-[oracleddl:directoryOperand] > ddl:operand abstract
-[oracleddl:diskgroupOperand] > ddl:operand abstract
-[oracleddl:functionOperand] > ddl:operand abstract
-[oracleddl:indexOperand] > ddl:operand abstract
-[oracleddl:indextypeOperand] > ddl:operand abstract
-[oracleddl:javaOperand] > ddl:operand abstract
-[oracleddl:libraryOperand] > ddl:operand abstract
-[oracleddl:materializedOperand] > ddl:operand abstract
-[oracleddl:operatorOperand] > ddl:operand abstract
-[oracleddl:outlineOperand] > ddl:operand abstract
-[oracleddl:packageOperand] > ddl:operand abstract
-[oracleddl:pfileOperand] > ddl:operand abstract
-[oracleddl:procedureOperand] > ddl:operand abstract
-[oracleddl:profileOperand] > ddl:operand abstract
-[oracleddl:resourceOperand] > ddl:operand abstract
-[oracleddl:roleOperand] > ddl:operand abstract
-[oracleddl:rollbackOperand] > ddl:operand abstract
-[oracleddl:sequenceOperand] > ddl:operand abstract
-[oracleddl:sessionOperand] > ddl:operand abstract
-[oracleddl:spfileOperand] > ddl:operand abstract
-[oracleddl:systemOperand] > ddl:operand abstract
-[oracleddl:synonymOperand] > ddl:operand abstract
-[oracleddl:tablespaceOperand] > ddl:operand abstract
-[oracleddl:triggerOperand] > ddl:operand abstract
-[oracleddl:typeOperand] > ddl:operand abstract
-[oracleddl:userOperand] > ddl:operand abstract
-
-// =============================================================================
-// COLUMN
-// =============================================================================
-[oracleddl:columnDefinition] > ddl:columnDefinition
- - oracleddl:dropDefault (boolean)
-
-// =============================================================================
-// ALTER STATEMENTS
-// =============================================================================
-[oracleddl:alterClusterStatement] > ddl:alterable, ddl:statement, oracleddl:clusterOperand mixin
-[oracleddl:alterDatabaseStatement] > ddl:alterable, ddl:statement, oracleddl:databaseOperand mixin
-[oracleddl:alterDimensionStatement] > ddl:alterable, ddl:statement, oracleddl:dimensionOperand mixin
-[oracleddl:alterDiskgroupStatement] > ddl:alterable, ddl:statement, oracleddl:diskgroupOperand mixin
-[oracleddl:alterFunctionStatement] > ddl:alterable, ddl:statement, oracleddl:functionOperand mixin
-[oracleddl:alterIndexStatement] > ddl:alterable, ddl:statement, oracleddl:indexOperand mixin
-[oracleddl:alterIndextypeStatement] > ddl:alterable, ddl:statement, oracleddl:indextypeOperand mixin
-[oracleddl:alterJavaStatement] > ddl:alterable, ddl:statement, oracleddl:javaOperand mixin
-[oracleddl:alterMaterializedStatement] > ddl:alterable, ddl:statement, oracleddl:materializedOperand mixin
-[oracleddl:alterOperatorStatement] > ddl:alterable, ddl:statement, oracleddl:operatorOperand mixin
-[oracleddl:alterOutlineStatement] > ddl:alterable, ddl:statement, oracleddl:outlineOperand mixin
-[oracleddl:alterPackageStatement] > ddl:alterable, ddl:statement, oracleddl:packageOperand mixin
-[oracleddl:alterProcedureStatement] > ddl:alterable, ddl:statement, oracleddl:procedureOperand mixin
-[oracleddl:alterProfileStatement] > ddl:alterable, ddl:statement, oracleddl:profileOperand mixin
-[oracleddl:alterResourceStatement] > ddl:alterable, ddl:statement, oracleddl:resourceOperand mixin
-[oracleddl:alterRoleStatement] > ddl:alterable, ddl:statement, oracleddl:roleOperand mixin
-[oracleddl:alterRollbackStatement] > ddl:alterable, ddl:statement, oracleddl:rollbackOperand mixin
-[oracleddl:alterSequenceStatement] > ddl:alterable, ddl:statement, oracleddl:sequenceOperand mixin
-[oracleddl:alterSessionStatement] > ddl:alterable, ddl:statement, oracleddl:sessionOperand mixin
-[oracleddl:alterSystemStatement] > ddl:alterable, ddl:statement, oracleddl:systemOperand mixin
-[oracleddl:alterTablespaceStatement] > ddl:alterable, ddl:statement, oracleddl:tablespaceOperand mixin
-[oracleddl:alterTriggerStatement] > ddl:alterable, ddl:statement, oracleddl:triggerOperand mixin
-[oracleddl:alterTypeStatement] > ddl:alterable, ddl:statement, oracleddl:typeOperand mixin
-[oracleddl:alterUserStatement] > ddl:alterable, ddl:statement, oracleddl:userOperand mixin
-[oracleddl:alterViewStatement] > ddl:alterable, ddl:statement, ddl:viewOperand mixin
-
-[oracleddl:alterTableStatement] > ddl:alterTableStatement mixin
- - oracleddl:newTableName (STRING)
- + oracleddl:renameColumn (ddl:renamable) = ddl:renamable multiple
- + oracleddl:renameConstraint (ddl:renamable) = ddl:renamable multiple
-
-// =============================================================================
-// CREATE STATEMENTS
-// =============================================================================
-
-[oracleddl:createClusterStatement] > ddl:creatable, ddl:statement, oracleddl:clusterOperand mixin
-[oracleddl:createContextStatement] > ddl:creatable, ddl:statement, oracleddl:contextOperand mixin
-[oracleddl:createControlfileStatement] > ddl:creatable, ddl:statement, oracleddl:controlfileOperand mixin
-[oracleddl:createDatabaseStatement] > ddl:creatable, ddl:statement, oracleddl:databaseOperand mixin
-[oracleddl:createDimensionStatement] > ddl:creatable, ddl:statement, oracleddl:dimensionOperand mixin
-[oracleddl:createDirectoryStatement] > ddl:creatable, ddl:statement, oracleddl:directoryOperand mixin
-[oracleddl:createDiskgroupStatement] > ddl:creatable, ddl:statement, oracleddl:diskgroupOperand mixin
-[oracleddl:createFunctionStatement] > ddl:creatable, ddl:statement, oracleddl:functionOperand mixin
-[oracleddl:createIndexStatement] > ddl:creatable, ddl:statement, oracleddl:indexOperand mixin
- - oracleddl:tableName (string) mandatory
- - oracleddl:unique (boolean)
- - oracleddl:bitmap (boolean)
- + * (ddl:columnReference) = ddl:columnReference multiple
-[oracleddl:createIndexTypeStatement] > ddl:creatable, ddl:statement, oracleddl:indextypeOperand mixin
-[oracleddl:createJavaStatement] > ddl:creatable, ddl:statement, oracleddl:javaOperand mixin
-[oracleddl:createLibraryStatement] > ddl:creatable, ddl:statement, oracleddl:libraryOperand mixin
-[oracleddl:createMaterializedStatement] > ddl:creatable, ddl:statement, oracleddl:materializedOperand mixin
-[oracleddl:createOperatorStatement] > ddl:creatable, ddl:statement, oracleddl:operatorOperand mixin
-[oracleddl:createOutlineStatement] > ddl:creatable, ddl:statement, oracleddl:outlineOperand mixin
-[oracleddl:createPackageStatement] > ddl:creatable, ddl:statement, oracleddl:packageOperand mixin
-[oracleddl:createPfileStatement] > ddl:creatable, ddl:statement, oracleddl:pfileOperand mixin
-[oracleddl:createProcedureStatement] > ddl:creatable, ddl:statement, oracleddl:procedureOperand mixin
-[oracleddl:createRoleStatement] > ddl:creatable, ddl:statement, oracleddl:roleOperand mixin
-[oracleddl:createRollbackStatement] > ddl:creatable, ddl:statement, oracleddl:rollbackOperand mixin
-[oracleddl:createSequenceStatement] > ddl:creatable, ddl:statement, oracleddl:sequenceOperand mixin
-[oracleddl:createSpfileStatement] > ddl:creatable, ddl:statement, oracleddl:spfileOperand mixin
-[oracleddl:createSynonymStatement] > ddl:creatable, ddl:statement, oracleddl:synonymOperand mixin
-[oracleddl:createTablespaceStatement] > ddl:creatable, ddl:statement, oracleddl:tablespaceOperand mixin
-[oracleddl:createTriggerStatement] > ddl:creatable, ddl:statement, oracleddl:triggerOperand mixin
-[oracleddl:createTypeStatement] > ddl:creatable, ddl:statement, oracleddl:typeOperand mixin
-[oracleddl:createUserStatement] > ddl:creatable, ddl:statement, oracleddl:userOperand mixin
-
-// =============================================================================
-// DROP STATEMENTS
-// =============================================================================
-
-[oracleddl:dropClusterStatement] > ddl:droppable, ddl:statement, oracleddl:clusterOperand mixin
-[oracleddl:dropContextStatement] > ddl:droppable, ddl:statement, oracleddl:contextOperand mixin
-[oracleddl:dropDatabaseStatement] > ddl:droppable, ddl:statement, oracleddl:databaseOperand mixin
-[oracleddl:dropDimensionStatement] > ddl:droppable, ddl:statement, oracleddl:dimensionOperand mixin
-[oracleddl:dropDirectoryStatement] > ddl:droppable, ddl:statement, oracleddl:directoryOperand mixin
-[oracleddl:dropDiskgroupStatement] > ddl:droppable, ddl:statement, oracleddl:diskgroupOperand mixin
-[oracleddl:dropFunctionStatement] > ddl:droppable, ddl:statement, oracleddl:functionOperand mixin
-[oracleddl:dropIndexStatement] > ddl:droppable, ddl:statement, oracleddl:indexOperand mixin
-[oracleddl:dropIndextypeStatement] > ddl:droppable, ddl:statement, oracleddl:indextypeOperand mixin
-[oracleddl:dropJavaStatement] > ddl:droppable, ddl:statement, oracleddl:javaOperand mixin
-[oracleddl:dropLibraryStatement] > ddl:droppable, ddl:statement, oracleddl:libraryOperand mixin
-[oracleddl:dropMaterializedStatement] > ddl:droppable, ddl:statement, oracleddl:materializedOperand mixin
-[oracleddl:dropOperatorStatement] > ddl:droppable, ddl:statement, oracleddl:operatorOperand mixin
-[oracleddl:dropOutlineStatement] > ddl:droppable, ddl:statement, oracleddl:outlineOperand mixin
-[oracleddl:dropPackageStatement] > ddl:droppable, ddl:statement, oracleddl:packageOperand mixin
-[oracleddl:dropProcedureStatement] > ddl:droppable, ddl:statement, oracleddl:procedureOperand mixin
-[oracleddl:dropProfileStatement] > ddl:droppable, ddl:statement, oracleddl:profileOperand mixin
-[oracleddl:dropRoleStatement] > ddl:droppable, ddl:statement, oracleddl:roleOperand mixin
-[oracleddl:dropRollbackStatement] > ddl:droppable, ddl:statement, oracleddl:rollbackOperand mixin
-[oracleddl:dropSequenceStatement] > ddl:droppable, ddl:statement, oracleddl:sequenceOperand mixin
-[oracleddl:dropSynonymStatement] > ddl:droppable, ddl:statement, oracleddl:synonymOperand mixin
-[oracleddl:dropTablespaceStatement] > ddl:droppable, ddl:statement, oracleddl:tablespaceOperand mixin
-[oracleddl:dropTriggerStatement] > ddl:droppable, ddl:statement, oracleddl:triggerOperand mixin
-[oracleddl:dropTypeStatement] > ddl:droppable, ddl:statement, oracleddl:typeOperand mixin
-[oracleddl:dropUserStatement] > ddl:droppable, ddl:statement, oracleddl:userOperand mixin
-
-// =============================================================================
-// MISC STATEMENTS
-// =============================================================================
-
-[oracleddl:analyzeStatement] > ddl:statement mixin
-[oracleddl:associateStatisticsStatement] > ddl:statement mixin
-[oracleddl:auditStatement] > ddl:statement mixin
-[oracleddl:commitStatement] > ddl:statement mixin
-[oracleddl:commentOnStatement] > ddl:statement, oracleddl:commentOperand mixin
- - oracleddl:targetObjectType (STRING) mandatory
- - oracleddl:targetObjectName (STRING)
- - oracleddl:comment (STRING) mandatory
-[oracleddl:disassociateStatisticsStatement] > ddl:statement mixin
-[oracleddl:explainPlanStatement] > ddl:statement mixin
-[oracleddl:flashbackStatement] > ddl:statement mixin
-[oracleddl:lockTableStatement] > ddl:statement mixin
-[oracleddl:mergeStatement] > ddl:statement mixin
-[oracleddl:nestedTableStatement] > ddl:statement mixin
-[oracleddl:noauditStatement] > ddl:statement mixin
-[oracleddl:purgeStatement] > ddl:statement mixin
-[oracleddl:renameStatement] > ddl:statement mixin
-[oracleddl:revokeStatement] > ddl:statement mixin
-[oracleddl:rollbackStatement] > ddl:statement mixin
-[oracleddl:setConstraintsStatement] > ddl:statement, ddl:settable mixin
-[oracleddl:setRoleStatement] > ddl:statement, ddl:settable mixin
-[oracleddl:setTransactionStatement] > ddl:statement, ddl:settable mixin
-[oracleddl:truncateStatement] > ddl:statement mixin
Added: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd (rev 0)
+++ trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd 2010-01-07 19:11:34 UTC (rev 1553)
@@ -0,0 +1,220 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * 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.
+ * See the AUTHORS.txt file in the distribution for a full listing of
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you 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.
+ *
+ * JBoss DNA 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+ //------------------------------------------------------------------------------
+// N A M E S P A C E S
+//------------------------------------------------------------------------------
+<jcr='http://www.jcp.org/jcr/1.0'>
+<nt='http://www.jcp.org/jcr/nt/1.0'>
+<mix='http://www.jcp.org/jcr/mix/1.0'>
+<ddl='http://www.jboss.org/dna/ddl/1.0'>
+<oracleddl='http://www.jboss.org/dna/ddl/oracle/1.0'>
+
+// =============================================================================
+// OPERANDS
+// =============================================================================
+[oracleddl:clusterOperand] > ddl:operand abstract
+[oracleddl:commentOperand] > ddl:operand abstract
+[oracleddl:contextOperand] > ddl:operand abstract
+[oracleddl:controlfileOperand] > ddl:operand abstract
+[oracleddl:databaseOperand] > ddl:operand abstract
+[oracleddl:dimensionOperand] > ddl:operand abstract
+[oracleddl:directoryOperand] > ddl:operand abstract
+[oracleddl:diskgroupOperand] > ddl:operand abstract
+[oracleddl:functionOperand] > ddl:operand abstract
+[oracleddl:indexOperand] > ddl:operand abstract
+[oracleddl:indextypeOperand] > ddl:operand abstract
+[oracleddl:javaOperand] > ddl:operand abstract
+[oracleddl:libraryOperand] > ddl:operand abstract
+[oracleddl:materializedOperand] > ddl:operand abstract
+[oracleddl:operatorOperand] > ddl:operand abstract
+[oracleddl:outlineOperand] > ddl:operand abstract
+[oracleddl:packageOperand] > ddl:operand abstract
+[oracleddl:parameterOperand] > ddl:operand abstract
+[oracleddl:pfileOperand] > ddl:operand abstract
+[oracleddl:procedureOperand] > ddl:operand abstract
+[oracleddl:profileOperand] > ddl:operand abstract
+[oracleddl:resourceOperand] > ddl:operand abstract
+[oracleddl:roleOperand] > ddl:operand abstract
+[oracleddl:rollbackOperand] > ddl:operand abstract
+[oracleddl:sequenceOperand] > ddl:operand abstract
+[oracleddl:sessionOperand] > ddl:operand abstract
+[oracleddl:spfileOperand] > ddl:operand abstract
+[oracleddl:systemOperand] > ddl:operand abstract
+[oracleddl:synonymOperand] > ddl:operand abstract
+[oracleddl:tablespaceOperand] > ddl:operand abstract
+[oracleddl:triggerOperand] > ddl:operand abstract
+[oracleddl:typeOperand] > ddl:operand abstract
+[oracleddl:userOperand] > ddl:operand abstract
+
+// =============================================================================
+// COLUMN
+// =============================================================================
+[oracleddl:columnDefinition] > ddl:columnDefinition
+ - oracleddl:dropDefault (boolean)
+
+//
+
+[oracleddl:functionParameter] > oracleddl:parameterOperand mixin
+ - ddl:datatypeName (STRING) mandatory
+ - ddl:datatypeLength (LONG)
+ - ddl:datatypePrecision (LONG)
+ - ddl:datatypeScale (LONG)
+ - oracleddl:default (STRING)
+ - oracleddl:defaultExpresssion (STRING)
+ - oracleddl:inOutNoCopy (STRING)
+
+// =============================================================================
+// ALTER STATEMENTS
+// =============================================================================
+[oracleddl:alterClusterStatement] > ddl:alterable, ddl:statement, oracleddl:clusterOperand mixin
+[oracleddl:alterDatabaseStatement] > ddl:alterable, ddl:statement, oracleddl:databaseOperand mixin
+[oracleddl:alterDimensionStatement] > ddl:alterable, ddl:statement, oracleddl:dimensionOperand mixin
+[oracleddl:alterDiskgroupStatement] > ddl:alterable, ddl:statement, oracleddl:diskgroupOperand mixin
+[oracleddl:alterFunctionStatement] > ddl:alterable, ddl:statement, oracleddl:functionOperand mixin
+[oracleddl:alterIndexStatement] > ddl:alterable, ddl:statement, oracleddl:indexOperand mixin
+[oracleddl:alterIndextypeStatement] > ddl:alterable, ddl:statement, oracleddl:indextypeOperand mixin
+[oracleddl:alterJavaStatement] > ddl:alterable, ddl:statement, oracleddl:javaOperand mixin
+[oracleddl:alterMaterializedStatement] > ddl:alterable, ddl:statement, oracleddl:materializedOperand mixin
+[oracleddl:alterOperatorStatement] > ddl:alterable, ddl:statement, oracleddl:operatorOperand mixin
+[oracleddl:alterOutlineStatement] > ddl:alterable, ddl:statement, oracleddl:outlineOperand mixin
+[oracleddl:alterPackageStatement] > ddl:alterable, ddl:statement, oracleddl:packageOperand mixin
+[oracleddl:alterProcedureStatement] > ddl:alterable, ddl:statement, oracleddl:procedureOperand mixin
+[oracleddl:alterProfileStatement] > ddl:alterable, ddl:statement, oracleddl:profileOperand mixin
+[oracleddl:alterResourceStatement] > ddl:alterable, ddl:statement, oracleddl:resourceOperand mixin
+[oracleddl:alterRoleStatement] > ddl:alterable, ddl:statement, oracleddl:roleOperand mixin
+[oracleddl:alterRollbackStatement] > ddl:alterable, ddl:statement, oracleddl:rollbackOperand mixin
+[oracleddl:alterSequenceStatement] > ddl:alterable, ddl:statement, oracleddl:sequenceOperand mixin
+[oracleddl:alterSessionStatement] > ddl:alterable, ddl:statement, oracleddl:sessionOperand mixin
+[oracleddl:alterSystemStatement] > ddl:alterable, ddl:statement, oracleddl:systemOperand mixin
+[oracleddl:alterTablespaceStatement] > ddl:alterable, ddl:statement, oracleddl:tablespaceOperand mixin
+[oracleddl:alterTriggerStatement] > ddl:alterable, ddl:statement, oracleddl:triggerOperand mixin
+[oracleddl:alterTypeStatement] > ddl:alterable, ddl:statement, oracleddl:typeOperand mixin
+[oracleddl:alterUserStatement] > ddl:alterable, ddl:statement, oracleddl:userOperand mixin
+[oracleddl:alterViewStatement] > ddl:alterable, ddl:statement, ddl:viewOperand mixin
+
+[oracleddl:alterTableStatement] > ddl:alterTableStatement mixin
+ - oracleddl:newTableName (STRING)
+ + oracleddl:renameColumn (ddl:renamable) = ddl:renamable multiple
+ + oracleddl:renameConstraint (ddl:renamable) = ddl:renamable multiple
+
+// =============================================================================
+// CREATE STATEMENTS
+// =============================================================================
+
+[oracleddl:createClusterStatement] > ddl:creatable, ddl:statement, oracleddl:clusterOperand mixin
+[oracleddl:createContextStatement] > ddl:creatable, ddl:statement, oracleddl:contextOperand mixin
+[oracleddl:createControlfileStatement] > ddl:creatable, ddl:statement, oracleddl:controlfileOperand mixin
+[oracleddl:createDatabaseStatement] > ddl:creatable, ddl:statement, oracleddl:databaseOperand mixin
+[oracleddl:createDimensionStatement] > ddl:creatable, ddl:statement, oracleddl:dimensionOperand mixin
+[oracleddl:createDirectoryStatement] > ddl:creatable, ddl:statement, oracleddl:directoryOperand mixin
+[oracleddl:createDiskgroupStatement] > ddl:creatable, ddl:statement, oracleddl:diskgroupOperand mixin
+[oracleddl:createFunctionStatement] > ddl:creatable, ddl:statement, oracleddl:functionOperand mixin
+ - ddl:datatypeName (STRING) mandatory
+ - ddl:datatypeLength (LONG)
+ - ddl:datatypePrecision (LONG)
+ - ddl:datatypeScale (LONG)
+ + oracleddl:parameter (oracleddl:functionParameter) = oracleddl:functionParameter multiple
+[oracleddl:createIndexStatement] > ddl:creatable, ddl:statement, oracleddl:indexOperand mixin
+ - oracleddl:tableName (string) mandatory
+ - oracleddl:unique (boolean)
+ - oracleddl:bitmap (boolean)
+ + * (ddl:columnReference) = ddl:columnReference multiple
+[oracleddl:createIndexTypeStatement] > ddl:creatable, ddl:statement, oracleddl:indextypeOperand mixin
+[oracleddl:createJavaStatement] > ddl:creatable, ddl:statement, oracleddl:javaOperand mixin
+[oracleddl:createLibraryStatement] > ddl:creatable, ddl:statement, oracleddl:libraryOperand mixin
+[oracleddl:createMaterializedStatement] > ddl:creatable, ddl:statement, oracleddl:materializedOperand mixin
+[oracleddl:createOperatorStatement] > ddl:creatable, ddl:statement, oracleddl:operatorOperand mixin
+[oracleddl:createOutlineStatement] > ddl:creatable, ddl:statement, oracleddl:outlineOperand mixin
+[oracleddl:createPackageStatement] > ddl:creatable, ddl:statement, oracleddl:packageOperand mixin
+[oracleddl:createPfileStatement] > ddl:creatable, ddl:statement, oracleddl:pfileOperand mixin
+[oracleddl:createProcedureStatement] > ddl:creatable, ddl:statement, oracleddl:procedureOperand mixin
+ + oracleddl:parameter (oracleddl:functionParameter) = oracleddl:functionParameter multiple
+[oracleddl:createRoleStatement] > ddl:creatable, ddl:statement, oracleddl:roleOperand mixin
+[oracleddl:createRollbackStatement] > ddl:creatable, ddl:statement, oracleddl:rollbackOperand mixin
+[oracleddl:createSequenceStatement] > ddl:creatable, ddl:statement, oracleddl:sequenceOperand mixin
+[oracleddl:createSpfileStatement] > ddl:creatable, ddl:statement, oracleddl:spfileOperand mixin
+[oracleddl:createSynonymStatement] > ddl:creatable, ddl:statement, oracleddl:synonymOperand mixin
+[oracleddl:createTablespaceStatement] > ddl:creatable, ddl:statement, oracleddl:tablespaceOperand mixin
+[oracleddl:createTriggerStatement] > ddl:creatable, ddl:statement, oracleddl:triggerOperand mixin
+[oracleddl:createTypeStatement] > ddl:creatable, ddl:statement, oracleddl:typeOperand mixin
+[oracleddl:createUserStatement] > ddl:creatable, ddl:statement, oracleddl:userOperand mixin
+
+// =============================================================================
+// DROP STATEMENTS
+// =============================================================================
+
+[oracleddl:dropClusterStatement] > ddl:droppable, ddl:statement, oracleddl:clusterOperand mixin
+[oracleddl:dropContextStatement] > ddl:droppable, ddl:statement, oracleddl:contextOperand mixin
+[oracleddl:dropDatabaseStatement] > ddl:droppable, ddl:statement, oracleddl:databaseOperand mixin
+[oracleddl:dropDimensionStatement] > ddl:droppable, ddl:statement, oracleddl:dimensionOperand mixin
+[oracleddl:dropDirectoryStatement] > ddl:droppable, ddl:statement, oracleddl:directoryOperand mixin
+[oracleddl:dropDiskgroupStatement] > ddl:droppable, ddl:statement, oracleddl:diskgroupOperand mixin
+[oracleddl:dropFunctionStatement] > ddl:droppable, ddl:statement, oracleddl:functionOperand mixin
+[oracleddl:dropIndexStatement] > ddl:droppable, ddl:statement, oracleddl:indexOperand mixin
+[oracleddl:dropIndextypeStatement] > ddl:droppable, ddl:statement, oracleddl:indextypeOperand mixin
+[oracleddl:dropJavaStatement] > ddl:droppable, ddl:statement, oracleddl:javaOperand mixin
+[oracleddl:dropLibraryStatement] > ddl:droppable, ddl:statement, oracleddl:libraryOperand mixin
+[oracleddl:dropMaterializedStatement] > ddl:droppable, ddl:statement, oracleddl:materializedOperand mixin
+[oracleddl:dropOperatorStatement] > ddl:droppable, ddl:statement, oracleddl:operatorOperand mixin
+[oracleddl:dropOutlineStatement] > ddl:droppable, ddl:statement, oracleddl:outlineOperand mixin
+[oracleddl:dropPackageStatement] > ddl:droppable, ddl:statement, oracleddl:packageOperand mixin
+[oracleddl:dropProcedureStatement] > ddl:droppable, ddl:statement, oracleddl:procedureOperand mixin
+[oracleddl:dropProfileStatement] > ddl:droppable, ddl:statement, oracleddl:profileOperand mixin
+[oracleddl:dropRoleStatement] > ddl:droppable, ddl:statement, oracleddl:roleOperand mixin
+[oracleddl:dropRollbackStatement] > ddl:droppable, ddl:statement, oracleddl:rollbackOperand mixin
+[oracleddl:dropSequenceStatement] > ddl:droppable, ddl:statement, oracleddl:sequenceOperand mixin
+[oracleddl:dropSynonymStatement] > ddl:droppable, ddl:statement, oracleddl:synonymOperand mixin
+[oracleddl:dropTablespaceStatement] > ddl:droppable, ddl:statement, oracleddl:tablespaceOperand mixin
+[oracleddl:dropTriggerStatement] > ddl:droppable, ddl:statement, oracleddl:triggerOperand mixin
+[oracleddl:dropTypeStatement] > ddl:droppable, ddl:statement, oracleddl:typeOperand mixin
+[oracleddl:dropUserStatement] > ddl:droppable, ddl:statement, oracleddl:userOperand mixin
+
+// =============================================================================
+// MISC STATEMENTS
+// =============================================================================
+
+[oracleddl:analyzeStatement] > ddl:statement mixin
+[oracleddl:associateStatisticsStatement] > ddl:statement mixin
+[oracleddl:auditStatement] > ddl:statement mixin
+[oracleddl:commitStatement] > ddl:statement mixin
+[oracleddl:commentOnStatement] > ddl:statement, oracleddl:commentOperand mixin
+ - oracleddl:targetObjectType (STRING) mandatory
+ - oracleddl:targetObjectName (STRING)
+ - oracleddl:comment (STRING) mandatory
+[oracleddl:disassociateStatisticsStatement] > ddl:statement mixin
+[oracleddl:explainPlanStatement] > ddl:statement mixin
+[oracleddl:flashbackStatement] > ddl:statement mixin
+[oracleddl:lockTableStatement] > ddl:statement mixin
+[oracleddl:mergeStatement] > ddl:statement mixin
+[oracleddl:nestedTableStatement] > ddl:statement mixin
+[oracleddl:noauditStatement] > ddl:statement mixin
+[oracleddl:purgeStatement] > ddl:statement mixin
+[oracleddl:renameStatement] > ddl:statement mixin
+[oracleddl:revokeStatement] > ddl:statement mixin
+[oracleddl:rollbackStatement] > ddl:statement mixin
+[oracleddl:setConstraintsStatement] > ddl:statement, ddl:settable mixin
+[oracleddl:setRoleStatement] > ddl:statement, ddl:settable mixin
+[oracleddl:setTransactionStatement] > ddl:statement, ddl:settable mixin
+[oracleddl:truncateStatement] > ddl:statement mixin
Property changes on: trunk/extensions/dna-sequencer-ddl/src/main/resources/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdl.cnd
___________________________________________________________________
Name: svn:executable
+ *
Modified: trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java 2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParserTest.java 2010-01-07 19:11:34 UTC (rev 1553)
@@ -303,6 +303,95 @@
assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_CREATE_FUNCTION_STATEMENT));
}
+ @Test
+ public void shouldParseCreateProcedure_1() {
+ printTest("shouldParseCreateProcedure_1()");
+ String content = "CREATE PROCEDURE remove_emp (employee_id NUMBER) AS tot_emps NUMBER;" + NEWLINE
+ + "BEGIN" + NEWLINE
+ + " DELETE FROM employees" + NEWLINE
+ + " WHERE employees.employee_id = remove_emp.employee_id;" + NEWLINE
+ + "tot_emps := tot_emps - 1;" + NEWLINE
+ + "END;" + NEWLINE
+ + "/";
+
+ boolean success = parser.parse(content, rootNode);
+
+ assertEquals(true, success);
+ assertEquals(1, rootNode.getChildCount());
+ AstNode childNode = rootNode.getChildren().get(0);
+ assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_CREATE_PROCEDURE_STATEMENT));
+ }
+
+ @Test
+ public void shouldParseCreateProcedure_2() {
+ printTest("shouldParseCreateProcedure_2()");
+ String content = "CREATE OR REPLACE PROCEDURE add_emp (employee_id NUMBER, employee_age NUMBER) AS tot_emps NUMBER;" + NEWLINE
+ + "BEGIN" + NEWLINE
+ + " INSERT INTO employees" + NEWLINE
+ + " WHERE employees.employee_id = remove_emp.employee_id;" + NEWLINE
+ + "tot_emps := tot_emps + 1;" + NEWLINE
+ + "END;" + NEWLINE
+ + "/";
+
+ boolean success = parser.parse(content, rootNode);
+
+ assertEquals(true, success);
+ assertEquals(1, rootNode.getChildCount());
+ AstNode childNode = rootNode.getChildren().get(0);
+ assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_CREATE_PROCEDURE_STATEMENT));
+ assertEquals(2, childNode.getChildCount());
+ }
+
+ @Test
+ public void shouldParseOracleProceduresAndFunctions() {
+ printTest("shouldParseOracleProceduresAndFunctions()");
+ String content = getFileContent(DDL_FILE_PATH + "create_procedure_statements.ddl");
+
+ boolean success = parser.parse(content, rootNode);
+
+ assertEquals(true, success);
+ assertEquals(4, rootNode.getChildCount());
+ }
+
+ @Test
+ public void shouldParseCreateMaterializedView() {
+ setPrintToConsole(true);
+ parser.setTestMode(isPrintToConsole());
+ printTest("shouldParseCreateMaterializedView()");
+ String content = " CREATE MATERIALIZED VIEW sales_mv" + NEWLINE
+ + "BUILD IMMEDIATE" + NEWLINE
+ + "REFRESH FAST ON COMMIT" + NEWLINE
+ + "AS SELECT t.calendar_year, p.prod_id, " + NEWLINE
+ + " SUM(s.amount_sold) AS sum_sales" + NEWLINE
+ + " FROM times t, products p, sales s" + NEWLINE
+ + " WHERE t.time_id = s.time_id AND p.prod_id = s.prod_id" + NEWLINE
+ + " GROUP BY t.calendar_year, p.prod_id;" + NEWLINE;
+
+ boolean success = parser.parse(content, rootNode);
+
+ assertEquals(true, success);
+ assertEquals(1, rootNode.getChildCount());
+ AstNode childNode = rootNode.getChildren().get(0);
+ assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_CREATE_MATERIALIZED_VIEW_STATEMENT));
+ }
+
+ @Test
+ public void shouldParseCreateMaterializedViewLog() {
+ setPrintToConsole(true);
+ parser.setTestMode(isPrintToConsole());
+ printTest("shouldParseCreateMaterializedViewLog()");
+ String content = "CREATE MATERIALIZED VIEW LOG ON products" + NEWLINE
+ + "WITH ROWID, SEQUENCE (prod_id)" + NEWLINE
+ + "INCLUDING NEW VALUES;";
+
+ boolean success = parser.parse(content, rootNode);
+
+ assertEquals(true, success);
+ assertEquals(1, rootNode.getChildCount());
+ AstNode childNode = rootNode.getChildren().get(0);
+ assertTrue(hasMixinType(childNode.getProperty(JcrLexicon.MIXIN_TYPES), TYPE_CREATE_MATERIALIZED_VIEW_LOG_STATEMENT));
+ }
+
@Test
public void shouldParseOracleStatements_1() {
printTest("shouldParseOracleStatements_1()");
Added: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/create_procedure_statements.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/create_procedure_statements.ddl (rev 0)
+++ trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/create_procedure_statements.ddl 2010-01-07 19:11:34 UTC (rev 1553)
@@ -0,0 +1,24 @@
+CREATE PROCEDURE remove_emp (employee_id NUMBER) AS tot_emps NUMBER;
+ BEGIN
+ DELETE FROM employees
+ WHERE employees.employee_id = remove_emp.employee_id;
+ tot_emps := tot_emps - 1;
+ END;
+/
+
+CREATE PROCEDURE find_root
+ ( x IN REAL )
+ IS LANGUAGE C
+ NAME c_find_root
+ LIBRARY c_utils
+ PARAMETERS ( x BY REFERENCE );
+
+CREATE FUNCTION SecondMax (input NUMBER) RETURN NUMBER
+ PARALLEL_ENABLE AGGREGATE USING SecondMaxImpl;
+
+CREATE OR REPLACE FUNCTION text_length(a CLOB)
+ RETURN NUMBER DETERMINISTIC IS
+ BEGIN
+ RETURN DBMS_LOB.GETLENGTH(a);
+ END;
+/
\ No newline at end of file
Modified: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/oracle_test_statements_2.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/oracle_test_statements_2.ddl 2010-01-07 18:24:39 UTC (rev 1552)
+++ trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/dialect/oracle/oracle_test_statements_2.ddl 2010-01-07 19:11:34 UTC (rev 1553)
@@ -72,7 +72,7 @@
COMMIT WORK;
-COMMIT COMMENT 'In-doubt transaction Code 36, Call (415) 555-2637';
+COMMIT COMMENT 'In-doubt transaction Code 36, Call (415) 555-2637';
CREATE CLUSTER personnel
(department NUMBER(4))
15 years, 11 months