Skip to content

Commit

Permalink
support for create index
Browse files Browse the repository at this point in the history
  • Loading branch information
rotty3000 committed Apr 5, 2013
1 parent 83a1e95 commit dca7d9b
Show file tree
Hide file tree
Showing 6 changed files with 332 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
*/
package net.sf.jsqlparser.statement;

import net.sf.jsqlparser.statement.create.index.CreateIndex;
import net.sf.jsqlparser.statement.create.table.CreateTable;
import net.sf.jsqlparser.statement.create.view.CreateView;
import net.sf.jsqlparser.statement.delete.Delete;
Expand All @@ -47,6 +48,8 @@ public interface StatementVisitor {

public void visit(Truncate truncate);

public void visit(CreateIndex createIndex);

public void visit(CreateTable createTable);

public void visit(CreateView createView);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
/*
* #%L
* JSQLParser library
* %%
* Copyright (C) 2004 - 2013 JSQLParser
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 2.1 of the
* License, or (at your option) any later version.
*
* This program 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 General Lesser Public License for more details.
*
* You should have received a copy of the GNU General Lesser Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/lgpl-2.1.html>.
* #L%
*/
package net.sf.jsqlparser.statement.create.index;

import java.util.Iterator;

import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.StatementVisitor;
import net.sf.jsqlparser.statement.create.table.Index;

/**
* A "CREATE INDEX" statement
*
* @author Raymond Augé
*/
public class CreateIndex implements Statement {

private Table table;
private Index index;

public void accept(StatementVisitor statementVisitor) {
statementVisitor.visit(this);
}

/**
* The index to be created
*/
public Index getIndex() {
return index;
}

public void setIndex(Index index) {
this.index = index;
}

/**
* The table on which the index is to be created
*/
public Table getTable() {
return table;
}

public void setTable(Table table) {
this.table = table;
}

public String toString() {
StringBuffer buffer = new StringBuffer();

buffer.append("CREATE ");

if (index.getType() != null) {
buffer.append(index.getType());
buffer.append(" ");
}

buffer.append("INDEX ");
buffer.append(index.getName());
buffer.append(" ON ");
buffer.append(table.getWholeTableName());

if (index.getColumnsNames() != null) {
buffer.append(" (");

for (Iterator iter = index.getColumnsNames().iterator(); iter.hasNext() ;) {
String columnName = (String)iter.next();

buffer.append(columnName);

if (iter.hasNext()) {
buffer.append(", ");
}
}

buffer.append(")");
}

return buffer.toString();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/*
* #%L
* JSQLParser library
* %%
* Copyright (C) 2004 - 2013 JSQLParser
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 2.1 of the
* License, or (at your option) any later version.
*
* This program 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 General Lesser Public License for more details.
*
* You should have received a copy of the GNU General Lesser Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/lgpl-2.1.html>.
* #L%
*/
package net.sf.jsqlparser.util.deparser;

import java.util.Iterator;

import net.sf.jsqlparser.statement.create.index.CreateIndex;
import net.sf.jsqlparser.statement.create.table.Index;

/**
* A class to de-parse (that is, tranform from JSqlParser hierarchy into a string)
* a {@link net.sf.jsqlparser.statement.create.index.CreateIndex}
*
* @author Raymond Augé
*/
public class CreateIndexDeParser {
protected StringBuilder buffer;

/**
* @param buffer the buffer that will be filled with the create
*/
public CreateIndexDeParser(StringBuilder buffer) {
this.buffer = buffer;
}

public void deParse(CreateIndex createIndex) {
Index index = createIndex.getIndex();

buffer.append("CREATE ");

if (index.getType() != null) {
buffer.append(index.getType());
buffer.append(" ");
}

buffer.append("INDEX ");
buffer.append(index.getName());
buffer.append(" ON ");
buffer.append(createIndex.getTable().getWholeTableName());

if (index.getColumnsNames() != null) {
buffer.append(" (");
for (Iterator iter = index.getColumnsNames().iterator(); iter.hasNext();) {
String columnName = (String)iter.next();
buffer.append(columnName);

if (iter.hasNext()) {
buffer.append(", ");
}
}
buffer.append(")");
}
}

public StringBuilder getBuffer() {
return buffer;
}

public void setBuffer(StringBuilder buffer) {
this.buffer = buffer;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import java.util.Iterator;

import net.sf.jsqlparser.statement.StatementVisitor;
import net.sf.jsqlparser.statement.create.index.CreateIndex;
import net.sf.jsqlparser.statement.create.table.CreateTable;
import net.sf.jsqlparser.statement.create.view.CreateView;
import net.sf.jsqlparser.statement.delete.Delete;
Expand All @@ -43,6 +44,12 @@ public StatementDeParser(StringBuilder buffer) {
this.buffer = buffer;
}

@Override
public void visit(CreateIndex createIndex) {
CreateIndexDeParser createIndexDeParser = new CreateIndexDeParser(buffer);
createIndexDeParser.deParse(createIndex);
}

@Override
public void visit(CreateTable createTable) {
CreateTableDeParser createTableDeParser = new CreateTableDeParser(buffer);
Expand Down
60 changes: 60 additions & 0 deletions src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.create.index.CreateIndex;
import net.sf.jsqlparser.statement.create.table.ColDataType;
import net.sf.jsqlparser.statement.create.table.ColumnDefinition;
import net.sf.jsqlparser.statement.create.table.CreateTable;
Expand Down Expand Up @@ -292,6 +293,9 @@ Statement Statement() :
stm = Delete()
|
stm = Replace()
|
LOOKAHEAD(3)
stm = CreateIndex()
|
LOOKAHEAD(2)
stm = CreateTable()
Expand Down Expand Up @@ -1681,6 +1685,62 @@ SubSelect SubSelect():
}
}

CreateIndex CreateIndex():
{
CreateIndex createIndex = new CreateIndex();
Table table = null;
List colNames = new ArrayList();
Token columnName;
Index index = null;
String name = null;
String parameter = null;
}
{
<K_CREATE>
( parameter=CreateParameter() )*

<K_INDEX> name=RelObjectName()
{
index = new Index();
index.setName(name);
index.setType(parameter);
}

<K_ON> table=Table()

"("
(columnName=<S_IDENTIFIER>
|
columnName=<S_QUOTED_IDENTIFIER>)

(CreateParameter() | <K_ASC> | <K_DESC>)*
{
colNames.add(columnName.image);
}

(
","
(columnName=<S_IDENTIFIER>
|
columnName=<S_QUOTED_IDENTIFIER>)

(CreateParameter() | <K_ASC> | <K_DESC>)*
{
colNames.add(columnName.image);
}
)*

")"
(CreateParameter() {})*

{
index.setColumnsNames(colNames);
createIndex.setIndex(index);
createIndex.setTable(table);
return createIndex;
}
}

CreateTable CreateTable():
{
CreateTable createTable = new CreateTable();
Expand Down
79 changes: 79 additions & 0 deletions src/test/java/net/sf/jsqlparser/test/create/CreateIndexTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package net.sf.jsqlparser.test.create;

import java.io.StringReader;

import junit.framework.TestCase;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserManager;
import net.sf.jsqlparser.statement.create.index.CreateIndex;


/**
* @author Raymond Augé
*/
public class CreateIndexTest extends TestCase {

CCJSqlParserManager parserManager = new CCJSqlParserManager();

public CreateIndexTest(String arg0) {
super(arg0);
}

public void testCreateIndex() throws JSQLParserException {
String statement =
"CREATE INDEX myindex ON mytab (mycol, mycol2)";
CreateIndex createIndex = (CreateIndex) parserManager.parse(new StringReader(statement));
assertEquals(2, createIndex.getIndex().getColumnsNames().size());
assertEquals("myindex", createIndex.getIndex().getName());
assertNull(createIndex.getIndex().getType());
assertEquals("mytab", createIndex.getTable().getWholeTableName());
assertEquals("mycol", createIndex.getIndex().getColumnsNames().get(0));
assertEquals(statement, ""+createIndex);
}

public void testCreateIndex2() throws JSQLParserException {
String statement =
"CREATE mytype INDEX myindex ON mytab (mycol, mycol2)";
CreateIndex createIndex = (CreateIndex) parserManager.parse(new StringReader(statement));
assertEquals(2, createIndex.getIndex().getColumnsNames().size());
assertEquals("myindex", createIndex.getIndex().getName());
assertEquals("mytype", createIndex.getIndex().getType());
assertEquals("mytab", createIndex.getTable().getWholeTableName());
assertEquals("mycol2", createIndex.getIndex().getColumnsNames().get(1));
assertEquals(statement, ""+createIndex);
}

public void testCreateIndex3() throws JSQLParserException {
String statement =
"CREATE mytype INDEX myindex ON mytab (mycol ASC, mycol2, mycol3)";
CreateIndex createIndex = (CreateIndex) parserManager.parse(new StringReader(statement));
assertEquals(3, createIndex.getIndex().getColumnsNames().size());
assertEquals("myindex", createIndex.getIndex().getName());
assertEquals("mytype", createIndex.getIndex().getType());
assertEquals("mytab", createIndex.getTable().getWholeTableName());
assertEquals("mycol3", createIndex.getIndex().getColumnsNames().get(2));
}

public void testCreateIndex4() throws JSQLParserException {
String statement =
"CREATE mytype INDEX myindex ON mytab (mycol ASC, mycol2 (75), mycol3)";
CreateIndex createIndex = (CreateIndex) parserManager.parse(new StringReader(statement));
assertEquals(3, createIndex.getIndex().getColumnsNames().size());
assertEquals("myindex", createIndex.getIndex().getName());
assertEquals("mytype", createIndex.getIndex().getType());
assertEquals("mytab", createIndex.getTable().getWholeTableName());
assertEquals("mycol3", createIndex.getIndex().getColumnsNames().get(2));
}

public void testCreateIndex5() throws JSQLParserException {
String statement =
"CREATE mytype INDEX myindex ON mytab (mycol ASC, mycol2 (75), mycol3) mymodifiers";
CreateIndex createIndex = (CreateIndex) parserManager.parse(new StringReader(statement));
assertEquals(3, createIndex.getIndex().getColumnsNames().size());
assertEquals("myindex", createIndex.getIndex().getName());
assertEquals("mytype", createIndex.getIndex().getType());
assertEquals("mytab", createIndex.getTable().getWholeTableName());
assertEquals("mycol3", createIndex.getIndex().getColumnsNames().get(2));
}

}

0 comments on commit dca7d9b

Please sign in to comment.