Skip to content

Commit

Permalink
TEIID-3908 TEIID-3910 expanding the logic to other scenarios
Browse files Browse the repository at this point in the history
  • Loading branch information
shawkins committed Jan 19, 2016
1 parent 6771b87 commit b898dbf
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 68 deletions.
Expand Up @@ -38,7 +38,6 @@
import org.apache.olingo.commons.core.edm.primitivetype.EdmStream;
import org.apache.olingo.commons.core.edm.primitivetype.EdmString;
import org.apache.olingo.commons.core.edm.primitivetype.EdmTimeOfDay;
import org.teiid.core.TeiidException;
import org.teiid.core.types.DataTypeManager;
import org.teiid.core.types.Transform;
import org.teiid.core.types.TransformationException;
Expand Down Expand Up @@ -156,7 +155,7 @@ public static Object convertTeiidRuntimeType(Object value, String odataType,
} else {

if (value instanceof String) {
return parseLiteral(odataType, (String)value);
value = parseLiteral(odataType, (String)value);
}

Transform transform = DataTypeManager.getTransform(value.getClass(), expectedType);
Expand Down Expand Up @@ -193,6 +192,7 @@ public static Object parseLiteral(String odataType, String value)
try {
if (value.startsWith("'") && value.endsWith("'")) {
value = value.substring(1, value.length()-1);
value = value.replaceAll("''", "'");
}
Object converted = primitiveType.valueOfString(value,
false,
Expand Down
22 changes: 16 additions & 6 deletions olingo/src/main/java/org/teiid/olingo/ODataTypeManager.java
Expand Up @@ -191,9 +191,14 @@ public static Object parseLiteral(EdmProperty edmProperty, Class<?> runtimeType,
.getFullQualifiedNameAsString().substring(4)));

try {
if (value.startsWith("'") && value.endsWith("'")) {
value = value.substring(1, value.length()-1);
}
if (edmProperty.getType() == EdmString.getInstance()) {
if (value.startsWith("'") && value.endsWith("'")) {
value = value.substring(1, value.length()-1);
value = value.replaceAll("''", "'");
} else {
throw new EdmPrimitiveTypeException(ODataPlugin.Util.gs(ODataPlugin.Event.TEIID16045, edmProperty.getType()));
}
}
Object converted = primitiveType.valueOfString(value,
edmProperty.isNullable(),
edmProperty.getMaxLength(),
Expand Down Expand Up @@ -227,9 +232,14 @@ public static Object parseLiteral(String odataType, String value)
Class<?> expectedClass = primitiveType.getDefaultType();

try {
if (value.startsWith("'") && value.endsWith("'")) {
value = value.substring(1, value.length()-1);
}
if (primitiveType == EdmString.getInstance()) {
if (value.startsWith("'") && value.endsWith("'")) {
value = value.substring(1, value.length()-1);
value = value.replaceAll("''", "'");
} else {
throw new EdmPrimitiveTypeException(ODataPlugin.Util.gs(ODataPlugin.Event.TEIID16045, primitiveType));
}
}
Object converted = primitiveType.valueOfString(value,
false,
maxLength,
Expand Down
Expand Up @@ -21,8 +21,7 @@
*/
package org.teiid.olingo.service;

import static org.teiid.language.SQLConstants.Reserved.CAST;
import static org.teiid.language.SQLConstants.Reserved.CONVERT;
import static org.teiid.language.SQLConstants.Reserved.*;

import java.util.ArrayList;
import java.util.Arrays;
Expand All @@ -32,29 +31,11 @@
import org.apache.olingo.commons.api.edm.EdmEntityType;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.core.edm.primitivetype.SingletonPrimitiveType;
import org.apache.olingo.server.api.uri.UriInfo;
import org.apache.olingo.server.api.uri.UriInfoResource;
import org.apache.olingo.server.api.uri.UriResourceCount;
import org.apache.olingo.server.api.uri.UriResourceEntitySet;
import org.apache.olingo.server.api.uri.UriResourceIt;
import org.apache.olingo.server.api.uri.UriResourceLambdaAll;
import org.apache.olingo.server.api.uri.UriResourceLambdaAny;
import org.apache.olingo.server.api.uri.UriResourceLambdaVariable;
import org.apache.olingo.server.api.uri.UriResourceNavigation;
import org.apache.olingo.server.api.uri.UriResourcePrimitiveProperty;
import org.apache.olingo.server.api.uri.UriResourceRoot;
import org.apache.olingo.server.api.uri.queryoption.expression.Alias;
import org.apache.olingo.server.api.uri.queryoption.expression.Binary;
import org.apache.olingo.server.api.uri.queryoption.expression.Enumeration;
import org.apache.olingo.server.api.uri.queryoption.expression.Expression;
import org.apache.olingo.server.api.uri.queryoption.expression.LambdaRef;
import org.apache.olingo.server.api.uri.queryoption.expression.Literal;
import org.apache.olingo.server.api.uri.queryoption.expression.Member;
import org.apache.olingo.server.api.uri.queryoption.expression.Method;
import org.apache.olingo.server.api.uri.queryoption.expression.TypeLiteral;
import org.apache.olingo.server.api.uri.queryoption.expression.Unary;
import org.apache.olingo.server.api.uri.*;
import org.apache.olingo.server.api.uri.queryoption.expression.*;
import org.apache.olingo.server.core.RequestURLHierarchyVisitor;
import org.teiid.core.TeiidException;
import org.teiid.core.TeiidRuntimeException;
import org.teiid.core.types.DataTypeManager;
import org.teiid.core.types.JDBCSQLTypeInfo;
import org.teiid.metadata.Column;
Expand All @@ -66,21 +47,7 @@
import org.teiid.olingo.ODataTypeManager;
import org.teiid.olingo.service.ODataSQLBuilder.URLParseService;
import org.teiid.olingo.service.TeiidServiceHandler.UniqueNameGenerator;
import org.teiid.query.sql.lang.CompareCriteria;
import org.teiid.query.sql.lang.CompoundCriteria;
import org.teiid.query.sql.lang.Criteria;
import org.teiid.query.sql.lang.ExpressionCriteria;
import org.teiid.query.sql.lang.From;
import org.teiid.query.sql.lang.IsNullCriteria;
import org.teiid.query.sql.lang.JoinType;
import org.teiid.query.sql.lang.NotCriteria;
import org.teiid.query.sql.lang.Query;
import org.teiid.query.sql.lang.QueryCommand;
import org.teiid.query.sql.lang.SPParameter;
import org.teiid.query.sql.lang.Select;
import org.teiid.query.sql.lang.StoredProcedure;
import org.teiid.query.sql.lang.SubqueryCompareCriteria;
import org.teiid.query.sql.lang.SubqueryFromClause;
import org.teiid.query.sql.lang.*;
import org.teiid.query.sql.symbol.AggregateSymbol;
import org.teiid.query.sql.symbol.AliasSymbol;
import org.teiid.query.sql.symbol.Constant;
Expand All @@ -97,7 +64,6 @@ static enum ExpressionType{LAMBDAALL, LAMBDAANY, ROOT, ANY}
private final Stack<org.teiid.query.sql.symbol.Expression> stack = new Stack<org.teiid.query.sql.symbol.Expression>();
private List<SQLParameter> params;
private boolean prepared = false;
private final List<TeiidException> exceptions = new ArrayList<TeiidException>();
private final UriInfo uriInfo;
private MetadataStore metadata;
private DocumentNode ctxQuery;
Expand All @@ -122,18 +88,26 @@ public ODataExpressionToSQLVisitor(DocumentNode resource,
}

public org.teiid.query.sql.symbol.Expression getExpression(Expression expr) throws TeiidException {
accept(expr);
if (!this.exceptions.isEmpty()) {
throw this.exceptions.get(0);
}
try {
accept(expr);
} catch (TeiidRuntimeException e) {
if (e.getCause() instanceof TeiidException) {
throw (TeiidException)e.getCause();
}
throw e;
}
return this.stack.pop();
}

public org.teiid.query.sql.symbol.Expression getExpression(UriInfoResource info) throws TeiidException {
visit(info);
if (!this.exceptions.isEmpty()) {
throw this.exceptions.get(0);
}
try {
visit(info);
} catch (TeiidRuntimeException e) {
if (e.getCause() instanceof TeiidException) {
throw (TeiidException)e.getCause();
}
throw e;
}
return this.stack.pop();
}

Expand Down Expand Up @@ -168,7 +142,7 @@ public void visit(Alias expr) {
}
}
} catch (TeiidException e) {
this.exceptions.add(e);
throw new TeiidRuntimeException(e);
}

}
Expand All @@ -185,8 +159,7 @@ public void visit(Binary expr) {
switch (expr.getOperator()) {
case HAS:
// TODO: not supported. What would be SQL equivalent?
this.exceptions.add(new TeiidException(ODataPlugin.Event.TEIID16036, ODataPlugin.Util.gs(ODataPlugin.Event.TEIID16036)));
break;
throw new TeiidRuntimeException(new TeiidException(ODataPlugin.Event.TEIID16036, ODataPlugin.Util.gs(ODataPlugin.Event.TEIID16036)));
case MUL:
binaryExpr = new Function("*", new org.teiid.query.sql.symbol.Expression[] { lhs, rhs }); //$NON-NLS-1$
break;
Expand Down Expand Up @@ -282,7 +255,7 @@ else if (rhs instanceof Constant && ((Constant) rhs).getType() == DataTypeManage

@Override
public void visit(Enumeration expr) {
this.exceptions.add(new TeiidException("unsupported option"));//$NON-NLS-1$
throw new TeiidRuntimeException(new TeiidException("unsupported option"));//$NON-NLS-1$
}

@Override
Expand All @@ -305,7 +278,7 @@ public void visit(Literal expr) {
this.stack.add(new Constant(value));
}
} catch (TeiidException e) {
this.exceptions.add(e);
throw new TeiidRuntimeException(e);
}
}

Expand Down Expand Up @@ -402,7 +375,7 @@ public void visit(Method expr) {
case GEOINTERSECTS:
case ISOF:
default:
this.exceptions.add(new TeiidException(ODataPlugin.Event.TEIID16027, ODataPlugin.Util.gs(ODataPlugin.Event.TEIID16027, expr.getMethod())));
throw new TeiidRuntimeException(new TeiidException(ODataPlugin.Event.TEIID16027, ODataPlugin.Util.gs(ODataPlugin.Event.TEIID16027, expr.getMethod())));
}
}

Expand Down Expand Up @@ -508,7 +481,7 @@ public void visit(UriResourceNavigation info) {
query.setCriteria(criteria);
this.stack.add(new ScalarSubquery(query));
} catch (TeiidException e) {
this.exceptions.add(e);
throw new TeiidRuntimeException(e);
}
}

Expand Down Expand Up @@ -551,7 +524,7 @@ public void visit(UriResourceLambdaVariable resource) {
this.ctxQuery = lambda;
}
} catch (TeiidException e) {
this.exceptions.add(e);
throw new TeiidRuntimeException(e);
}
}

Expand Down Expand Up @@ -604,7 +577,7 @@ public void visit(UriResourceIt info) {
this.ctxQuery.addSibiling(itResource);
}
else {
this.exceptions.add(new TeiidException(ODataPlugin.Event.TEIID16010, ODataPlugin.Util.gs(ODataPlugin.Event.TEIID16010)));
throw new TeiidRuntimeException(new TeiidException(ODataPlugin.Event.TEIID16010, ODataPlugin.Util.gs(ODataPlugin.Event.TEIID16010)));
}
}

Expand All @@ -622,7 +595,7 @@ public void visit(UriResourceEntitySet info) {
info.getKeyPredicates(), this.metadata, this.nameGenerator,
true, getUriInfo(), null);
} catch (TeiidException e) {
this.exceptions.add(e);
throw new TeiidRuntimeException(e);
}
}
else {
Expand Down
13 changes: 10 additions & 3 deletions olingo/src/test/java/org/teiid/olingo/TestODataSQLBuilder.java
Expand Up @@ -21,6 +21,8 @@
*/
package org.teiid.olingo;

import static org.junit.Assert.*;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.sql.Time;
Expand Down Expand Up @@ -121,6 +123,7 @@ static class UpdateState extends BaseState {
static class BaseState {
Client client;
String response;
Integer status;
}

static class ProcedureState extends BaseState {
Expand Down Expand Up @@ -206,9 +209,11 @@ public void setWriteListener(WriteListener writeListener) {
} finally {
TeiidServiceHandler.setClient(null);
}

ArgumentCaptor<Integer> statusCapture = ArgumentCaptor.forClass(Integer.class);
Mockito.verify(response).setStatus(statusCapture.capture());
state.client = client;
state.response = sb.toString();
state.status = statusCapture.getValue();
return state;
}

Expand Down Expand Up @@ -377,8 +382,10 @@ public void testAlias() throws Exception {

@Test
public void testAlias2() throws Exception {
helpTest("/odata4/vdb/PM1/G1?$filter=e1 eq @p1&@p1=1",
"SELECT g0.e1, g0.e2, g0.e3 FROM PM1.G1 AS g0 WHERE g0.e1 = '1' ORDER BY g0.e2");
QueryState state = helpTest("/odata4/vdb/PM1/G1?$filter=e1 eq @p1&@p1=1",
null);
//should really be 400
assertEquals(Integer.valueOf(500), state.status);
}

@Test
Expand Down

0 comments on commit b898dbf

Please sign in to comment.