/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.query.sql.v84; import java.util.Arrays; import org.junit.Test; import org.teiid.designer.runtime.version.spi.ITeiidServerVersion; import org.teiid.designer.runtime.version.spi.TeiidServerVersion.Version; import org.teiid.query.sql.lang.CompareCriteria; import org.teiid.query.sql.lang.Criteria; import org.teiid.query.sql.lang.CriteriaOperator; import org.teiid.query.sql.lang.CriteriaOperator.Operator; import org.teiid.query.sql.lang.From; import org.teiid.query.sql.lang.Query; import org.teiid.query.sql.lang.Select; import org.teiid.query.sql.proc.Block; import org.teiid.query.sql.proc.BranchingStatement.BranchingMode; import org.teiid.query.sql.proc.CommandStatement; import org.teiid.query.sql.proc.CreateProcedureCommand; import org.teiid.query.sql.proc.IfStatement; import org.teiid.query.sql.proc.LoopStatement; import org.teiid.query.sql.proc.Statement; import org.teiid.query.sql.symbol.ElementSymbol; import org.teiid.query.sql.symbol.Expression; import org.teiid.query.sql.symbol.GroupSymbol; import org.teiid.query.sql.v8.TestQuery8Parser; /** * */ @SuppressWarnings( {"nls", "javadoc"} ) public class TestQuery84Parser extends TestQuery8Parser { protected TestQuery84Parser(Version teiidVersion) { super(teiidVersion); } public TestQuery84Parser() { this(Version.TEIID_8_4); } /** * Drops the CREATE VIRTUAL PROCEDURE prefix */ @Override @Test public void testVirtualProcedure() { ElementSymbol x = getFactory().newElementSymbol("x"); String intType = new String("integer"); Statement dStmt = getFactory().newDeclareStatement(x, intType); GroupSymbol g = getFactory().newGroupSymbol("m.g"); From from = getFactory().newFrom(); from.addGroup(g); Select select = getFactory().newSelect(); ElementSymbol c1 = getFactory().newElementSymbol("c1"); select.addSymbol(c1); select.addSymbol(getFactory().newElementSymbol("c2")); Query query = getFactory().newQuery(select, from); x = getFactory().newElementSymbol("x"); c1 = getFactory().newElementSymbol("mycursor.c1"); Statement assignmentStmt = getFactory().newAssignmentStatement(x, c1); Block block = getFactory().newBlock(); block.addStatement(assignmentStmt); Block ifBlock = getFactory().newBlock(); Statement continueStmt = getFactory().newBranchingStatement(BranchingMode.CONTINUE); ifBlock.addStatement(continueStmt); Criteria crit = getFactory().newCompareCriteria(x, Operator.GT, getFactory().newConstant(new Integer(5))); IfStatement ifStmt = getFactory().newIfStatement(crit, ifBlock); block.addStatement(ifStmt); String cursor = "mycursor"; LoopStatement loopStmt = getFactory().newLoopStatement(block, query, cursor); block = getFactory().newBlock(); block.addStatement(dStmt); block.addStatement(loopStmt); CommandStatement cmdStmt = getFactory().newCommandStatement(query); block.addStatement(cmdStmt); CreateProcedureCommand virtualProcedureCommand = getFactory().newCreateProcedureCommand(); virtualProcedureCommand.setBlock(block); helpTest("BEGIN DECLARE integer x; LOOP ON (SELECT c1, c2 FROM m.g) AS mycursor BEGIN x=mycursor.c1; IF(x > 5) BEGIN CONTINUE; END END SELECT c1, c2 FROM m.g; END", "BEGIN\nDECLARE integer x;\n" + "LOOP ON (SELECT c1, c2 FROM m.g) AS mycursor\nBEGIN\n" + "x = mycursor.c1;\nIF(x > 5)\nBEGIN\nCONTINUE;\nEND\nEND\n" + "SELECT c1, c2 FROM m.g;\nEND", virtualProcedureCommand); } @Override @Test public void testIfElseWithoutBeginEnd() { String sql = "BEGIN IF (x > 1) select 1; IF (x > 1) select 1; ELSE select 1; END"; //$NON-NLS-1$ String expected = "BEGIN\nIF(x > 1)\nBEGIN\nSELECT 1;\nEND\nIF(x > 1)\nBEGIN\nSELECT 1;\nEND\nELSE\nBEGIN\nSELECT 1;\nEND\nEND"; //$NON-NLS-1$ Query query = getFactory().newQuery(); Expression expr = getFactory().wrapExpression(getFactory().newConstant(1)); query.setSelect(getFactory().newSelect(Arrays.asList(expr))); //$NON-NLS-1$ CommandStatement commandStmt = getFactory().newCommandStatement(query); CompareCriteria criteria = getFactory().newCompareCriteria(getFactory().newElementSymbol("x"), CriteriaOperator.Operator.GT, getFactory().newConstant(1)); //$NON-NLS-1$ Block block = getFactory().newBlock(); block.addStatement(commandStmt); IfStatement ifStmt = getFactory().newIfStatement(criteria, block); IfStatement ifStmt1 = ifStmt.clone(); Block block2 = getFactory().newBlock(); block2.addStatement(commandStmt); ifStmt1.setElseBlock(block2); Block block3 = getFactory().newBlock(); block3.addStatement(ifStmt); block3.addStatement(ifStmt1); CreateProcedureCommand command = getFactory().newCreateProcedureCommand(); command.setBlock(block3); helpTest(sql, expected, command); } @Override @Test public void testIfElseWithoutBeginAndWithoutCreateVirtualProcedurePrefix() { String sql = "BEGIN IF (x > 1) select 1; IF (x > 1) select 1; ELSE select 1; END"; //$NON-NLS-1$ String expected = "BEGIN\nIF(x > 1)\nBEGIN\nSELECT 1;\nEND\nIF(x > 1)\nBEGIN\nSELECT 1;\nEND\nELSE\nBEGIN\nSELECT 1;\nEND\nEND"; //$NON-NLS-1$ Query query = getFactory().newQuery(); Expression expr = getFactory().wrapExpression(getFactory().newConstant(1)); query.setSelect(getFactory().newSelect(Arrays.asList(expr))); //$NON-NLS-1$ CommandStatement commandStmt = getFactory().newCommandStatement(query); CompareCriteria criteria = getFactory().newCompareCriteria(getFactory().newElementSymbol("x"), CriteriaOperator.Operator.GT, getFactory().newConstant(1)); //$NON-NLS-1$ Block block = getFactory().newBlock(); block.addStatement(commandStmt); IfStatement ifStmt = getFactory().newIfStatement(criteria, block); IfStatement ifStmt1 = ifStmt.clone(); Block block2 = getFactory().newBlock(); block2.addStatement(commandStmt); ifStmt1.setElseBlock(block2); Block block3 = getFactory().newBlock(); block3.addStatement(ifStmt); block3.addStatement(ifStmt1); CreateProcedureCommand command = getFactory().newCreateProcedureCommand(); command.setBlock(block3); helpTest(sql, expected, command); } }