/* * Chrysalix * 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. * * Chrysalix is free software. Unless otherwise indicated, all code in Chrysalix * 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. * * Chrysalix 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.modelspace.ddl.relational; import java.util.ArrayList; import java.util.List; /** * DDL constants specific to the Teiid dialect. Teiid's <a * href="https://docs.jboss.org/author/display/TEIID/BNF+for+SQL+Grammar">BNF for SQL Grammar (updated Feb 14, 2013)</a> was used. */ public interface TeiidDdlConstants extends DdlConstants { /** * An object that has a DDL representation. */ interface DdlElement { /** * @return the DDL string representation (never <code>null</code> or empty) */ String toDdl(); } /** * <code> * ( <create table> | <create procedure> | <option namespace> | <alter options> | <create trigger> ) ( <semicolon> )? * </code> */ enum DdlStatement implements DdlElement { /** * Create Table * <p> * <code> * CREATE ( FOREIGN TABLE | ( VIRTUAL )? VIEW ) <identifier> <create table body> ( AS <query expression> )? * </code> */ CREATE_FOREIGN_TABLE( CREATE, FOREIGN, TABLE ), CREATE_VIRTUAL_VIEW( CREATE, TeiidReservedWord.VIRTUAL.name(), VIEW ), CREATE_VIEW( CREATE, VIEW ), /** * Create Procedure * <p> * <code> * CREATE ( VIRTUAL | FOREIGN )? ( PROCEDURE | FUNCTION ) ( <identifier> <lparen> ( <procedure parameter> ( <comma> <procedure parameter> )* )? <rparen> ( RETURNS ( ( ( TABLE )? <lparen> <procedure result column> ( <comma> <procedure result column> )* <rparen> ) | <data type> ) )? ( <options clause> )? ( AS <statement> )? ) * </code> */ CREATE_VIRTUAL_FUNCTION( CREATE, TeiidReservedWord.VIRTUAL.name(), TeiidReservedWord.FUNCTION.name() ), CREATE_VIRTUAL_PROCEDURE( CREATE, TeiidReservedWord.VIRTUAL.name(), TeiidReservedWord.PROCEDURE.name() ), CREATE_FOREIGN_FUNCTION( CREATE, FOREIGN, TeiidReservedWord.FUNCTION.name() ), CREATE_FOREIGN_PROCEDURE( CREATE, FOREIGN, TeiidReservedWord.PROCEDURE.name() ), CREATE_FUNCTION( CREATE, TeiidReservedWord.FUNCTION.name() ), CREATE_PROCEDURE( CREATE, TeiidReservedWord.PROCEDURE.name() ), /** * Option Namespace * <p> * <code> * SET NAMESPACE <string> AS <identifier> * </code> */ OPTION_NAMESPACE( SET, TeiidNonReservedWord.NAMESPACE.name() ), /** * Alter Options * <p> * <code> * ALTER ( VIRTUAL | FOREIGN )? ( TABLE | VIEW | PROCEDURE ) <identifier> ( <alter options list> | <alter column options> ) * </code> */ ALTER_VIRTUAL_PROCEDURE( ALTER, TeiidReservedWord.VIRTUAL.name(), TeiidReservedWord.PROCEDURE.name() ), ALTER_VIRTUAL_TABLE( ALTER, TeiidReservedWord.VIRTUAL.name(), TABLE ), ALTER_VIRTUAL_VIEW( ALTER, TeiidReservedWord.VIRTUAL.name(), VIEW ), ALTER_FOREIGN_PROCEDURE( ALTER, FOREIGN, TeiidReservedWord.PROCEDURE.name() ), ALTER_FOREIGN_TABLE( ALTER, FOREIGN, TABLE ), ALTER_FOREIGN_VIEW( ALTER, FOREIGN, VIEW ), ALTER_PROCEDURE( ALTER, TeiidReservedWord.PROCEDURE.name() ), ALTER_TABLE( ALTER, TABLE ), ALTER_VIEW( ALTER, VIEW ), /** * Create Trigger * <p> * <code> * CREATE TRIGGER ON <identifier> INSTEAD OF ( INSERT | UPDATE | DELETE ) AS <for each row trigger action> * </code> */ CREATE_TRIGGER( CREATE, TeiidReservedWord.TRIGGER.name(), ON ); private final String[] tokens; private DdlStatement( final String... tokens ) { this.tokens = tokens; } @Override public String toDdl() { boolean firstTime = true; final StringBuilder ddl = new StringBuilder(); for ( final String token : this.tokens ) { if ( firstTime ) { firstTime = false; } else { ddl.append( ' ' ); } ddl.append( token ); } return ddl.toString(); } /** * @return the tokens used by the DDL tokenizer (never <code>null</code> or empty) */ public String[] tokens() { return this.tokens; } } /** * Indicates if element is foreign/physical or virtual. */ enum SchemaElementType implements DdlElement { FOREIGN, VIRTUAL; @Override public String toDdl() { return toString(); } } /** * Teiid data types. */ enum TeiidDataType implements DdlElement { BIGDECIMAL, BIGINT, BIGINTEGER, BLOB, BOOLEAN, BYTE, CHAR, CLOB, DATE, DECIMAL, DOUBLE, FLOAT, INTEGER, LONG, OBJECT, REAL, SHORT, SMALLINT, STRING, TIME, TIMESTAMP, TINYINT, VARBINARY, VARCHAR, XML; private static List< String > _startWords; public static List< String > getStartWords() { if ( _startWords == null ) { final TeiidDataType[] values = values(); _startWords = new ArrayList< String >( values.length ); for ( final TeiidDataType type : values ) { _startWords.add( type.toDdl() ); } } return _startWords; } @Override public String toDdl() { return toString(); } } /** * Teiid future reserved words. */ enum TeiidFutureReserveWord { ALLOCATE, ARE, ARRAY, ASENSITIVE, ASYMETRIC, AUTHORIZATION, BINARY, CALLED, CASCADED, CHARACTER, CHECK, CLOSE, COLLATE, COMMIT, CONNECT, CORRESPONDING, CRITERIA, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CURSOR, CYCLE, DATALINK, DEALLOCATE, DEC, DEREF, DESCRIBE, DETERMINISTIC, DISCONNECT, DLNEWCOPY, DLPREVIOUSCOPY, DLURLCOMPLETE, DLURLCOMPLETEONLY, DLURLCOMPLETEWRITE, DLURLPATH, DLURLPATHONLY, DLURLPATHWRITE, DLURLSCHEME, DLURLSERVER, DLVALUE, DYNAMIC, ELEMENT, EXTERNAL, FREE, GET, GLOBAL, GRANT, HAS, HOLD, IDENTITY, IMPORT, INDICATOR, INPUT, INSENSITIVE, INT, INTERVAL, ISOLATION, LARGE, LOCALTIME, LOCALTIMESTAMP, MATCH, MEMBER, METHOD, MODIFIES, MODULE, MULTISET, NATIONAL, NATURAL, NCHAR, NCLOB, NEW, NONE, NUMERIC, OLD, OPEN, OUTPUT, OVERLAPS, PRECISION, PREPARE, RANGE, READS, RECURSIVE, REFERENCING, RELEASE, REVOKE, ROLLBACK, ROLLUP, SAVEPOINT, SCROLL, SEARCH, SENSITIVE, SESSION_USER, SPECIFIC, SPECIFICTYPE, SQL, START, STATIC, SUBMULTILIST, SYMETRIC, SYSTEM, SYSTEM_USER, TIMEZONE_HOUR, TIMEZONE_MINUTE, TRANSLATION, TREAT, VALUE, VARYING, WHENEVER, WINDOW, WITHIN, XMLBINARY, XMLCAST, XMLDOCUMENT, XMLEXISTS, XMLITERATE, XMLTEXT, XMLVALIDATE } /** * Teiid non-reserved words. */ enum TeiidNonReservedWord implements DdlElement { ACCESSPATTERN, ARRAYTABLE, AUTO_INCREMENT, AVG, CHAIN, COLUMNS, CONTENT, COUNT, DELIMITER, DENSE_RANK, DISABLED, DOCUMENT, EMPTY, ENABLED, ENCODING, EVERY, EXCEPTION, EXCLUDING, EXTRACT, FIRST, HEADER, INCLUDING, INDEX, INSTEAD, JSONARRAY_AGG, JSONOBJECT, KEY, LAST, MAX, MIN, NAME, NAMESPACE, NEXT, NULLS, OBJECTTABLE, ORDINALITY, PASSING, PATH, QUERYSTRING, QUOTE, RAISE, RANK, RESULT, ROW_NUMBER, SELECTOR, SERIAL, SKIP, SQL_TSI_DAY, SQL_TSI_FRAC_SECOND, SQL_TSI_HOUR, SQL_TSI_MINUTE, SQL_TSI_MONTH, SQL_TSI_QUARTER, SQL_TSI_SECOND, SQL_TSI_WEEK, SQL_TSI_YEAR, STDDEV_POP, STDDEV_SAMP, SUBSTRING, SUM, TEXTAGG, TEXTTABLE, TIMESTAMPADD, TIMESTAMPDIFF, TO_BYTES, TO_CHARS, TRIM, VAR_POP, VAR_SAMP, VARIADIC, VERSION, VIEW, WELLFORMED, WIDTH, XMLDECLARATION; private static List< String > _list; public static List< String > asList() { if ( _list == null ) { final TeiidNonReservedWord[] values = values(); _list = new ArrayList< String >( values.length ); for ( final TeiidNonReservedWord word : values ) { _list.add( word.name() ); } } return _list; } @Override public String toDdl() { return toString(); } } /** * Teiid reserved words. */ enum TeiidReservedWord implements DdlElement { ADD, ALL, ALLOCATE, ALTER, AND, ANY, ARRAY_AGG, AS, ASC, ATOMIC, BEGIN, BETWEEN, BOTH, BREAK, BY, CALL, CASE, COLUMN, CONSTRAINT, CONTINUE, CREATE, CROSS, DAY, DECLARE, DEFAULT, DELETE, DESC, DISTINCT, DROP, EACH, ELSE, END, ERROR, ESCAPE, EXCEPT, EXEC, EXECUTE, EXISTS, FALSE, FETCH, FILTER, FOR, FOREIGN, FROM, FULL, FUNCTION, GROUP, HAVING, HOUR, IF, IMMEDIATE, IN, INNER, INOUT, INSERT, INTERSECT, INTO, IS, JOIN, LANGUAGE, LATERAL, LEADING, LEAVE, LEFT, LIKE, LIKE_REGEX, LIMIT, LOCAL, LOOP, MAKEDEP, MAKENOTDEP, MERGE, MINUTE, MONTH, NO, NOCACHE, NOT, NULL, OF, OFFSET, ON, ONLY, OPTION, OPTIONS, OR, ORDER, OUT, OUTER, OVER, PARAMETER, PARTITION, PREPARE, PRIMARY, PROCEDURE, REFERENCES, RETURN, RETURNS, RIGHT, ROLLUP, ROW, ROWS, SECOND, SELECT, SET, SIMILAR, SOME, SQLEXCEPTION, SQLSTATE, SQLWARNING, TABLE, TEMPORARY, THEN, TO, TRAILING, TRANSLATE, TRIGGER, TRUE, UNION, UNIQUE, UNKNOWN, UPDATE, USER, USING, VALUES, VIRTUAL, WHEN, WHERE, WHILE, WITH, WITHOUT, XMLAGG, XMLATTRIBUTES, XMLCOMMENT, XMLCONCAT, XMLELEMENT, XMLFOREST, XMLNAMESPACES, XMLPARSE, XMLPI, XMLQUERY, XMLSERIALIZE, XMLTABLE, YEAR; private static List< String > _list; public static List< String > asList() { if ( _list == null ) { final TeiidReservedWord[] values = values(); _list = new ArrayList< String >( values.length ); for ( final TeiidReservedWord word : values ) { _list.add( word.name() ); } } return _list; } @Override public String toDdl() { return toString(); } } }