Skip to content

Commit

Permalink
Merge branch 'teiid-4468-64' of https://github.com/vhalbert/teiid int…
Browse files Browse the repository at this point in the history
…o 64-8.12.x
  • Loading branch information
shawkins committed Apr 6, 2017
2 parents 168c82a + 136477c commit 99d00e2
Show file tree
Hide file tree
Showing 9 changed files with 88 additions and 39 deletions.
Expand Up @@ -223,6 +223,9 @@ <h4 class="western">from ${project.version}</h4>
<ul>
<li/>
<p style="margin-bottom: 0in">
<a href='https://issues.jboss.org/browse/TEIID-4468'>TEIID-4468</a> - Google translator throws SpreadsheetOperationException for query DELETE FROM table
<li/>
<p style="margin-bottom: 0in">
<a href='https://issues.jboss.org/browse/TEIID-4595'>TEIID-4595</a> - Wrong pushdown of several spatial functions to Oracle
<li/>
<p style="margin-bottom: 0in">
Expand Down
Expand Up @@ -29,6 +29,7 @@
import org.teiid.language.Comparison;
import org.teiid.language.Comparison.Operator;
import org.teiid.language.Condition;
import org.teiid.language.Expression;
import org.teiid.language.Function;
import org.teiid.language.Like;
import org.teiid.language.Literal;
Expand All @@ -37,7 +38,7 @@
import org.teiid.resource.adapter.google.metadata.SpreadsheetInfo;

/**
* Base visitor for criteria in the UPDATE and DELETE commands
* Base visitor for criteria
*
* @author felias
*
Expand All @@ -55,6 +56,10 @@ public SpreadsheetCriteriaVisitor(SpreadsheetInfo info) {
}

public void visit(Literal obj) {
if (!isUpdate()) {
super.visit(obj);
return;
}
if (obj.getValue() == null) {
buffer.append(NULL);
return;
Expand All @@ -75,7 +80,18 @@ public void visit(Literal obj) {
}

public void visit(Like obj) {
throw new SpreadsheetOperationException("Like is not supported in DELETE and UPDATE queires");
if (isUpdate()) {
throw new SpreadsheetOperationException("Like is not supported in DELETE and UPDATE queires");
}
super.visit(obj);
}

@Override
public void visit(Function obj) {
if (isUpdate()) {
throw new SpreadsheetOperationException("Function is not supported in DELETE and UPDATE queires");
}
super.visit(obj);
}

@Override
Expand All @@ -94,7 +110,19 @@ public String getCriteriaQuery() {
public void setCriteriaQuery(String criteriaQuery) {
this.criteriaQuery = criteriaQuery;
}

public boolean isHeaderEnabled() {
return headerEnabled;
}

public void setHeaderEnabled(boolean headerEnabled) {
this.headerEnabled = headerEnabled;
}

public String getWorksheetTitle() {
return worksheetTitle;
}

public void translateWhere(Condition condition) {
if (condition != null) {
StringBuilder temp = this.buffer;
Expand All @@ -105,16 +133,22 @@ public void translateWhere(Condition condition) {
}
}

public boolean isHeaderEnabled() {
return headerEnabled;
}

public void setHeaderEnabled(boolean headerEnabled) {
this.headerEnabled = headerEnabled;
public void visit(Comparison obj) {
boolean addNot = false;
if (obj.getOperator() == Operator.NE
|| (obj.getOperator() == Operator.EQ && !(obj.getRightExpression() instanceof Literal))) {
addNot = true;
buffer.append("("); //$NON-NLS-1$
}
super.visit(obj);
if (addNot) {
buffer.append(" AND "); //$NON-NLS-1$
visitNode(obj.getLeftExpression());
buffer.append(" IS NOT NULL)"); //$NON-NLS-1$
}
}

public String getWorksheetTitle() {
return worksheetTitle;
protected boolean isUpdate() {
return true;
}

}
Expand Up @@ -44,12 +44,7 @@ public void visit(Delete obj) {
worksheetTitle = obj.getTable().getName();
}
worksheetKey = info.getWorksheetByName(worksheetTitle).getId();
if (obj.getWhere() != null) {
append(obj.getWhere());
criteriaQuery = buffer.toString();
} else {
criteriaQuery = ""; //$NON-NLS-1$
}
translateWhere(obj.getWhere());
}

}
Expand Up @@ -26,6 +26,7 @@

import org.teiid.language.Function;
import org.teiid.language.LanguageObject;
import org.teiid.language.Like;
import org.teiid.language.Literal;
import org.teiid.language.NamedTable;
import org.teiid.language.SQLConstants.Tokens;
Expand All @@ -43,15 +44,13 @@
* @author felias
*
*/
public class SpreadsheetSQLVisitor extends SQLStringVisitor {
public class SpreadsheetSQLVisitor extends SpreadsheetCriteriaVisitor {

private String worksheetTitle;
private Integer limitValue = null;
private Integer offsetValue = null;
private SpreadsheetInfo info;

public SpreadsheetSQLVisitor(SpreadsheetInfo spreadsheetInfo) {
this.info=spreadsheetInfo;
super(spreadsheetInfo);
}

public String getWorksheetTitle() {
Expand Down Expand Up @@ -155,4 +154,22 @@ public void visit(Literal obj) {
super.visit(obj);
}
}

@Override
public void visit(Like obj) {
if (obj.isNegated()) {
buffer.append("("); //$NON-NLS-1$
}
super.visit(obj);
if (obj.isNegated()) {
buffer.append(" AND "); //$NON-NLS-1$
visitNode(obj.getLeftExpression());
buffer.append(" IS NOT NULL)"); //$NON-NLS-1$
}
}

@Override
protected boolean isUpdate() {
return false;
}
}
Expand Up @@ -66,13 +66,7 @@ public void visit(Update obj) {
}
changes.add(new UpdateSet(columnName, getStringValue(s.getValue())));
}
if (obj.getWhere() != null) {
append(obj.getWhere());
criteriaQuery = buffer.toString();
} else {
criteriaQuery = ""; //$NON-NLS-1$
}

translateWhere(obj.getWhere());
}

protected String getStringValue(Expression obj) {
Expand Down
Expand Up @@ -134,10 +134,10 @@ public void testSelectFrom1() throws Exception {
testConversion("select A,B from PeopleList", "SELECT A, B");
testConversion("select C from PeopleList", "SELECT C");
testConversion("select * from PeopleList", "SELECT A, B, C");
testConversion("select A,B from PeopleList where A like '%car%'", "SELECT A, B WHERE A LIKE '%car%'");
testConversion("select A,B from PeopleList where A like '%car%' AND A NOT like '_car_'", "SELECT A, B WHERE A LIKE '%car%' AND (A NOT LIKE '_car_' AND A IS NOT NULL)");
testConversion("select A,B from PeopleList where A='car'", "SELECT A, B WHERE A = 'car'");
testConversion("select A,B from PeopleList where A >1 and B='bike'", "SELECT A, B WHERE A > '1' AND B = 'bike'");
testConversion("select A,B from PeopleList where A<1 or B <> 'bike'", "SELECT A, B WHERE A < '1' OR B <> 'bike'");
testConversion("select A,B from PeopleList where A<1 or B <> 'bike'", "SELECT A, B WHERE A < '1' OR (B <> 'bike' AND B IS NOT NULL)");
testConversion("select A,B from PeopleList limit 2", "SELECT A, B");
testConversion("select A,B from PeopleList offset 2 row", "SELECT A, B");
testConversion("select A,B from PeopleList limit 2,2", "SELECT A, B");
Expand All @@ -151,7 +151,7 @@ public void testSelectFrom1() throws Exception {
public void testUpdateCriteria() throws Exception {
testUpdateConversion("update PeopleList set A=1 where C>1","c > 1.0");
testUpdateConversion("update PeopleList set A=1 where C=10.5","c = 10.5");
testUpdateConversion("update PeopleList set A=1 where C <= 1000 and C !=5","c <= 1000.0 AND c <> 5.0");
testUpdateConversion("update PeopleList set A=1 where C <= 1000 and C !=5","c <= 1000.0 AND (c <> 5.0 AND c IS NOT NULL)");
testUpdateConversion("update PeopleList set A=1 where C >= 50 or C <=60.1","c >= 50.0 OR c <= 60.1");
testUpdateConversion("update PeopleList set A=1 where A = 'car'","a = \"car\"");
}
Expand All @@ -160,7 +160,7 @@ public void testUpdateCriteria() throws Exception {
public void testDeleteCriteria() throws Exception {
testDeleteConversion("delete from PeopleList where C > 1","c > 1.0");
testDeleteConversion("delete from PeopleList where C=10.5","c = 10.5");
testDeleteConversion("delete from PeopleList where C <= 1000 and C !=5","c <= 1000.0 AND c <> 5.0");
testDeleteConversion("delete from PeopleList where C <= 1000 and C !=5","c <= 1000.0 AND (c <> 5.0 AND c IS NOT NULL)");
testDeleteConversion("delete from PeopleList where C >= 50 or C <=60.1","c >= 50.0 OR c <= 60.1");
testDeleteConversion("delete from PeopleList where A = 'car'","a = \"car\"");
}
Expand Down Expand Up @@ -222,16 +222,15 @@ public void testInsertVisitorNull() throws Exception {

@Test
public void testUpdateVisitor() throws Exception {
//String sql="UPDATE PeopleList set A = 'String,String', C = 1.5";
String sql="UPDATE PeopleList set A = 'String,String', C = 1.5 where A='Str,Str'";
String sql="UPDATE PeopleList set A = 'String,String', C = 1.5";
SpreadsheetUpdateVisitor visitor=new SpreadsheetUpdateVisitor(people);
visitor.visit((Update)getCommand(sql));
assertEquals(2,visitor.getChanges().size());
assertEquals("A", visitor.getChanges().get(0).getColumnID());
assertEquals("'String,String", visitor.getChanges().get(0).getValue());
assertEquals("C", visitor.getChanges().get(1).getColumnID());
assertEquals("1.5", visitor.getChanges().get(1).getValue());
assertEquals("a = \"Str,Str\"", visitor.getCriteriaQuery());
assertNull(visitor.getCriteriaQuery());
}

@Test
Expand Down
Expand Up @@ -2263,12 +2263,19 @@ private Expression rewriteFunction(Function function) throws TeiidComponentExcep
} else if ((DataTypeManager.DefaultDataTypes.DATE.equalsIgnoreCase(type)
|| DataTypeManager.DefaultDataTypes.TIME.equalsIgnoreCase(type)) && function.getArg(1) instanceof Constant) {
String format = "yyyy-MM-dd"; //$NON-NLS-1$
int length = 10;
if (DataTypeManager.DefaultDataTypes.TIME.equalsIgnoreCase(type)) {
format = "hh:mm:ss"; //$NON-NLS-1$
length = 8;
}
Constant c = (Constant) function.getArg(1);
if (format.equals(c.getValue())) {
return rewriteExpressionDirect(ResolverUtil.getConversion(function.getArg(0), DataTypeManager.getDataTypeName(function.getArg(0).getType()), type, false, metadata.getFunctionLibrary()));
Expression arg = function.getArg(0);
if ((arg instanceof Function)
&& FunctionLibrary.isConvert((Function)arg)
&& java.util.Date.class.isAssignableFrom(((Function)arg).getArg(0).getType())) {
return rewriteExpressionDirect(ResolverUtil.getConversion(arg, DataTypeManager.DefaultDataTypes.STRING, type, false, metadata.getFunctionLibrary()));
}
}
}
} else if(StringUtil.startsWithIgnoreCase(functionName, "format")) { //$NON-NLS-1$
Expand Down
Expand Up @@ -496,7 +496,7 @@ public static Command helpTestRewriteCommand(String original, String expected, Q

@Test public void testRewriteParseDateCastString() {
helpTestRewriteCriteria("PARSEDATE(bqt1.smalla.stringkey, 'yyyy-MM-dd') = {d'2011-01-10'}", //$NON-NLS-1$
"convert(bqt1.smalla.stringkey, DATE) = {d'2011-01-10'}", RealMetadataFactory.exampleBQTCached() ); //$NON-NLS-1$
"convert(parsetimestamp(bqt1.smalla.stringkey, 'yyyy-MM-dd'), date) = {d'2011-01-10'}", RealMetadataFactory.exampleBQTCached() ); //$NON-NLS-1$
}

@Test public void testRewriteParseTimeCast() {
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Expand Up @@ -22,7 +22,7 @@
<!-- EAP and IP Bom specific and overrides -->
<version.org.jboss.integration-platform>6.0.0.CR30</version.org.jboss.integration-platform>
<!--version.org.jboss.as>7.5.0.Final-redhat-15</version.org.jboss.as-->
<version.org.jboss.as>7.5.5.Final-redhat-3</version.org.jboss.as>
<version.org.jboss.as>7.5.14.Final-redhat-2</version.org.jboss.as>
<version.com.google.guava>14.0.1</version.com.google.guava> <!-- bom 13.0.1 -->
<version.jaxen>1.1.4</version.jaxen> <!-- NOTE changing to use bom version of 1.1.3 will cause a build issue in teiid-engine -->
<!--version.commons-codec>1.9</version.commons-codec--> <!-- bom version of 1.4 -->
Expand Down

0 comments on commit 99d00e2

Please sign in to comment.