/*
* JBoss, Home of Professional Open Source.
* 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.
*
* This library 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 library 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 library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.translator.simpledb;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.teiid.language.*;
import org.teiid.language.visitor.HierarchyVisitor;
import org.teiid.metadata.Column;
import org.teiid.translator.TranslatorException;
import org.teiid.translator.simpledb.api.SimpleDBDataTypeManager;
public class SimpleDBInsertVisitor extends HierarchyVisitor {
private Iterator<? extends List<?>> values;
private List<Object> expressionValues = new ArrayList<Object>();
private List<Column> columns = new ArrayList<Column>();
private ArrayList<TranslatorException> exceptions = new ArrayList<TranslatorException>();
private String tableName;
public void checkExceptions() throws TranslatorException {
if (!this.exceptions.isEmpty()) {
throw this.exceptions.get(0);
}
}
public List<Column> getColumns() {
return this.columns;
}
public Iterator<? extends List<?>> values() {
if (this.values != null) {
return this.values;
}
List<List<?>> result = new ArrayList<List<?>>(1);
result.add(this.expressionValues);
return result.iterator();
}
public String getDomainName(){
return this.tableName;
}
@Override
public void visit(Insert obj) {
visitNode(obj.getTable());
visitNodes(obj.getColumns());
if (!(obj.getValueSource() instanceof QueryExpression) && obj.getParameterValues() == null) {
visitNode(obj.getValueSource());
}
else {
// bulk insert values
this.values = obj.getParameterValues();
}
}
@Override
public void visit(NamedTable obj) {
this.tableName = SimpleDBMetadataProcessor.getName(obj.getMetadataObject());
}
@Override
public void visit(ColumnReference obj) {
this.columns.add(obj.getMetadataObject());
super.visit(obj);
}
@Override
public void visit(ExpressionValueSource obj) {
try {
List<Expression> values = obj.getValues();
for (int i = 0; i < obj.getValues().size(); i++){
if (values.get(i) instanceof Literal){
Literal lit = (Literal) values.get(i);
this.expressionValues.add(lit.getValue());
}
else if (values.get(i) instanceof Array){
Array array = (Array)values.get(i);
String[] result = getValuesArray(array);
this.expressionValues.add(result);
}
else {
this.exceptions.add(new TranslatorException(SimpleDBPlugin.Event.TEIID24001, SimpleDBPlugin.Util.gs(SimpleDBPlugin.Event.TEIID24001)));
}
}
super.visit(obj);
} catch (TranslatorException e) {
this.exceptions.add(e);
}
}
static String[] getValuesArray(Array array) throws TranslatorException {
String[] result = new String[array.getExpressions().size()];
for (int j = 0; j < array.getExpressions().size(); j++) {
Expression expr = array.getExpressions().get(j);
if (expr instanceof Literal){
Literal lit = (Literal) expr;
result[j] = (String)SimpleDBDataTypeManager.convertToSimpleDBType(lit.getValue(), lit.getType());
}
else {
new TranslatorException(SimpleDBPlugin.Event.TEIID24001, SimpleDBPlugin.Util.gs(SimpleDBPlugin.Event.TEIID24001));
}
}
return result;
}
}