Author: blafond
Date: 2009-12-03 17:16:50 -0500 (Thu, 03 Dec 2009)
New Revision: 1394
Added:
trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/d_quoted_statements.ddl
Modified:
trunk/extensions/dna-sequencer-ddl/
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlParsers.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencer.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/dialect/derby/DerbyDdlLexicon.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/mysql/MySqlDdlParser.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/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlConstants.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParser.java
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/node/AstNode.java
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParsersTest.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/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParserTest.java
trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/createTables.ddl
trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/create_schema.ddl
Log:
DNA-49 Fleshed out the DdlSequencerTest to include asserting graph results for node and
properties. Includes tests for specific dialects. Also includes various fixes for miscues
uncovered after finally being able to go end-to-end with the sequencer. Subsequent bugs
for this sequencer and parsing framework will logged and fixed as separate JIRA's.
Property changes on: trunk/extensions/dna-sequencer-ddl
___________________________________________________________________
Name: svn:ignore
+ target
.settings
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlParsers.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlParsers.java 2009-12-03
22:14:00 UTC (rev 1393)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlParsers.java 2009-12-03
22:16:50 UTC (rev 1394)
@@ -52,6 +52,7 @@
parsers.add(new OracleDdlParser());
parsers.add(new DerbyDdlParser());
parsers.add(new PostgresDdlParser());
+ //parsers.add(new MySqlDdlParser());
}
/**
@@ -87,6 +88,8 @@
DdlTokenStream tokens = null;
DdlParser validParser = null;
+ DdlTokenStream validTokens = null;
+
// FIRST token should be DIALECT
// for (DdlParser parser : library.getInstances()) {
@@ -111,15 +114,16 @@
if (numKeywords > keywordCount) {
keywordCount = numKeywords;
validParser = parser;
+ validTokens = tokens;
}
}
- if (tokens != null) {
- tokens.rewind();
+ if (validTokens != null) {
+ validTokens.rewind();
}
} else {
- tokens = new DdlTokenStream(ddl, DdlTokenStream.ddlTokenizer(false), false);
- validParser.registerWords(tokens);
- tokens.start(); // COMPLETE TOKENIZATION
+ validTokens = new DdlTokenStream(ddl, DdlTokenStream.ddlTokenizer(false),
false);
+ validParser.registerWords(validTokens);
+ validTokens.start(); // COMPLETE TOKENIZATION
}
if (validParser == null) {
@@ -130,7 +134,7 @@
// tokens = new DdlTokenStream(ddl, DdlTokenStream.ddlTokenizer(false), false);
// validParser.registerWords(tokens);
// tokens.start();
- boolean success = validParser.parse(tokens, rootNode);
+ boolean success = validParser.parse(validTokens, rootNode);
rootNode.setProperty(StandardDdlLexicon.PARSER_ID, validParser.getId());
return success;
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencer.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencer.java 2009-12-03
22:14:00 UTC (rev 1393)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/DdlSequencer.java 2009-12-03
22:16:50 UTC (rev 1394)
@@ -68,7 +68,8 @@
rootNode = parsers.parse(IoUtil.read(stream));
Path nodePath = pathFactory.create(rootNode.getPath(context));
- destination.create(nodePath, rootNode.getProperties());
+ List<Property> properties = rootNode.getProperties();
+ destination.create(nodePath, properties);
convertAstNodesToGraphNodes(rootNode);
@@ -88,7 +89,8 @@
for (AstNode child : children) {
Path nodePath = pathFactory.create(child.getPath(context));
- destination.create(nodePath, child.getProperties());
+ List<Property> properties = child.getProperties();
+ destination.create(nodePath, properties);
convertAstNodesToGraphNodes(child);
}
}
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 2009-12-03
22:14:00 UTC (rev 1393)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/StandardDdlParser.java 2009-12-03
22:16:50 UTC (rev 1394)
@@ -628,7 +628,7 @@
} else if (tokens.canConsume("DROP")) {
if (tokens.canConsume("CONSTRAINT")) {
- String constraintName = tokens.consume(); // constraint name
+ String constraintName = parseName(tokens); // constraint name
AstNode constraintNode = nodeFactory().node(constraintName,
alterTableNode, TYPE_DROP_TABLE_CONSTRAINT_DEFINITION);
@@ -1287,7 +1287,7 @@
// EXAMPLE:
// COLUMN_NAME DATATYPE NOT NULL DEFAULT (0) FOREIGN KEY MY_FK_NAME
REFERENCES SOME_TABLE_NAME (SOME_COLUMN_NAME, ...)
- String constraintName = tokens.consume();
+ String constraintName = parseName(tokens);
AstNode constraintNode = nodeFactory().node(constraintName,
columnNode.getParent(), mixinType);
@@ -1445,7 +1445,7 @@
} else if (tokens.matches("CONSTRAINT", DdlTokenStream.ANY_VALUE,
"UNIQUE")) {
// CONSTRAINT P_KEY_2a UNIQUE (PERMISSIONUID)
tokens.consume(); // CONSTRAINT
- String uc_name = tokens.consume(); // UNIQUE CONSTRAINT NAME
+ String uc_name = parseName(tokens); // UNIQUE CONSTRAINT NAME
tokens.consume("UNIQUE"); // UNIQUE
AstNode constraintNode = nodeFactory().node(uc_name, tableNode, mixinType);
@@ -1460,7 +1460,7 @@
} else if (tokens.matches("CONSTRAINT", DdlTokenStream.ANY_VALUE,
"PRIMARY", "KEY")) {
// CONSTRAINT U_KEY_2a PRIMARY KEY (PERMISSIONUID)
tokens.consume("CONSTRAINT"); // CONSTRAINT
- String pk_name = tokens.consume(); // PRIMARY KEY NAME
+ String pk_name = parseName(tokens); // PRIMARY KEY NAME
tokens.consume("PRIMARY", "KEY"); // PRIMARY KEY
AstNode constraintNode = nodeFactory().node(pk_name, tableNode, mixinType);
@@ -1476,7 +1476,7 @@
} else if (tokens.matches("CONSTRAINT", DdlTokenStream.ANY_VALUE,
"FOREIGN", "KEY")) {
// CONSTRAINT F_KEY_2a FOREIGN KEY (PERMISSIONUID)
tokens.consume("CONSTRAINT"); // CONSTRAINT
- String fk_name = tokens.consume(); // FOREIGN KEY NAME
+ String fk_name = parseName(tokens); // FOREIGN KEY NAME
tokens.consume("FOREIGN", "KEY"); // FOREIGN KEY
AstNode constraintNode = nodeFactory().node(fk_name, tableNode, mixinType);
@@ -1653,6 +1653,8 @@
// CONSUME COLUMNS
parseColumnNameList(tokens, createViewNode, TYPE_COLUMN_REFERENCE);
+ tokens.consume("AS");
+
String queryExpression = parseUntilTerminator(tokens);
createViewNode.setProperty(CREATE_VIEW_QUERY_EXPRESSION, queryExpression);
@@ -1689,9 +1691,9 @@
if (tokens.canConsume("AUTHORIZATION")) {
authorizationIdentifier = tokens.consume();
} else {
- schemaName = tokens.consume();
+ schemaName = parseName(tokens);
if (tokens.canConsume("AUTHORIZATION")) {
- authorizationIdentifier = tokens.consume();
+ authorizationIdentifier = parseName(tokens);
}
}
// Must have one or the other or both
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java 2009-12-03
22:14:00 UTC (rev 1393)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlLexicon.java 2009-12-03
22:16:50 UTC (rev 1394)
@@ -77,12 +77,12 @@
public static final Name TYPE_RENAME_INDEX_STATEMENT = new
BasicName(Namespace.URI, "renameIndexStatement");
public static final Name TYPE_DECLARE_GLOBAL_TEMPORARY_TABLE_STATEMENT = new
BasicName(Namespace.URI, "declareGlobalTemporaryTableStatement");
- public static final Name TYPE_DROP_FUNCTION_STATEMENT = new
BasicName(Namespace.URI, "dropFunctionStatementStatement");
- public static final Name TYPE_DROP_INDEX_STATEMENT = new BasicName(Namespace.URI,
"dropIndexStatementStatement");
- public static final Name TYPE_DROP_PROCEDURE_STATEMENT = new
BasicName(Namespace.URI, "dropProcedureStatementStatement");
- public static final Name TYPE_DROP_ROLE_STATEMENT = new BasicName(Namespace.URI,
"dropRoleStatementStatement");
- public static final Name TYPE_DROP_SYNONYM_STATEMENT = new
BasicName(Namespace.URI, "dropSynonymStatementStatement");
- public static final Name TYPE_DROP_TRIGGER_STATEMENT = new
BasicName(Namespace.URI, "dropTriggerStatementStatement");
+ public static final Name TYPE_DROP_FUNCTION_STATEMENT = new
BasicName(Namespace.URI, "dropFunctionStatement");
+ public static final Name TYPE_DROP_INDEX_STATEMENT = new BasicName(Namespace.URI,
"dropIndexStatement");
+ public static final Name TYPE_DROP_PROCEDURE_STATEMENT = new
BasicName(Namespace.URI, "dropProcedureStatement");
+ public static final Name TYPE_DROP_ROLE_STATEMENT = new BasicName(Namespace.URI,
"dropRoleStatement");
+ public static final Name TYPE_DROP_SYNONYM_STATEMENT = new
BasicName(Namespace.URI, "dropSynonymStatement");
+ public static final Name TYPE_DROP_TRIGGER_STATEMENT = new
BasicName(Namespace.URI, "dropTriggerStatement");
public static final Name UNIQUE_INDEX = new BasicName(Namespace.URI,
"unique"); //$NON-NLS-1$
public static final Name TABLE_NAME = new BasicName(Namespace.URI,
"tableName"); //$NON-NLS-1$
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/mysql/MySqlDdlParser.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/mysql/MySqlDdlParser.java 2009-12-03
22:14:00 UTC (rev 1393)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/mysql/MySqlDdlParser.java 2009-12-03
22:16:50 UTC (rev 1394)
@@ -423,10 +423,10 @@
// RENAME DATABASE db_name TO new_db_name;
tokens.consume(STMT_RENAME_DATABASE);
- String oldName = tokens.consume();
+ String oldName = parseName(tokens);
tokens.consume("TO");
AstNode node = nodeFactory().node(oldName, parentNode,
TYPE_RENAME_DATABASE_STATEMENT);
- String newName = tokens.consume();
+ String newName = parseName(tokens);
node.setProperty(NEW_NAME, newName);
markEndOfStatement(tokens, node);
@@ -436,10 +436,10 @@
// RENAME SCHEMA schema_name TO new_schema_name;
tokens.consume(STMT_RENAME_SCHEMA);
- String oldName = tokens.consume();
+ String oldName = parseName(tokens);
tokens.consume("TO");
AstNode node = nodeFactory().node(oldName, parentNode,
TYPE_RENAME_SCHEMA_STATEMENT);
- String newName = tokens.consume();
+ String newName = parseName(tokens);
node.setProperty(NEW_NAME, newName);
markEndOfStatement(tokens, node);
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 2009-12-03
22:14:00 UTC (rev 1393)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/oracle/OracleDdlParser.java 2009-12-03
22:16:50 UTC (rev 1394)
@@ -23,6 +23,9 @@
*/
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;
@@ -594,7 +597,7 @@
tokens.consume(DROP);
if (tokens.canConsume("CONSTRAINT")) {
- String constraintName = tokens.consume(); // constraint name
+ String constraintName = parseName(tokens); // constraint name
AstNode constraintNode = nodeFactory().node(constraintName,
alterTableNode, TYPE_DROP_TABLE_CONSTRAINT_DEFINITION);
@@ -759,8 +762,101 @@
return super.parseAlterStatement(tokens, parentNode);
}
+
+
/**
+ * {@inheritDoc}
+ *
+ * @see
org.jboss.dna.sequencer.ddl.StandardDdlParser#parseCreateViewStatement(org.jboss.dna.sequencer.ddl.DdlTokenStream,
org.jboss.dna.sequencer.ddl.node.AstNode)
+ */
+ @Override
+ protected AstNode parseCreateViewStatement( DdlTokenStream tokens,
+ AstNode parentNode ) throws
ParsingException {
+ assert tokens != null;
+ assert parentNode != null;
+
+ markStartOfStatement(tokens);
+ //CREATE [OR REPLACE]
+ // [[NO] FORCE] VIEW [schema.] view
+ // [ ( { alias [ inline_constraint... ]
+ // | out_of_line_constraint
+ // }
+ // [, { alias [ inline_constraint...]
+ // | out_of_line_constraint
+ // }
+ // ]
+ // )
+ // | object_view_clause
+ // | XMLType_view_clause
+ // ]
+ // AS subquery [ subquery_restriction_clause ] ;
+
+
+ // NOTE: the query expression along with the CHECK OPTION clause require no SQL
statement terminator.
+ // So the CHECK OPTION clause will NOT
+
+ String stmtType = "CREATE";
+ tokens.consume("CREATE");
+ if (tokens.canConsume("OR", "REPLACE")) {
+ stmtType = stmtType + SPACE + "OR REPLACE";
+ } else if( tokens.canConsume("NO", "FORCE")) {
+ stmtType = stmtType + SPACE + "NO FORCE";
+ } else if( tokens.canConsume("FORCE")) {
+ stmtType = stmtType + SPACE + "FORCE";
+ }
+
+ tokens.consume("VIEW");
+ stmtType = stmtType + SPACE + "VIEW";
+
+ String name = parseName(tokens);
+
+ AstNode createViewNode = nodeFactory().node(name, parentNode,
TYPE_CREATE_VIEW_STATEMENT);
+
+ // CONSUME COLUMNS
+ parseColumnNameList(tokens, createViewNode, TYPE_COLUMN_REFERENCE);
+
+ // (object_view_clause)
+ //
+ // OF [ schema. ] type_name
+ // { WITH OBJECT IDENTIFIER
+ // { DEFAULT | ( attribute [, attribute ]... ) }
+ // | UNDER [ schema. ] superview
+ // }
+ // ( { out_of_line_constraint
+ // | attribute { inline_constraint }...
+ // } [, { out_of_line_constraint
+ // | attribute { inline_constraint }...
+ // }
+ // ]...
+ // )
+
+ // (XMLType_view_clause)
+ //
+ // OF XMLTYPE [ XMLSchema_spec ]
+ // WITH OBJECT IDENTIFIER
+ // { DEFAULT | ( expr [, expr ]...) }
+
+ // Basically, if next token matches "OF", then parse until token
matches "AS"
+
+ if( tokens.matches("OF") ) {
+ do {
+ tokens.consume();
+ } while( !tokens.matches("AS"));
+ }
+
+ tokens.consume("AS");
+
+ String queryExpression = parseUntilTerminator(tokens);
+
+ createViewNode.setProperty(CREATE_VIEW_QUERY_EXPRESSION, queryExpression);
+
+ markEndOfStatement(tokens, createViewNode);
+
+ return createViewNode;
+ }
+
+ /**
* Parses DDL CREATE INDEX
*
* @param tokens the tokenized {@link DdlTokenStream} of the DDL input content; may
not be null
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlConstants.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlConstants.java 2009-12-03
22:14:00 UTC (rev 1393)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlConstants.java 2009-12-03
22:16:50 UTC (rev 1394)
@@ -37,7 +37,13 @@
public interface PostgresDdlConstants extends DdlConstants {
public static final String[] CUSTOM_KEYWORDS = {
"SHOW", "LISTEN", "UNLISTEN", "REINDEX",
"MOVE", "ABORT", "ANALYZE", "TRUNCATE",
"REASSIGN", "RELEASE",
- "RESET", "REVOKE", "ROLLBACK", "FETCH",
"EXPLAIN", "DISCARD", "COPY", "CLUSTER",
"NOTIFY", "LOAD", "COMMENT", "LOCK"
+ "RESET", "REVOKE", "ROLLBACK", "FETCH",
"EXPLAIN", "DISCARD", "COPY", "CLUSTER",
"NOTIFY", "LOAD", "COMMENT", "LOCK",
+ "SERVER", "SEARCH", "PARSER", "DICTIONARY",
"WRAPPER", "PROCEDURAL", "CONVERSION",
"AGGREGATE", "TEMPLATE",
+ "MAPPING", "TRUSTED", "TRIGGER", "VACUUM",
"FAMILTY",
+ "BIGSERIAL", "BOX", "BOOLEAN", "BOX",
"BYTEA", "CIDR", "CIRCLE", "FLOAT4",
"FLOAT8", "INET", "INT2", "INT4",
"INT8",
+ "LINE", "LSEG", "MACADDR", "MONEY",
"PATH", "POINT", "POLYGON",
+ "SERIAL", "SERIAL4", "SERIAL8", "TEXT",
"TIMESTAMPZ", "TSQUERY",
+ "TSVECTOR", "TXID_SNAPSHOT", "UUID",
"XML"
};
interface PostgresStatementStartPhrases {
@@ -290,37 +296,37 @@
// interval hour to minute
interface PostgresDataTypes {
- static final String[] DTYPE_BIGSERIAL = {"BIGSERIAL"}; //
- static final String[] DTYPE_BOX = {"BOX"}; //
- static final String[] DTYPE_BYTEA = {"BYTEA"}; //
- static final String[] DTYPE_CIDR = {"CIDR"}; //
- static final String[] DTYPE_CIRCLE = {"CIRCLE"}; //
- static final String[] DTYPE_INET = {"INET"}; //
- static final String[] DTYPE_LINE = {"LINE"}; //
- static final String[] DTYPE_LSEG = {"LSEG"}; //
- static final String[] DTYPE_MACADDR = {"MACADDR"}; //
- static final String[] DTYPE_MONEY = {"MONEY"}; //
- static final String[] DTYPE_PATH = {"PATH"}; //
- static final String[] DTYPE_POINT = {"POINT"}; //
- static final String[] DTYPE_POLYGON = {"POLYGON"}; //
- static final String[] DTYPE_SERIAL = {"SERIAL"}; //
- static final String[] DTYPE_TEXT = {"TEXT"}; //
- static final String[] DTYPE_TSQUERY = {"TSQUERY"}; //
- static final String[] DTYPE_TSVECTOR = {"TSVECTOR"}; //
- static final String[] DTYPE_TXID_SNAPSHOT = {"TXID_SNAPSHOT"}; //
- static final String[] DTYPE_UUID = {"UUID"}; //
- static final String[] DTYPE_XML = {"XML"}; //
- static final String[] DTYPE_BOOLEAN = {"BOOLEAN"}; //
- static final String[] DTYPE_BOOL = {"BOOL"}; //
- static final String[] DTYPE_FLOAT4 = {"FLOAT4"}; //
- static final String[] DTYPE_FLOAT8 = {"FLOAT8"}; //
- static final String[] DTYPE_INT2 = {"INT2"}; //
- static final String[] DTYPE_INT4 = {"INT4"}; //
- static final String[] DTYPE_INT8 = {"INT8"}; //
- static final String[] DTYPE_SERIAL4 = {"SERIAL4"}; //
- static final String[] DTYPE_SERIAL8 = {"SERIAL8"}; //
- static final String[] DTYPE_TIMESTAMPZ = {"TIMESTAMPZ"}; //
- static final String[] DTYPE_VARBIT = {"VARBIT"}; //
+ static final String[] DTYPE_BIGSERIAL = {"BIGSERIAL"};
+ static final String[] DTYPE_BOX = {"BOX"};
+ static final String[] DTYPE_BYTEA = {"BYTEA"};
+ static final String[] DTYPE_CIDR = {"CIDR"};
+ static final String[] DTYPE_CIRCLE = {"CIRCLE"};
+ static final String[] DTYPE_INET = {"INET"};
+ static final String[] DTYPE_LINE = {"LINE"};
+ static final String[] DTYPE_LSEG = {"LSEG"};
+ static final String[] DTYPE_MACADDR = {"MACADDR"};
+ static final String[] DTYPE_MONEY = {"MONEY"};
+ static final String[] DTYPE_PATH = {"PATH"};
+ static final String[] DTYPE_POINT = {"POINT"};
+ static final String[] DTYPE_POLYGON = {"POLYGON"};
+ static final String[] DTYPE_SERIAL = {"SERIAL"};
+ static final String[] DTYPE_TEXT = {"TEXT"};
+ static final String[] DTYPE_TSQUERY = {"TSQUERY"};
+ static final String[] DTYPE_TSVECTOR = {"TSVECTOR"};
+ static final String[] DTYPE_TXID_SNAPSHOT = {"TXID_SNAPSHOT"};
+ static final String[] DTYPE_UUID = {"UUID"};
+ static final String[] DTYPE_XML = {"XML"};
+ static final String[] DTYPE_BOOLEAN = {"BOOLEAN"};
+ static final String[] DTYPE_BOOL = {"BOOL"};
+ static final String[] DTYPE_FLOAT4 = {"FLOAT4"};
+ static final String[] DTYPE_FLOAT8 = {"FLOAT8"};
+ static final String[] DTYPE_INT2 = {"INT2"};
+ static final String[] DTYPE_INT4 = {"INT4"};
+ static final String[] DTYPE_INT8 = {"INT8"};
+ static final String[] DTYPE_SERIAL4 = {"SERIAL4"};
+ static final String[] DTYPE_SERIAL8 = {"SERIAL8"};
+ static final String[] DTYPE_TIMESTAMPZ = {"TIMESTAMPZ"};
+ static final String[] DTYPE_VARBIT = {"VARBIT"};
static final List<String[]> CUSTOM_DATATYPE_START_PHRASES =
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParser.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParser.java 2009-12-03
22:14:00 UTC (rev 1393)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/dialect/postgres/PostgresDdlParser.java 2009-12-03
22:16:50 UTC (rev 1394)
@@ -389,7 +389,7 @@
} else if (tokens.canConsume("DROP")) { // DROP CONSTRAINT & DROP
COLUMN
if (tokens.canConsume("CONSTRAINT")) {
- String constraintName = tokens.consume(); // constraint name
+ String constraintName = parseName(tokens); // constraint name
AstNode constraintNode = nodeFactory().node(constraintName,
alterTableNode, TYPE_DROP_TABLE_CONSTRAINT_DEFINITION);
@@ -1389,7 +1389,7 @@
boolean isReplace = tokens.canConsume(STMT_CREATE_OR_REPLACE_RULE);
tokens.canConsume(STMT_CREATE_RULE);
- String name = tokens.consume();
+ String name = parseName(tokens);
AstNode node = nodeFactory().node(name, parentNode, TYPE_CREATE_RULE_STATEMENT);
if (isReplace) {
@@ -1413,7 +1413,7 @@
tokens.canConsume(STMT_CREATE_FUNCTION);
- String name = tokens.consume();
+ String name = parseName(tokens);
AstNode node = nodeFactory().node(name, parentNode,
TYPE_CREATE_FUNCTION_STATEMENT);
Modified:
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/node/AstNode.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/node/AstNode.java 2009-12-03
22:14:00 UTC (rev 1393)
+++
trunk/extensions/dna-sequencer-ddl/src/main/java/org/jboss/dna/sequencer/ddl/node/AstNode.java 2009-12-03
22:16:50 UTC (rev 1394)
@@ -98,7 +98,7 @@
if (this.parent == null) return snsIndex;
// Go through all the children ...
for (AstNode sibling : this.parent.getChildren()) {
- if (sibling == this) continue;
+ if (sibling == this) break;
if (sibling.getName().equals(this.name)) ++snsIndex;
}
return snsIndex;
Modified:
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParsersTest.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParsersTest.java 2009-12-03
22:14:00 UTC (rev 1393)
+++
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlParsersTest.java 2009-12-03
22:16:50 UTC (rev 1394)
@@ -212,7 +212,7 @@
assertThat(alterNodes.size(), is(120));
List<AstNode> dropSchemaNodes = nodeFactory.getChildrenForType(rootNode,
TYPE_DROP_SCHEMA_STATEMENT);
assertThat(dropSchemaNodes.size(), is(1));
- List<AstNode> unknownNodes = nodeFactory.getChildrenForType(rootNode,
TYPE_STATEMENT);
+ List<AstNode> unknownNodes = nodeFactory.getChildrenForType(rootNode,
TYPE_UNKNOWN_STATEMENT);
assertThat(unknownNodes.size(), is(1));
}
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 2009-12-03
22:14:00 UTC (rev 1393)
+++
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/DdlSequencerTest.java 2009-12-03
22:16:50 UTC (rev 1394)
@@ -25,12 +25,11 @@
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNull.notNullValue;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
-import java.util.Iterator;
-import java.util.Map;
import org.jboss.dna.graph.Graph;
import org.jboss.dna.graph.Subgraph;
import org.jboss.dna.graph.SubgraphNode;
@@ -42,6 +41,10 @@
import org.jboss.dna.graph.property.ValueFormatException;
import org.jboss.dna.graph.sequencer.MockSequencerContext;
import org.jboss.dna.graph.sequencer.StreamSequencerContext;
+import org.jboss.dna.sequencer.ddl.dialect.derby.DerbyDdlLexicon;
+import org.jboss.dna.sequencer.ddl.dialect.mysql.MySqlDdlLexicon;
+import org.jboss.dna.sequencer.ddl.dialect.oracle.OracleDdlLexicon;
+import org.jboss.dna.sequencer.ddl.dialect.postgres.PostgresDdlLexicon;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -65,18 +68,15 @@
context.getNamespaceRegistry().register("jcr",
"http://www.jcp.org/jcr/1.0");
context.getNamespaceRegistry().register("nt",
"http://www.jcp.org/jcr/nt/1.0");
context.getNamespaceRegistry().register("mix",
"http://www.jcp.org/jcr/mix/1.0");
- context.getNamespaceRegistry().register("ddl",
"http://jboss.org/dna/ddl/1.0");
- context.getNamespaceRegistry().register("derbyddl",
"http://jboss.org/dna/ddl/derby/1.0");
- context.getNamespaceRegistry().register("oracleddl",
"http://jboss.org/dna/ddl/oracle/1.0");
- context.getNamespaceRegistry().register("postgresddl",
"http://jboss.org/dna/ddl/postgres/1.0");
- context.getNamespaceRegistry().register("mysqlddl",
"http://jboss.org/dna/ddl/mysql/1.0");
+ context.getNamespaceRegistry().register(StandardDdlLexicon.Namespace.PREFIX,
StandardDdlLexicon.Namespace.URI);
+ context.getNamespaceRegistry().register(DerbyDdlLexicon.Namespace.PREFIX,
DerbyDdlLexicon.Namespace.URI);
+ context.getNamespaceRegistry().register(OracleDdlLexicon.Namespace.PREFIX,
OracleDdlLexicon.Namespace.URI);
+ context.getNamespaceRegistry().register(PostgresDdlLexicon.Namespace.PREFIX,
PostgresDdlLexicon.Namespace.URI);
+ context.getNamespaceRegistry().register(MySqlDdlLexicon.Namespace.PREFIX,
MySqlDdlLexicon.Namespace.URI);
InMemoryRepositorySource source = new InMemoryRepositorySource();
source.setName("actual");
graph = Graph.create(source, context);
- // InMemoryRepositorySource expectedSource = new InMemoryRepositorySource();
- // expectedSource.setName("expected");
- // expectedGraph = Graph.create(expectedSource, context);
output = new GraphSequencerOutput(graph);
}
@@ -124,16 +124,146 @@
protected Path path( String path ) {
return context.getValueFactories().getPathFactory().create(path);
}
+
+ /**
+ * Utility to create a string value from an {@link Object}
+ *
+ * @param value the value object
+ * @return the string value of the object
+ * @throws ValueFormatException if a path could not be created from the supplied
string
+ */
+ protected String value( Object value ) {
+ return context.getValueFactories().getStringFactory().create(value);
+ }
+
+ private boolean verifyProperty(SubgraphNode node, String propNameStr, String
expectedValue) {
+ Name propName = name(propNameStr);
+ for( Property prop : node.getProperties()) {
+ if (prop.getName().equals(propName) ) {
+ for (Object nextVal : prop.getValuesAsArray()) {
+ String valueStr = value(nextVal);
+ if( valueStr.equals(expectedValue)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ private boolean verifyHasProperty(SubgraphNode node, String propNameStr) {
+ Name propName = name(propNameStr);
+ for( Property prop : node.getProperties()) {
+ if (prop.getName().equals(propName) ) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean verifyPrimaryType(SubgraphNode node, String expectedValue) {
+ return verifyProperty(node, "jcr:primaryType", expectedValue);
+ }
+
+ private boolean verifyMixinType(SubgraphNode node, String expectedValue) {
+ return verifyProperty(node, "jcr:mixinTypes", expectedValue);
+ }
+
+ private boolean verifyExpression(SubgraphNode node, String expectedValue) {
+ return verifyProperty(node, "ddl:expression", expectedValue);
+ }
+
+ private void verifyBaseProperties(SubgraphNode node, String primaryType, String
lineNum, String colNum, String charIndex, int numChildren) {
+ assertThat(verifyPrimaryType(node, primaryType), is(true));
+ assertThat(verifyProperty(node, "ddl:startLineNumber", lineNum),
is(true));
+ assertThat(verifyProperty(node, "ddl:startColumnNumber", colNum),
is(true));
+ assertThat(verifyProperty(node, "ddl:startCharIndex", charIndex),
is(true));
+ assertThat(node.getChildren().size(), is(numChildren));
+ }
+
+ @Test
+ public void shouldSequenceCreateSchema() throws IOException {
+ // CREATE SCHEMA hollywood
+ // CREATE TABLE films (title varchar(255), release date, producerName
varchar(255))
+ // CREATE VIEW winners AS
+ // SELECT title, release FROM films WHERE producerName IS NOT NULL;
+
+ // Subgraph
+ // <name = "/" uuid =
"0a3501e8-a6ec-4a0e-89b7-9cf64476b18b">
+ // <name = "statements" primaryType =
"nt:unstructured" uuid = "56f305d6-aa76-4b1a-8e06-bd0c2981c2ff"
parserId = "POSTGRES">
+ // <name = "hollywood" startLineNumber = "1"
primaryType = "nt:unstructured" uuid =
"88d2901d-eeaa-4bd6-80c4-243ea56f7c20" startColumnNumber = "1"
mixinTypes = "ddl:createSchemaStatement" expression = "CREATE SCHEMA
hollywood" startCharIndex = "0">
+ // <name = "films" startLineNumber = "2"
primaryType = "nt:unstructured" uuid =
"8ff9e0a1-ad32-48b0-8a76-011fd6a35142" startColumnNumber = "5"
mixinTypes = "ddl:createTableStatement" expression = "CREATE TABLE films
(title varchar(255), release date, producerName varchar(255))" startCharIndex =
"28">
+ // <name = "title" datatypeName = "VARCHAR"
datatypeLength = "255" primaryType = "nt:unstructured" uuid =
"c1a65f89-2ed4-4a39-858d-b4fd06c60879" mixinTypes =
"ddl:columnDefinition">
+ // <name = "release" datatypeName = "DATE"
primaryType = "nt:unstructured" uuid =
"67b8ee6d-341e-4e7e-bb79-bdec0caa6865" mixinTypes =
"ddl:columnDefinition">
+ // <name = "producerName" datatypeName =
"VARCHAR" datatypeLength = "255" primaryType =
"nt:unstructured" uuid = "83deb1a7-8ccb-479c-ab38-acc64be99251"
mixinTypes = "ddl:columnDefinition">
+ // <name = "winners" startLineNumber = "3"
primaryType = "nt:unstructured" uuid =
"c8610a1c-be27-4b16-9b0b-fc631dbfd00b" startColumnNumber = "5"
mixinTypes = "ddl:createViewStatement" expression = "CREATE VIEW winners AS
SELECT title, release FROM films WHERE producerName IS NOT NULL;" queryExpression =
" SELECT title, release FROM films WHERE producerName IS NOT NULL"
startCharIndex = "113">
- @Test
- public void shouldGenerateNodeTypesForCreateTables() throws IOException {
- URL url =
this.getClass().getClassLoader().getResource("ddl/createTables.ddl");
+
+ URL url =
this.getClass().getClassLoader().getResource("ddl/create_schema.ddl");
assertThat(url, is(notNullValue()));
content = url.openStream();
assertThat(content, is(notNullValue()));
sequencer.sequence(content, output, context);
+
+ output.close();
+
+ // File expectedFile = new File("src/test/resources/");
+ // if ( expectedFile.exists() ) {
+ // expectedGraph.importXmlFrom(expectedFile).into("/");
+
+ Subgraph subgraph = graph.getSubgraphOfDepth(10).at("/");
+ assertThat(subgraph, is(notNullValue()));
+ String value = subgraph.toString();
+ System.out.println(value);
+
+ SubgraphNode rootNode = subgraph.getNode(".");
+ assertThat(rootNode.getChildren().size(), is(1));
+
+ SubgraphNode statementsNode =
rootNode.getNode(path("ddl:statements"));
+ assertNotNull(statementsNode);
+ assertThat(statementsNode.getChildren().size(), is(1));
+
+ assertThat(verifyPrimaryType(statementsNode, "nt:unstructured"),
is(true));
+ assertThat(verifyProperty(statementsNode, "ddl:parserId",
"POSTGRES"), is(true));
+
+ SubgraphNode schemaNode = statementsNode.getNode(path("hollywood"));
+ assertNotNull(schemaNode);
+ verifyBaseProperties(schemaNode, "nt:unstructured", "1",
"1", "0", 2);
+ assertThat(verifyMixinType(schemaNode, "ddl:createSchemaStatement"),
is(true));
+ assertThat(verifyExpression(schemaNode, "CREATE SCHEMA hollywood"),
is(true));
+
+ SubgraphNode filmsNode = schemaNode.getNode(path("films"));
+ assertNotNull(filmsNode);
+ verifyBaseProperties(filmsNode, "nt:unstructured", "2",
"5", "28", 3);
+ assertThat(verifyMixinType(filmsNode, "ddl:createTableStatement"),
is(true));
+ assertThat(verifyExpression(filmsNode, "CREATE TABLE films (title
varchar(255), release date, producerName varchar(255))"), is(true));
+
+ SubgraphNode winnersNode = schemaNode.getNode(path("winners"));
+ assertNotNull(winnersNode);
+ verifyBaseProperties(winnersNode, "nt:unstructured", "3",
"5", "113", 0);
+ assertThat(verifyMixinType(winnersNode, "ddl:createViewStatement"),
is(true));
+ assertThat(verifyExpression(winnersNode, "CREATE VIEW winners AS SELECT
title, release FROM films WHERE producerName IS NOT NULL;"), is(true));
+
+ // Check Column Properties
+ SubgraphNode titleNode = filmsNode.getNode(path("title"));
+ assertNotNull(titleNode);
+ assertThat(verifyPrimaryType(titleNode, "nt:unstructured"), is(true));
+ assertThat(verifyProperty(titleNode, "ddl:datatypeName",
"VARCHAR"), is(true));
+ assertThat(verifyProperty(titleNode, "ddl:datatypeLength",
"255"), is(true));
+ assertThat(verifyMixinType(titleNode, "ddl:columnDefinition"),
is(true));
+
+ SubgraphNode releaseNode = filmsNode.getNode(path("release"));
+ assertNotNull(releaseNode);
+ assertThat(verifyPrimaryType(releaseNode, "nt:unstructured"),
is(true));
+ assertThat(verifyProperty(releaseNode, "ddl:datatypeName",
"DATE"), is(true));
+ assertThat(verifyHasProperty(releaseNode, "ddl:datatypeLength"),
is(false));
+ assertThat(verifyMixinType(titleNode, "ddl:columnDefinition"),
is(true));
+
+
+
+ // Map<Property> props = output.getProperties(nodePath)
}
-
+
@Test
public void shouldSequenceCreateTable() throws IOException {
// CREATE TABLE IDTABLE
@@ -141,91 +271,374 @@
// IDCONTEXT VARCHAR(20) NOT NULL PRIMARY KEY,
// NEXTID NUMERIC
// );
+
+ // Subgraph
+ // <name = "/" uuid =
"8325c96e-e81c-4f16-9c08-33b408e4f7cf">
+ // <name = "statements" primaryType =
"nt:unstructured" uuid = "ac307790-7378-44fe-8a06-e4292574e2f1"
parserId = "SQL92">
+ // <name = "IDTABLE" startLineNumber = "1"
primaryType = "nt:unstructured" uuid =
"cb0e1c03-0815-4b3b-92a0-b95a5980be53" startColumnNumber = "1"
mixinTypes = "ddl:createTableStatement" expression = "CREATE TABLE IDTABLE
+ // (
+ // IDCONTEXT VARCHAR(20) NOT NULL PRIMARY KEY,
+ // NEXTID NUMERIC
+ // );" startCharIndex = "0">
+ // <name = "IDCONTEXT" datatypeName = "VARCHAR"
datatypeLength = "20" primaryType = "nt:unstructured" uuid =
"ab269004-852a-4731-9886-9ec8dff230b9" nullable = "NOT NULL"
mixinTypes = "ddl:columnDefinition">
+ // <name = "PK_1" primaryType =
"nt:unstructured" uuid = "7395e24e-db3d-412d-91fe-d479258b8641"
mixinTypes = "ddl:tableConstraint" constraintType = "2">
+ // <name = "IDCONTEXT" primaryType =
"nt:unstructured" uuid = "43f052c7-fbf9-4243-a995-86092c367177"
mixinTypes = "ddl:columnReference">
+ // <name = "NEXTID" datatypeName = "NUMERIC"
primaryType = "nt:unstructured" uuid =
"91dc78bc-0c43-4f80-9579-4010e31a7ae3" datatypePrecision = "0"
mixinTypes = "ddl:columnDefinition" datatypeScale = "0">
+
+ String targetExpression = "CREATE TABLE IDTABLE\n"
++ "(\n"
++ " IDCONTEXT VARCHAR(20) NOT NULL PRIMARY KEY,\n"
++ " NEXTID NUMERIC\n"
++ ");";
+
URL url =
this.getClass().getClassLoader().getResource("ddl/create_table.ddl");
assertThat(url, is(notNullValue()));
content = url.openStream();
assertThat(content, is(notNullValue()));
sequencer.sequence(content, output, context);
+
+ output.close();
- // Map<Name, Property> props = output.getProperties("xxxxxx");
+ Subgraph subgraph = graph.getSubgraphOfDepth(10).at("/");
+ assertThat(subgraph, is(notNullValue()));
+ String value = subgraph.toString();
+ System.out.println(value);
+
+ SubgraphNode rootNode = subgraph.getNode(".");
+ assertThat(rootNode.getChildren().size(), is(1));
+
+ SubgraphNode statementsNode =
rootNode.getNode(path("ddl:statements"));
+ assertNotNull(statementsNode);
+ assertThat(statementsNode.getChildren().size(), is(1));
+ assertThat(verifyPrimaryType(statementsNode, "nt:unstructured"),
is(true));
+ assertThat(verifyProperty(statementsNode, "ddl:parserId",
"SQL92"), is(true));
+
+ SubgraphNode tableNode = statementsNode.getNode(path("IDTABLE"));
+ assertNotNull(tableNode);
+ verifyBaseProperties(tableNode, "nt:unstructured", "1",
"1", "0", 3);
+ assertThat(verifyMixinType(tableNode, "ddl:createTableStatement"),
is(true));
+ assertThat(verifyExpression(tableNode, targetExpression), is(true));
+
+ // Check Column Properties
+ SubgraphNode idcontextNode = tableNode.getNode(path("IDCONTEXT"));
+ assertNotNull(idcontextNode);
+ assertThat(verifyPrimaryType(idcontextNode, "nt:unstructured"),
is(true));
+ assertThat(verifyProperty(idcontextNode, "ddl:datatypeName",
"VARCHAR"), is(true));
+ assertThat(verifyProperty(idcontextNode, "ddl:datatypeLength",
"20"), is(true));
+ assertThat(verifyMixinType(idcontextNode, "ddl:columnDefinition"),
is(true));
+
+ SubgraphNode nextidNode = tableNode.getNode(path("NEXTID"));
+ assertNotNull(nextidNode);
+ assertThat(verifyPrimaryType(nextidNode, "nt:unstructured"),
is(true));
+ assertThat(verifyProperty(nextidNode, "ddl:datatypeName",
"NUMERIC"), is(true));
+ assertThat(verifyProperty(nextidNode, "ddl:datatypePrecision",
"0"), is(true));
+ assertThat(verifyProperty(nextidNode, "ddl:datatypeScale",
"0"), is(true));
+ assertThat(verifyHasProperty(nextidNode, "ddl:datatypeLength"),
is(false));
+ assertThat(verifyMixinType(nextidNode, "ddl:columnDefinition"),
is(true));
+
+ 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(verifyMixinType(pk_1_Node, "ddl:tableConstraint"),
is(true));
+
+ // One column reference
+ assertThat(pk_1_Node.getChildren().size(), is(1));
+ SubgraphNode idcontectRefNode = pk_1_Node.getNode(path("IDCONTEXT"));
+ assertNotNull(idcontectRefNode);
+ assertThat(verifyPrimaryType(idcontectRefNode, "nt:unstructured"),
is(true));
+ assertThat(verifyMixinType(idcontectRefNode, "ddl:columnReference"),
is(true));
}
+
+ @Test
+ public void shouldSequenceStatementsWithDoubleQuotes() throws IOException {
+ //ALTER JAVA CLASS "Agent"
+ // RESOLVER (("/home/java.101/bin/*" pm)(* public))
+ // RESOLVE;
+ //
+ // CREATE SERVER foo FOREIGN DATA WRAPPER "default";
+ //
+ // CREATE RULE "_RETURN" AS
+ // ON SELECT TO t1
+ // DO INSTEAD
+ // SELECT * FROM t2;
+
+ // Subgraph
+ // <name = "/" uuid =
"233d07e5-8431-4844-856b-ac80d0129c01">
+ // <name = "statements" primaryType =
"nt:unstructured" uuid = "dbd23d78-8005-4b7b-aa61-eac98726b8d4"
parserId = "POSTGRES">
+ // <name = "unknownStatement" startLineNumber =
"1" primaryType = "nt:unstructured" uuid =
"b3fb1e1f-284b-46bd-9a06-86d1b85dd5b3" startColumnNumber = "1"
mixinTypes = "ddl:unknownStatement" expression = "ALTER JAVA CLASS
"Agent"
+ // RESOLVER (("/home/java.101/bin/*" pm)(* public))
+ // RESOLVE;" startCharIndex = "0">
+ // <name = "CREATE SERVER" startLineNumber =
"5" primaryType = "nt:unstructured" uuid =
"10217bab-877f-4b45-b169-2f81bb31f620" startColumnNumber = "1"
mixinTypes = "postgresddl:createServerStatement" expression = "CREATE
SERVER foo FOREIGN DATA WRAPPER "default";" startCharIndex =
"93">
+ // <name = "_RETURN" startLineNumber = "7"
primaryType = "nt:unstructured" uuid =
"2b655039-f239-4930-8c1b-a3b9a8e7c949" startColumnNumber = "1"
mixinTypes = "postgresddl:createRuleStatement" expression = "CREATE RULE
"_RETURN" AS
+ // ON SELECT TO t1
+ // DO INSTEAD
+ // SELECT * FROM t2;" startCharIndex = "144">
+
+ URL url =
this.getClass().getClassLoader().getResource("ddl/d_quoted_statements.ddl");
+ assertThat(url, is(notNullValue()));
+ content = url.openStream();
+ assertThat(content, is(notNullValue()));
+ sequencer.sequence(content, output, context);
+
+ output.close();
+ Subgraph subgraph = graph.getSubgraphOfDepth(10).at("/");
+ assertThat(subgraph, is(notNullValue()));
+ String value = subgraph.toString();
+ System.out.println(value);
+
+ SubgraphNode rootNode = subgraph.getNode(".");
+ assertThat(rootNode.getChildren().size(), is(1));
+
+ SubgraphNode statementsNode =
rootNode.getNode(path("ddl:statements"));
+ assertNotNull(statementsNode);
+ assertThat(statementsNode.getChildren().size(), is(3));
+ assertThat(verifyPrimaryType(statementsNode, "nt:unstructured"),
is(true));
+ assertThat(verifyProperty(statementsNode, "ddl:parserId",
"POSTGRES"), is(true));
+
+ SubgraphNode firstNode =
statementsNode.getNode(path("unknownStatement"));
+ assertNotNull(firstNode);
+ verifyBaseProperties(firstNode, "nt:unstructured", "1",
"1", "0", 0);
+ assertThat(verifyMixinType(firstNode, "ddl:unknownStatement"),
is(true));
+
+ SubgraphNode serverNode = statementsNode.getNode(path("CREATE
SERVER"));
+ assertNotNull(serverNode);
+ verifyBaseProperties(serverNode, "nt:unstructured", "5",
"1", "93", 0);
+ assertThat(verifyMixinType(serverNode,
"postgresddl:createServerStatement"), is(true));
+
+ SubgraphNode ruleNode = statementsNode.getNode(path("_RETURN"));
+ assertNotNull(ruleNode);
+ verifyBaseProperties(ruleNode, "nt:unstructured", "7",
"1", "144", 0);
+ assertThat(verifyMixinType(ruleNode,
"postgresddl:createRuleStatement"), is(true));
+
+ }
+
@Test
- public void shouldSequenceCreateSchema() throws IOException {
- // CREATE SCHEMA hollywood
- // CREATE TABLE films (title varchar(255), release date, producerName
varchar(255))
- // CREATE VIEW winners AS
- // SELECT title, release FROM films WHERE producerName IS NOT NULL;
- URL url =
this.getClass().getClassLoader().getResource("ddl/create_schema.ddl");
+ public void shouldGenerateNodeTypesForCreateTables() throws IOException {
+ URL url =
this.getClass().getClassLoader().getResource("ddl/createTables.ddl");
assertThat(url, is(notNullValue()));
content = url.openStream();
assertThat(content, is(notNullValue()));
sequencer.sequence(content, output, context);
-
+
output.close();
- // File expectedFile = new File("src/test/resources/");
- // if ( expectedFile.exists() ) {
- // expectedGraph.importXmlFrom(expectedFile).into("/");
+ Subgraph subgraph = graph.getSubgraphOfDepth(10).at("/");
+ assertThat(subgraph, is(notNullValue()));
+ String value = subgraph.toString();
+ System.out.println(value);
+
+ SubgraphNode rootNode = subgraph.getNode(".");
+ assertThat(rootNode.getChildren().size(), is(1));
+
+ SubgraphNode statementsNode =
rootNode.getNode(path("ddl:statements"));
+ assertNotNull(statementsNode);
+ assertThat(statementsNode.getChildren().size(), is(20));
+ assertThat(verifyPrimaryType(statementsNode, "nt:unstructured"),
is(true));
+ assertThat(verifyProperty(statementsNode, "ddl:parserId",
"SQL92"), is(true));
+
+ // Check one table
+ //CREATE TABLE RT_MDLS
+ //(
+ // MDL_UID NUMERIC(20) NOT NULL,
+ // MDL_UUID VARCHAR(64) NOT NULL,
+ // MDL_NM VARCHAR(255) NOT NULL,
+ // MDL_VERSION VARCHAR(50),
+ // DESCRIPTION VARCHAR(255),
+ // MDL_URI VARCHAR(255),
+ // MDL_TYPE NUMERIC(3),
+ // IS_PHYSICAL CHAR(1) NOT NULL,
+ // MULTI_SOURCED CHAR(1) DEFAULT '0',
+ // VISIBILITY NUMERIC(3)
+ //
+ //);
+ //<name = "RT_MDLS" startLineNumber = "80" primaryType =
"nt:unstructured" uuid = "a11e48d5-0908-467b-ba79-a497df87a576"
startColumnNumber = "1" mixinTypes = "ddl:createTableStatement"
expression = "CREATE TABLE RT_MDLS...." startCharIndex = "2258">
+ // <name = "MDL_UID" datatypeName = "NUMERIC"
primaryType = "nt:unstructured" uuid =
"85b9c2b3-cadc-425c-a736-656be1475780" datatypePrecision = "20"
nullable = "NOT NULL" mixinTypes = "ddl:columnDefinition"
datatypeScale = "0">
+ // <name = "MDL_UUID" datatypeName = "VARCHAR"
datatypeLength = "64" primaryType = "nt:unstructured" uuid =
"88766ab0-32e6-44f6-9244-78d48b2242d4" nullable = "NOT NULL"
mixinTypes = "ddl:columnDefinition">
+ // <name = "MDL_NM" datatypeName = "VARCHAR"
datatypeLength = "255" primaryType = "nt:unstructured" uuid =
"cb29fa8e-03f0-4e82-8040-5d853aa8a1f9" nullable = "NOT NULL"
mixinTypes = "ddl:columnDefinition">
+ // <name = "MDL_VERSION" datatypeName = "VARCHAR"
datatypeLength = "50" primaryType = "nt:unstructured" uuid =
"169a4e2f-79a4-47a4-8e23-4fa1ea09c876" mixinTypes =
"ddl:columnDefinition">
+ // <name = "DESCRIPTION" datatypeName = "VARCHAR"
datatypeLength = "255" primaryType = "nt:unstructured" uuid =
"00682ead-5bb0-4c0d-b243-6edbf56dcb4a" mixinTypes =
"ddl:columnDefinition">
+ // <name = "MDL_URI" datatypeName = "VARCHAR"
datatypeLength = "255" primaryType = "nt:unstructured" uuid =
"851f94e1-5d43-4a58-be6c-720a6c3bec7f" mixinTypes =
"ddl:columnDefinition">
+ // <name = "MDL_TYPE" datatypeName = "NUMERIC"
primaryType = "nt:unstructured" uuid =
"a7b74a6f-872d-4e8b-a2da-4ebf6ef38ed4" datatypePrecision = "3"
mixinTypes = "ddl:columnDefinition" datatypeScale = "0">
+ // <name = "IS_PHYSICAL" datatypeName = "CHAR"
datatypeLength = "1" primaryType = "nt:unstructured" uuid =
"b96aeaaa-4bd8-4154-9daf-50aac2fd9529" nullable = "NOT NULL"
mixinTypes = "ddl:columnDefinition">
+ // <name = "MULTI_SOURCED" datatypeName = "CHAR"
defaultValue = "'0'" datatypeLength = "1" defaultOption =
"0" primaryType = "nt:unstructured" uuid =
"75c48a37-f65c-4854-bca4-8d504cf8b658" mixinTypes =
"ddl:columnDefinition">
+ // <name = "VISIBILITY" datatypeName = "NUMERIC"
primaryType = "nt:unstructured" uuid =
"345ac63b-a343-408d-9262-6e009ad3e0c2" datatypePrecision = "3"
mixinTypes = "ddl:columnDefinition" datatypeScale = "0">
- //assertThat(graph.getChildren().of("/statements"),
hasChildren(segment("hollywood")));
+ SubgraphNode tableNode = statementsNode.getNode(path("RT_MDLS"));
+ assertNotNull(tableNode);
+ verifyBaseProperties(tableNode, "nt:unstructured", "80",
"1", "2258", 10);
+ assertThat(verifyMixinType(tableNode, "ddl:createTableStatement"),
is(true));
+ // Check Column Properties
+ SubgraphNode node_1 = tableNode.getNode(path("MDL_UUID"));
+ assertNotNull(node_1);
+ assertThat(verifyPrimaryType(node_1, "nt:unstructured"), is(true));
+ assertThat(verifyProperty(node_1, "ddl:datatypeName",
"VARCHAR"), is(true));
+ assertThat(verifyProperty(node_1, "ddl:datatypeLength",
"64"), is(true));
+ assertThat(verifyMixinType(node_1, "ddl:columnDefinition"), is(true));
+ SubgraphNode node_2 = tableNode.getNode(path("MDL_TYPE"));
+ assertNotNull(node_2);
+ assertThat(verifyPrimaryType(node_2, "nt:unstructured"), is(true));
+ assertThat(verifyProperty(node_2, "ddl:datatypeName",
"NUMERIC"), is(true));
+ assertThat(verifyProperty(node_2, "ddl:datatypePrecision",
"3"), is(true));
+ assertThat(verifyProperty(node_2, "ddl:datatypeScale", "0"),
is(true));
+ assertThat(verifyHasProperty(node_2, "ddl:datatypeLength"),
is(false));
+ assertThat(verifyMixinType(node_2, "ddl:columnDefinition"), is(true));
+ }
+
+ @Test
+ public void shouldSequenceDerbyDdl() throws IOException {
+ URL url =
this.getClass().getClassLoader().getResource("ddl/dialect/derby/derby_test_statements.ddl");
+ assertThat(url, is(notNullValue()));
+ content = url.openStream();
+ assertThat(content, is(notNullValue()));
+ sequencer.sequence(content, output, context);
+ output.close();
+
Subgraph subgraph = graph.getSubgraphOfDepth(10).at("/");
assertThat(subgraph, is(notNullValue()));
- //assertThat(subgraph.getNode("/statements"), is(notNullValue()));
- //assertThat(subgraph.getNode(".").getChildren(),
hasChildren(segment("statements")));
- //Iterator<SubgraphNode> actualIter = actual.iterator();
+ String value = subgraph.toString();
+ System.out.println(value);
SubgraphNode rootNode = subgraph.getNode(".");
assertThat(rootNode.getChildren().size(), is(1));
- Iterator<SubgraphNode> expected = subgraph.iterator();
- while ( expected.hasNext() ) {
- SubgraphNode nextNode = expected.next();
- System.out.println("\n NODE = " + nextNode);
- System.out.println(" PATH = " +
nextNode.getLocation().getPath());
- Map<Name,Property> actualProperties = nextNode.getPropertiesByName();
- for(Name nextKey: actualProperties.keySet()) {
- Property nextValue = actualProperties.get(nextKey);
- System.out.println(" KEY = " + nextKey + "
VALUE = " + nextValue.getFirstValue());
- }
- }
- //SubgraphNode schemaNode = rootNode.getNode(path("ddl:statements"));
- //assertThat(schemaNode.getChildren().size(), is(2));
+ SubgraphNode statementsNode =
rootNode.getNode(path("ddl:statements"));
+ assertNotNull(statementsNode);
+ assertThat(statementsNode.getChildren().size(), is(64));
+ assertThat(verifyPrimaryType(statementsNode, "nt:unstructured"),
is(true));
+ assertThat(verifyProperty(statementsNode, "ddl:parserId",
"DERBY"), is(true));
+ // CREATE INDEX IXSALE ON SAMP.SALES (SALES);
+ // <name = "IXSALE" startLineNumber = "87" primaryType
= "nt:unstructured" uuid = "85740506-ac6e-46f3-8118-be0c9eb1bc57"
startColumnNumber = "1" mixinTypes = "derbyddl:createIndexStatement"
tableName = "SAMP.SALES" expression = "CREATE INDEX IXSALE ON SAMP.SALES
(SALES);" unique = "false" startCharIndex = "2886">
- // Subgraph expected = expectedGraph.getSubgraphOfDepth(10).at("/");
- // // compare subgraphs ...
- // Iterator<SubgraphNode> actualIter = actual.iterator();
- // Iterator<SubgraphNode> expectedIter = expected.iterator();
- // while ( actualIter.hasNext() && expectedIter.hasNext() ) {
- // SubgraphNode actualNode = actualIter.next();
- // SubgraphNode expectedNode = expectedIter.next();
- // // Get properties
- // Map<Name,Property> actualProperties = actualNode.getPropertiesByName();
- // Map<Name,Property> expectedProperties =
expectedNode.getPropertiesByName();
- // // The property names should be the same ...
- // Set<Name> actualPropertyNames = actualProperties.keySet();
- // Set<Name> expectedPropertyNames = expectedProperties.keySet();
- // assertThat(actualPropertyNames,is(expectedPropertyNames));
- // // compare the properties ...
- // for ( Name name : actualPropertyNames ) {
- // Property actualProp = actualProperties.get(name);
- // Property expectedProp = expectedProperties.get(name);
- // // etc.
- // }
- // }
- // assertThat(actualIter.hasNext(), is(false));
- // assertThat(expectedIter.hasNext(), is(false));
+ SubgraphNode indexNode = statementsNode.getNode(path("IXSALE"));
+ assertNotNull(indexNode);
+ verifyBaseProperties(indexNode, "nt:unstructured", "87",
"1", "2886", 0);
+ assertThat(verifyMixinType(indexNode, "derbyddl:createIndexStatement"),
is(true));
+
+ // CREATE SCHEMA FLIGHTS AUTHORIZATION anita;
+ // <name = "FLIGHTS" startLineNumber = "98"
primaryType = "nt:unstructured" uuid =
"e1c8227d-c663-4d4b-8506-b1e41aa1f7f6" startColumnNumber = "1"
mixinTypes = "ddl:createSchemaStatement" expression = "CREATE SCHEMA
FLIGHTS AUTHORIZATION anita;" startCharIndex = "3218">
+ SubgraphNode schemaNode = statementsNode.getNode(path("FLIGHTS"));
+ assertNotNull(schemaNode);
+ verifyBaseProperties(schemaNode, "nt:unstructured", "98",
"1", "3218", 0);
+ assertThat(verifyMixinType(schemaNode, "ddl:createSchemaStatement"),
is(true));
+ assertThat(verifyExpression(schemaNode, "CREATE SCHEMA FLIGHTS AUTHORIZATION
anita;"), is(true));
+
+ // DROP PROCEDURE some_procedure_name;
+ // <name = "unknownStatement[3]" startLineNumber =
"172" primaryType = "nt:unstructured" uuid =
"1f57c0ec-4361-4f64-963d-dcb919c27656" startColumnNumber = "1"
mixinTypes = "ddl:unknownStatement" expression = "DROP PROCEDURE
some_procedure_name;" startCharIndex = "5438">
+ SubgraphNode unknownNode_1 =
statementsNode.getNode(path("some_procedure_name"));
+ assertNotNull(unknownNode_1);
+ verifyBaseProperties(unknownNode_1, "nt:unstructured", "172",
"1", "5438", 0);
+ assertThat(verifyMixinType(unknownNode_1,
"derbyddl:dropProcedureStatement"), is(true));
+ assertThat(verifyExpression(unknownNode_1, "DROP PROCEDURE
some_procedure_name;"), is(true));
+
+ //ALTER TABLE SAMP.DEPARTMENT
+ // ADD CONSTRAINT NEW_UNIQUE UNIQUE (DEPTNO);
+
+ //<name = "SAMP.DEPARTMENT" startLineNumber = "16"
primaryType = "nt:unstructured" uuid =
"b3c54a3c-4779-48a0-a2f3-80e5079bb62c" startColumnNumber = "1"
mixinTypes = "ddl:alterTableStatement" expression = "ALTER TABLE
SAMP.DEPARTMENT
+ // ADD CONSTRAINT NEW_UNIQUE UNIQUE (DEPTNO);
//
- // } else {
- // // write out the actual graph to the expected file
- // }
- //System.out.println(subgraph);
+ //-- add a new foreign key constraint to the
+ //-- Cities table. Each row in Cities is checked
+ //-- to make sure it satisfied the constraints.
+ //-- if any rows don't satisfy the constraint, the
+ //-- constraint is not added" startCharIndex = "478">
+ // <name = "NEW_UNIQUE" primaryType =
"nt:unstructured" uuid = "c678bb9d-a0ac-4f69-b8a0-ec890557bc20"
mixinTypes = "ddl:addTableConstraintDefinition" constraintType =
"0">
+ // <name = "DEPTNO" primaryType = "nt:unstructured"
uuid = "0f019782-e72d-485a-8f8c-e62954fd6ae6" mixinTypes =
"ddl:columnReference">
+ SubgraphNode alterTableNode =
statementsNode.getNode(path("SAMP.DEPARTMENT"));
+ assertNotNull(alterTableNode);
+ verifyBaseProperties(alterTableNode, "nt:unstructured", "16",
"1", "478", 1);
+ assertThat(verifyMixinType(alterTableNode, "ddl:alterTableStatement"),
is(true));
+
+ SubgraphNode uniqueNode = alterTableNode.getNode(path("NEW_UNIQUE"));
+ assertNotNull(uniqueNode);
+ assertThat(verifyPrimaryType(uniqueNode, "nt:unstructured"),
is(true));
+ assertThat(verifyProperty(uniqueNode, "ddl:constraintType",
"0"), is(true));
+ assertThat(verifyMixinType(uniqueNode,
"ddl:addTableConstraintDefinition"), is(true));
+
+ // One column reference
+ assertThat(uniqueNode.getChildren().size(), is(1));
+ SubgraphNode colRefNode = uniqueNode.getNode(path("DEPTNO"));
+ assertNotNull(colRefNode);
+ assertThat(verifyPrimaryType(colRefNode, "nt:unstructured"),
is(true));
+ assertThat(verifyMixinType(colRefNode, "ddl:columnReference"),
is(true));
+ }
- // Map<Property> props = output.getProperties(nodePath)
+ @Test
+ public void shouldSequenceOracleDdl() throws IOException {
+ URL url =
this.getClass().getClassLoader().getResource("ddl/dialect/oracle/oracle_test_statements_2.ddl");
+ assertThat(url, is(notNullValue()));
+ content = url.openStream();
+ assertThat(content, is(notNullValue()));
+ sequencer.sequence(content, output, context);
+
+ output.close();
+
+ Subgraph subgraph = graph.getSubgraphOfDepth(10).at("/");
+ assertThat(subgraph, is(notNullValue()));
+ String value = subgraph.toString();
+ System.out.println(value);
+
+ SubgraphNode rootNode = subgraph.getNode(".");
+ assertThat(rootNode.getChildren().size(), is(1));
+
+ SubgraphNode statementsNode =
rootNode.getNode(path("ddl:statements"));
+ assertNotNull(statementsNode);
+ assertThat(statementsNode.getChildren().size(), is(50));
+ assertThat(verifyPrimaryType(statementsNode, "nt:unstructured"),
is(true));
+ assertThat(verifyProperty(statementsNode, "ddl:parserId",
"ORACLE"), is(true));
+
+ // <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);
+ 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
+ // ADD (duty_pct NUMBER(2,2) CHECK (duty_pct < 10.5),
+ // visa_needed VARCHAR2(3));" startCharIndex = "89">
+ // <name = "duty_pct" datatypeName = "NUMBER"
primaryType = "nt:unstructured" uuid =
"20079cae-5de1-425c-925e-df230410ea69" datatypePrecision = "2"
mixinTypes = "ddl:columnDefinition" datatypeScale = "2">
+ // <name = "CHECK_1" primaryType =
"nt:unstructured" name = "CHECK_1" uuid =
"210039d7-ebe7-47a8-94be-c3adb70b2885" mixinTypes =
"ddl:addTableConstraintDefinition" constraintType = "3"
searchCondition = "( duty_pct < 10 . 5 )">
+ // <name = "visa_needed" datatypeName = "VARCHAR2"
datatypeLength = "3" primaryType = "nt:unstructured" uuid =
"b7b6bf1d-6a2b-411a-aa63-974d13ba20e8" mixinTypes =
"ddl:columnDefinition">
+ SubgraphNode countriesNode =
statementsNode.getNode(path("countries"));
+ assertNotNull(countriesNode);
+ verifyBaseProperties(countriesNode, "nt:unstructured", "9",
"1", "89", 3);
+ assertThat(verifyMixinType(countriesNode, "ddl:alterTableStatement"),
is(true));
+
+ SubgraphNode duty_pct_node = countriesNode.getNode(path("duty_pct"));
+ assertNotNull(duty_pct_node);
+ assertThat(verifyPrimaryType(duty_pct_node, "nt:unstructured"),
is(true));
+ assertThat(verifyProperty(duty_pct_node, "ddl:datatypeName",
"NUMBER"), is(true));
+ assertThat(verifyProperty(duty_pct_node, "ddl:datatypePrecision",
"2"), is(true));
+ assertThat(verifyProperty(duty_pct_node, "ddl:datatypeScale",
"2"), is(true));
+ assertThat(verifyHasProperty(duty_pct_node, "ddl:datatypeLength"),
is(false));
+ assertThat(verifyMixinType(duty_pct_node, "ddl:columnDefinition"),
is(true));
+
+ 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(verifyMixinType(check_1_node,
"ddl:addTableConstraintDefinition"), is(true));
+ assertThat(verifyProperty(check_1_node, "ddl:searchCondition", "(
duty_pct < 10 . 5 )"), is(true));
+
+ SubgraphNode visa_needed_node =
countriesNode.getNode(path("visa_needed"));
+ assertNotNull(visa_needed_node);
+ assertThat(verifyPrimaryType(visa_needed_node, "nt:unstructured"),
is(true));
+ assertThat(verifyProperty(visa_needed_node, "ddl:datatypeName",
"VARCHAR2"), is(true));
+ assertThat(verifyProperty(visa_needed_node, "ddl:datatypeLength",
"3"), is(true));
+ assertThat(verifyMixinType(visa_needed_node, "ddl:columnDefinition"),
is(true));
+
+ // <name = "app_user1" startLineNumber = "33" primaryType
= "nt:unstructured" uuid = "8c660ae8-2078-4263-a0e7-8f517cefd3a0"
startColumnNumber = "1" mixinTypes = "oracleddl:alterUserStatement"
expression = "ALTER USER app_user1
+ // GRANT CONNECT THROUGH sh
+ // WITH ROLE warehouse_user;" startCharIndex = "624">
+
+ SubgraphNode app_user1Node =
statementsNode.getNode(path("app_user1"));
+ assertNotNull(app_user1Node);
+ verifyBaseProperties(app_user1Node, "nt:unstructured", "33",
"1", "624", 0);
+ assertThat(verifyMixinType(app_user1Node,
"oracleddl:alterUserStatement"), 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 2009-12-03
22:14:00 UTC (rev 1393)
+++
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/StandardDdlParserTest.java 2009-12-03
22:16:50 UTC (rev 1394)
@@ -131,6 +131,12 @@
tokens = getTokens(content);
result = parser.parseName(tokens);
assertEquals(targetName, result);
+
+ content = "\"_RETURN\"";
+ targetName = "_RETURN";
+ tokens = getTokens(content);
+ result = parser.parseName(tokens);
+ assertEquals(targetName, result);
}
@Test
@@ -674,7 +680,7 @@
String content = getFileContent(DDL_FILE_PATH + "createTables.ddl");
boolean success = parser.parse(content, rootNode);
- assertThat(rootNode.getChildCount(), is(22));
+ assertThat(rootNode.getChildCount(), is(20));
assertThat(success, is(true));
List<AstNode> theNodes = parser.nodeFactory().getChildrenForType(rootNode,
TYPE_CREATE_TABLE_STATEMENT);
@@ -810,5 +816,22 @@
assertThat(schemaNodes.get(0).getName().getString(),
is("GLOBALFORCEMGMT"));
}
+
+ @Test
+ public void shouldParseStatementsWithDoubleQuotes() {
+ printTest("shouldParseUnterminatedOracleFile()");
+ String content = "ALTER JAVA CLASS \"Agent\""
+ + "RESOLVER ((\"/home/java.101/bin/*\" pm)(* public)) RESOLVE;"
+ + "CREATE SERVER foo FOREIGN DATA WRAPPER \"default\";"
+ + "CREATE RULE \"_RETURN\" AS ON SELECT TO t1 DO INSTEAD SELECT * FROM
t2;";
+ // parser.setTestMode(true);
+
+ boolean success = parser.parse(content, rootNode);
+
+ assertThat(success, is(true));
+
+ assertThat(rootNode.getChildCount(), is(3));
+
+ }
}
Modified:
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParserTest.java
===================================================================
---
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParserTest.java 2009-12-03
22:14:00 UTC (rev 1393)
+++
trunk/extensions/dna-sequencer-ddl/src/test/java/org/jboss/dna/sequencer/ddl/dialect/derby/DerbyDdlParserTest.java 2009-12-03
22:16:50 UTC (rev 1394)
@@ -69,6 +69,15 @@
assertThat(true, is(success));
}
+ // DROP PROCEDURE some_procedure_name;
+ @Test
+ public void shouldParseDropProcedure() {
+ printTest("shouldParseDropProcedure()");
+ String content = "DROP PROCEDURE some_procedure_name";
+
+ boolean success = parser.parse(content, rootNode);
+ assertThat(true, is(success));
+ }
@Test
Modified: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/createTables.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/createTables.ddl 2009-12-03
22:14:00 UTC (rev 1393)
+++ trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/createTables.ddl 2009-12-03
22:16:50 UTC (rev 1394)
@@ -24,8 +24,8 @@
ENGINE_IND_CODE CHAR(3)
);
-SET DEFINE OFF;
-SET DEFINE ON;
+-- SET DEFINE OFF;
+-- SET DEFINE ON;
ALTER TABLE ACFT_TYPE
Modified: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/create_schema.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/create_schema.ddl 2009-12-03
22:14:00 UTC (rev 1393)
+++ trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/create_schema.ddl 2009-12-03
22:16:50 UTC (rev 1394)
@@ -1,4 +1,3 @@
CREATE SCHEMA hollywood
CREATE TABLE films (title varchar(255), release date, producerName varchar(255))
- CREATE VIEW winners AS
- SELECT title, release FROM films WHERE producerName IS NOT NULL;
\ No newline at end of file
+ CREATE VIEW winners AS SELECT title, release FROM films WHERE producerName IS NOT
NULL;
\ No newline at end of file
Added: trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/d_quoted_statements.ddl
===================================================================
--- trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/d_quoted_statements.ddl
(rev 0)
+++
trunk/extensions/dna-sequencer-ddl/src/test/resources/ddl/d_quoted_statements.ddl 2009-12-03
22:16:50 UTC (rev 1394)
@@ -0,0 +1,10 @@
+ALTER JAVA CLASS "Agent"
+ RESOLVER (("/home/java.101/bin/*" pm)(* public))
+ RESOLVE;
+
+CREATE SERVER foo FOREIGN DATA WRAPPER "default";
+
+CREATE RULE "_RETURN" AS
+ ON SELECT TO t1
+ DO INSTEAD
+ SELECT * FROM t2;
\ No newline at end of file