[OLINGO-63] Uri Parser: Improve API for $select and extend testcases

This commit is contained in:
Sven Kobler 2014-01-29 15:27:00 +01:00
parent 1ef03f92f4
commit fb833de3ae
33 changed files with 728 additions and 448 deletions

View File

@ -20,10 +20,11 @@ package org.apache.olingo.odata4.producer.api.uri;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.Expression; import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.Expression;
public interface UriResourceAny extends UriResourcePartTyped { public interface UriResourceLambdaAll extends UriResourcePartTyped {
public String getLamdaVariable(); public String getVariable();
public Expression getExpression(); public Expression getExpression();
} }

View File

@ -20,9 +20,9 @@ package org.apache.olingo.odata4.producer.api.uri;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.Expression; import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.Expression;
public interface UriResourceAll extends UriResourcePartTyped { public interface UriResourceLambdaAny extends UriResourcePartTyped {
public String getLamdaVariable(); public String getVariable();
public Expression getExpression(); public Expression getExpression();

View File

@ -18,14 +18,7 @@
******************************************************************************/ ******************************************************************************/
package org.apache.olingo.odata4.producer.api.uri; package org.apache.olingo.odata4.producer.api.uri;
import org.apache.olingo.odata4.commons.api.edm.EdmType;
/**
* Class indicating the $it reference. $it may be used within filter to
* refer to the last EDM object reference in the resource path. Since $it is
* optional in some cases ( e.g. first member expressions) the {@link #isExplicitIt()}
* method can be used to check if $it was explicitly noted in the URI
*/
public interface UriResourceLambdaRef extends UriResourcePartTyped { public interface UriResourceLambdaRef extends UriResourcePartTyped {
public String getVariableText(); public String getVariableText();

View File

@ -27,4 +27,6 @@ public interface UriResourcePartTyped extends UriResourcePart {
boolean isCollection(); boolean isCollection();
String toString(boolean includeFilters);
} }

View File

@ -22,6 +22,6 @@ import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.Expressi
public interface AliasQueryOption extends QueryOption { public interface AliasQueryOption extends QueryOption {
public Expression getAliasValue(); public Expression getValue();
} }

View File

@ -20,10 +20,9 @@ package org.apache.olingo.odata4.producer.api.uri.queryoption;
import java.util.List; import java.util.List;
import org.apache.olingo.odata4.commons.api.edm.EdmAction;
import org.apache.olingo.odata4.commons.api.edm.EdmEntityType; import org.apache.olingo.odata4.commons.api.edm.EdmEntityType;
import org.apache.olingo.odata4.commons.api.edm.EdmFunction; import org.apache.olingo.odata4.commons.api.edm.provider.FullQualifiedName;
import org.apache.olingo.odata4.producer.api.uri.UriResourceProperty; import org.apache.olingo.odata4.producer.api.uri.UriResourcePart;
public interface SelectItem { public interface SelectItem {
@ -31,10 +30,10 @@ public interface SelectItem {
boolean isAllOperationsInSchema(); boolean isAllOperationsInSchema();
String getNameSpace(); FullQualifiedName getAllOperationsInSchemaNameSpace();
EdmEntityType getEntityTypeCast(); EdmEntityType getEntityTypeCast();
List<UriResourceProperty> getPropertyChainList(); List<UriResourcePart> getPropertyChainList();
} }

View File

@ -18,10 +18,15 @@
******************************************************************************/ ******************************************************************************/
package org.apache.olingo.odata4.producer.api.uri.queryoption.expression; package org.apache.olingo.odata4.producer.api.uri.queryoption.expression;
import org.apache.olingo.odata4.commons.api.edm.EdmType;
import org.apache.olingo.odata4.producer.api.uri.UriInfoResource; import org.apache.olingo.odata4.producer.api.uri.UriInfoResource;
public interface Member extends Expression { public interface Member extends Expression {
public UriInfoResource getPath(); public UriInfoResource getPath();
public EdmType getType();
public boolean isCollection();
} }

View File

@ -22,7 +22,6 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import org.apache.olingo.odata4.commons.api.edm.Edm;
import org.apache.olingo.odata4.commons.api.edm.EdmEntityType; import org.apache.olingo.odata4.commons.api.edm.EdmEntityType;
import org.apache.olingo.odata4.producer.api.uri.UriInfo; import org.apache.olingo.odata4.producer.api.uri.UriInfo;
import org.apache.olingo.odata4.producer.api.uri.UriInfoAll; import org.apache.olingo.odata4.producer.api.uri.UriInfoAll;

View File

@ -46,17 +46,119 @@ import org.apache.olingo.odata4.commons.api.edm.provider.FullQualifiedName;
import org.apache.olingo.odata4.producer.api.uri.UriInfoKind; import org.apache.olingo.odata4.producer.api.uri.UriInfoKind;
import org.apache.olingo.odata4.producer.api.uri.UriResourcePart; import org.apache.olingo.odata4.producer.api.uri.UriResourcePart;
import org.apache.olingo.odata4.producer.api.uri.UriResourcePartTyped; import org.apache.olingo.odata4.producer.api.uri.UriResourcePartTyped;
import org.apache.olingo.odata4.producer.api.uri.queryoption.SelectItem;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.SupportedBinaryOperators; import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.SupportedBinaryOperators;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.SupportedMethodCalls; import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.SupportedMethodCalls;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriLexer; import org.apache.olingo.odata4.producer.core.uri.antlr.UriLexer;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserBaseVisitor; import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserBaseVisitor;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.AliasAndValueContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.AllExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.AltAddContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.AltAllContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.AltAndContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.AltAnyContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.AltBatchContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.AltComparismContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.AltEntityCastContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.AltEntityContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.AltEqualityContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.AltLiteralContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.AltMetadataContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.AltMultContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.AltOrContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.AltResourcePathContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.AnyExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.CastExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.CeilingMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.ConcatMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.ConstSegmentContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.ContainsMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.CrossjoinContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.CustomQueryOptionContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.DayMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.DistanceMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.EndsWithMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.EntityOptionCastContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.EntityOptionContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.EntityOptionsCastContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.EntityOptionsContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.ExpandContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.ExpandCountOptionContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.ExpandItemContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.ExpandOptionContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.ExpandPathContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.ExpandPathExtensionContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.ExpandRefOptionContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.FilterContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.FloorMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.FormatContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.FractionalsecondsMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.GeoLengthMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.HourMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.IdContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.IndexOfMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.InlinecountContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.IntersectsMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.IsofExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.LengthMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.MaxDateTimeMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.MemberExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.MinDateTimeMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.MinuteMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.MonthMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.NameValueOptListContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.NameValuePairContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.NamespaceContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.NowMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.OdataIdentifierContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.OdataRelativeUriEOFContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.OrderByContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.PathSegmentContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.PathSegmentsContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.QueryOptionContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.QueryOptionsContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.ResourcePathContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.RootExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.RoundMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.SecondMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.SelectContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.SelectItemContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.SelectSegmentContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.SkipContext; import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.SkipContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.SkiptokenContext; import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.SkiptokenContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.StartsWithMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.SubstringMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.TimeMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.ToLowerMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.ToUpperMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.TopContext; import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.TopContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.*; import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.TotalOffsetMinutesMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.queryoption.*; import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.TotalsecondsMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.queryoption.expression.*; import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.TrimMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.UnaryContext;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriParserParser.YearMethodCallExprContext;
import org.apache.olingo.odata4.producer.core.uri.queryoption.AliasQueryOptionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.CustomQueryOptionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.ExpandItemImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.ExpandOptionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.FilterOptionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.FormatOptionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.IdOptionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.InlineCountOptionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.LevelExpandOptionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.OrderByOptionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.QueryOptionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.SelectItemImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.SelectOptionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.SkipOptionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.SkiptokenOptionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.SystemQueryOptionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.TopOptionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.expression.BinaryImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.expression.ExpressionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.expression.LiteralImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.expression.MemberImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.expression.MethodCallImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.expression.TypeLiteralImpl;
/** /**
* UriVisitor * UriVisitor
@ -122,9 +224,9 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
/** /**
* Set within method {@link #visitSelectItem(SelectItemContext ctx)} to allow nodes * Set within method {@link #visitSelectItem(SelectItemContext ctx)} to allow nodes
* deeper in the expand tree at {@link #visitSelectSegment(SelectSegmentContext ctx)} appending path segments to the * deeper in the expand tree at {@link #visitSelectSegment(SelectSegmentContext ctx)} appending path segments to the
* currently processed {@link SelectItemOptionImpl}. * currently processed {@link SelectItemImpl}.
*/ */
private SelectItemOptionImpl contextSelectItem; private SelectItemImpl contextSelectItem;
private Stack<LastTypeColl> contextTypes = new Stack<LastTypeColl>(); private Stack<LastTypeColl> contextTypes = new Stack<LastTypeColl>();
@ -310,7 +412,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
if (lastKeyPred.getTypeFilterOnEntry() != null) { if (lastKeyPred.getTypeFilterOnEntry() != null) {
throw wrap(new UriParserSemanticException("Single type filters are not chainable")); throw wrap(new UriParserSemanticException("Single type filters are not chainable"));
} }
lastKeyPred.setSingleTypeFilter(filterEntityType); lastKeyPred.setEntryTypeFilter(filterEntityType);
return null; return null;
} else { } else {
if (lastKeyPred.getTypeFilterOnCollection() != null) { if (lastKeyPred.getTypeFilterOnCollection() != null) {
@ -350,7 +452,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
if (lastKeyPred.getTypeFilterOnEntry() != null) { if (lastKeyPred.getTypeFilterOnEntry() != null) {
throw wrap(new UriParserSemanticException("Single TypeFilter are not chainable")); throw wrap(new UriParserSemanticException("Single TypeFilter are not chainable"));
} }
lastKeyPred.setSingleTypeFilter(filterComplexType); lastKeyPred.setEntryTypeFilter(filterComplexType);
return null; return null;
} else { } else {
if (lastKeyPred.getTypeFilterOnCollection() != null) { if (lastKeyPred.getTypeFilterOnCollection() != null) {
@ -1002,14 +1104,13 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
} }
} }
String text = ctx.children.get(2).getText(); String text = ctx.children.get(2).getText();
if ( ctx.getChildCount()> 4) { if (ctx.getChildCount() > 4) {
text += ctx.children.get(3).getText(); text += ctx.children.get(3).getText();
text += ctx.children.get(4).getText(); text += ctx.children.get(4).getText();
} }
format.setText(text); format.setText(text);
return format; return format;
} }
@ -1349,10 +1450,10 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
@Override @Override
public Object visitSelect(final SelectContext ctx) { public Object visitSelect(final SelectContext ctx) {
List<SelectItemOptionImpl> selectItems = new ArrayList<SelectItemOptionImpl>(); List<SelectItemImpl> selectItems = new ArrayList<SelectItemImpl>();
for (SelectItemContext si : ctx.vlSI) { for (SelectItemContext si : ctx.vlSI) {
selectItems.add((SelectItemOptionImpl) si.accept(this)); selectItems.add((SelectItemImpl) si.accept(this));
} }
return new SelectOptionImpl().setSelectItems(selectItems); return new SelectOptionImpl().setSelectItems(selectItems);
@ -1360,7 +1461,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
@Override @Override
public Object visitSelectItem(final SelectItemContext ctx) { public Object visitSelectItem(final SelectItemContext ctx) {
SelectItemOptionImpl selectItem = new SelectItemOptionImpl(); SelectItemImpl selectItem = new SelectItemImpl();
contextSelectItem = selectItem; contextSelectItem = selectItem;
for (SelectSegmentContext si : ctx.vlSS) { for (SelectSegmentContext si : ctx.vlSS) {
@ -1381,7 +1482,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
FullQualifiedName fullName = new FullQualifiedName(namespace, "*"); FullQualifiedName fullName = new FullQualifiedName(namespace, "*");
contextSelectItem.addAllOperationsInSchema(fullName); contextSelectItem.addAllOperationsInSchema(fullName);
} else { } else {
contextSelectItem.addStar(); contextSelectItem.setStar(true);
} }
return null; return null;
} }
@ -1392,6 +1493,10 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
EdmType prevType = contextSelectItem.getType(); EdmType prevType = contextSelectItem.getType();
if (prevType == null) { if (prevType == null) {
prevType = this.contextTypes.peek().type; prevType = this.contextTypes.peek().type;
// add It to selectItem
UriResourceItImpl it = new UriResourceItImpl();
it.setType(prevType);
it.setCollection(this.contextTypes.peek().isCollection);
} }
if (!(prevType instanceof EdmStructuralType)) { if (!(prevType instanceof EdmStructuralType)) {
@ -1399,16 +1504,28 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
} }
EdmStructuralType structType = (EdmStructuralType) prevType; EdmStructuralType structType = (EdmStructuralType) prevType;
EdmElement property = (EdmElement) structType.getProperty(odi); EdmElement element = structType.getProperty(odi);
if (property == null) { if (element == null) {
throw wrap(new UriParserSemanticException("Previous select item has not property: " + odi)); throw wrap(new UriParserSemanticException("Previous select item has not property: " + odi));
} }
// create new segment // create new segment
SelectSegmentImpl newSegment = new SelectSegmentImpl().setProperty(property); // SelectSegmentImpl newSegment = new SelectSegmentImpl().setProperty(property);
contextSelectItem.addSegment(newSegment); // contextSelectItem.addSegment(newSegment);
if (element instanceof EdmProperty) {
EdmProperty property = (EdmProperty) element;
if (property.isPrimitive()) {
UriResourceSimplePropertyImpl simple = new UriResourceSimplePropertyImpl();
simple.setProperty(property);
contextSelectItem.addPath(simple);
} else {
UriResourceComplexPropertyImpl complex = new UriResourceComplexPropertyImpl();
complex.setProperty(property);
contextSelectItem.addPath(complex);
}
} else {
throw wrap(new UriParserSemanticException("Only Simple and Complex properties within select allowed"));
}
return this; return this;
} else { } else {
@ -1424,47 +1541,58 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
EdmComplexType ct = edm.getComplexType(fullName); EdmComplexType ct = edm.getComplexType(fullName);
if (ct != null) { if (ct != null) {
if (((EdmStructuralType) prevType).compatibleTo(ct)) { if (((EdmStructuralType) prevType).compatibleTo(ct)) {
SelectSegmentImpl lastSegment = contextSelectItem.getLastSegment(); UriResourcePart lastSegment = contextSelectItem.getLastPart();
lastSegment.setTypeCast(ct); if (lastSegment instanceof UriResourceImplKeyPred) {
UriResourceImplKeyPred lastKeyPred = (UriResourceImplKeyPred) lastSegment;
lastKeyPred.setCollectionTypeFilter(ct);
} else if (lastSegment instanceof UriResourceImplTyped) {
{
UriResourceImplTyped lastTyped = (UriResourceImplTyped) lastSegment;
lastTyped.setTypeFilter(ct);
}
return this;
}
}
}
} else {
prevType = this.contextTypes.peek().type;
if (prevType instanceof EdmEntityType) {
EdmEntityType et = edm.getEntityType(fullName);
if (((EdmStructuralType) prevType).compatibleTo(et)) {
contextSelectItem.setEntityTypeCast(et);
return this; return this;
} }
} }
} }
} else {
prevType = this.contextTypes.peek().type; FullQualifiedName finalTypeName = new FullQualifiedName(prevType.getNamespace(), prevType.getName());
if (prevType instanceof EdmEntityType) {
EdmEntityType et = edm.getEntityType(fullName); // check for action
if (((EdmStructuralType) prevType).compatibleTo(et)) { EdmAction action = edm.getAction(fullName, finalTypeName, null);
contextSelectItem.setEntityTypeCast(et); // TODO verify that null ignores if it is a collection
return this;
} if (action != null) {
UriResourceActionImpl uriAction = new UriResourceActionImpl();
uriAction.setAction(action);
contextSelectItem.addPath(uriAction);
} }
// check for function
EdmFunction function = edm.getFunction(fullName, finalTypeName, null, null);
// TODO verify that null ignores if it is a collection
if (function != null) {
UriResourceFunctionImpl uriFunction = new UriResourceFunctionImpl();
uriFunction.setFunction(function);
contextSelectItem.addPath(uriFunction);
}
} }
FullQualifiedName finalTypeName = new FullQualifiedName(prevType.getNamespace(), prevType.getName());
// check for action
EdmAction action = edm.getAction(fullName, finalTypeName, null);
// TODO verify that null ignores if it is a collection
if (action != null) {
contextSelectItem.addSegment(new SelectSegmentImpl().setAction(action));
}
// check for function
EdmFunction function = edm.getFunction(fullName, finalTypeName, null, null);
// TODO verify that null ignores if it is a collection
if (function != null) {
contextSelectItem.addSegment(new SelectSegmentImpl().setFunction(function));
}
} }
return null; return null;
} }
@Override @Override
public Object visitSkip(SkipContext ctx) { public Object visitSkip(SkipContext ctx) {
SkipOptionImpl skiptoken = new SkipOptionImpl(); SkipOptionImpl skiptoken = new SkipOptionImpl();
@ -1512,7 +1640,6 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
.addParameter((ExpressionImpl) ctx.vE1.accept(this)); .addParameter((ExpressionImpl) ctx.vE1.accept(this));
} }
@Override @Override
public Object visitTop(TopContext ctx) { public Object visitTop(TopContext ctx) {
TopOptionImpl top = new TopOptionImpl(); TopOptionImpl top = new TopOptionImpl();

View File

@ -76,4 +76,5 @@ public class UriResourceActionImpl extends UriResourceImplTyped implements UriRe
} }
return ""; return "";
} }
} }

View File

@ -21,12 +21,12 @@ package org.apache.olingo.odata4.producer.core.uri;
import org.apache.olingo.odata4.commons.api.edm.EdmProperty; import org.apache.olingo.odata4.commons.api.edm.EdmProperty;
import org.apache.olingo.odata4.commons.api.edm.EdmType; import org.apache.olingo.odata4.commons.api.edm.EdmType;
import org.apache.olingo.odata4.commons.core.edm.primitivetype.EdmPrimitiveTypeKind; import org.apache.olingo.odata4.commons.core.edm.primitivetype.EdmPrimitiveTypeKind;
import org.apache.olingo.odata4.producer.api.uri.UriResourceAll;
import org.apache.olingo.odata4.producer.api.uri.UriResourceKind; import org.apache.olingo.odata4.producer.api.uri.UriResourceKind;
import org.apache.olingo.odata4.producer.api.uri.UriResourceLambdaAll;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.Expression; import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.Expression;
import org.apache.olingo.odata4.producer.core.uri.queryoption.expression.ExpressionImpl; import org.apache.olingo.odata4.producer.core.uri.queryoption.expression.ExpressionImpl;
public class UriResourceAllImpl extends UriResourceImplTyped implements UriResourceAll { public class UriResourceAllImpl extends UriResourceImplTyped implements UriResourceLambdaAll {
protected EdmProperty property; protected EdmProperty property;
private String lamdaVariable; private String lamdaVariable;
private ExpressionImpl expression; private ExpressionImpl expression;
@ -46,7 +46,7 @@ public class UriResourceAllImpl extends UriResourceImplTyped implements UriResou
} }
@Override @Override
public String getLamdaVariable() { public String getVariable() {
return lamdaVariable; return lamdaVariable;
} }
@ -69,4 +69,6 @@ public class UriResourceAllImpl extends UriResourceImplTyped implements UriResou
public String toString() { public String toString() {
return "all"; return "all";
} }
} }

View File

@ -21,12 +21,12 @@ package org.apache.olingo.odata4.producer.core.uri;
import org.apache.olingo.odata4.commons.api.edm.EdmProperty; import org.apache.olingo.odata4.commons.api.edm.EdmProperty;
import org.apache.olingo.odata4.commons.api.edm.EdmType; import org.apache.olingo.odata4.commons.api.edm.EdmType;
import org.apache.olingo.odata4.commons.core.edm.primitivetype.EdmPrimitiveTypeKind; import org.apache.olingo.odata4.commons.core.edm.primitivetype.EdmPrimitiveTypeKind;
import org.apache.olingo.odata4.producer.api.uri.UriResourceAny;
import org.apache.olingo.odata4.producer.api.uri.UriResourceKind; import org.apache.olingo.odata4.producer.api.uri.UriResourceKind;
import org.apache.olingo.odata4.producer.api.uri.UriResourceLambdaAny;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.Expression; import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.Expression;
import org.apache.olingo.odata4.producer.core.uri.queryoption.expression.ExpressionImpl; import org.apache.olingo.odata4.producer.core.uri.queryoption.expression.ExpressionImpl;
public class UriResourceAnyImpl extends UriResourceImplTyped implements UriResourceAny { public class UriResourceAnyImpl extends UriResourceImplTyped implements UriResourceLambdaAny {
protected EdmProperty property; protected EdmProperty property;
private String lamdaVariable; private String lamdaVariable;
private ExpressionImpl expression; private ExpressionImpl expression;
@ -46,7 +46,7 @@ public class UriResourceAnyImpl extends UriResourceImplTyped implements UriResou
} }
@Override @Override
public String getLamdaVariable() { public String getVariable() {
return lamdaVariable; return lamdaVariable;
} }

View File

@ -67,4 +67,6 @@ public class UriResourceComplexPropertyImpl extends UriResourceImplTyped impleme
return property.getName(); return property.getName();
} }
} }

View File

@ -67,4 +67,6 @@ public class UriResourceEntitySetImpl extends UriResourceImplKeyPred implements
return edmEntitySet.getName(); return edmEntitySet.getName();
} }
} }

View File

@ -22,6 +22,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.apache.olingo.odata4.commons.api.edm.EdmType; import org.apache.olingo.odata4.commons.api.edm.EdmType;
import org.apache.olingo.odata4.commons.api.edm.provider.FullQualifiedName;
import org.apache.olingo.odata4.producer.api.uri.UriParameter; import org.apache.olingo.odata4.producer.api.uri.UriParameter;
import org.apache.olingo.odata4.producer.api.uri.UriResourceKind; import org.apache.olingo.odata4.producer.api.uri.UriResourceKind;
@ -29,15 +30,15 @@ public abstract class UriResourceImplKeyPred extends UriResourceImplTyped {
protected EdmType collectionTypeFilter = null; protected EdmType collectionTypeFilter = null;
protected List<UriParameterImpl> keyPredicates = null; protected List<UriParameterImpl> keyPredicates = null;
protected EdmType singleTypeFilter = null; protected EdmType entryTypeFilter = null;
public UriResourceImplKeyPred(final UriResourceKind kind) { public UriResourceImplKeyPred(final UriResourceKind kind) {
super(kind); super(kind);
} }
public EdmType getComplexTypeFilter() { public EdmType getComplexTypeFilter() {
if (singleTypeFilter != null) { if (entryTypeFilter != null) {
return singleTypeFilter; return entryTypeFilter;
} }
return collectionTypeFilter; return collectionTypeFilter;
} }
@ -47,7 +48,7 @@ public abstract class UriResourceImplKeyPred extends UriResourceImplTyped {
} }
public EdmType getTypeFilterOnEntry() { public EdmType getTypeFilterOnEntry() {
return singleTypeFilter; return entryTypeFilter;
} }
public List<UriParameter> getKeyPredicates() { public List<UriParameter> getKeyPredicates() {
@ -63,12 +64,39 @@ public abstract class UriResourceImplKeyPred extends UriResourceImplTyped {
return this; return this;
} }
public void setSingleTypeFilter(final EdmType singleTypeFilter) { public void setEntryTypeFilter(final EdmType singleTypeFilter) {
this.singleTypeFilter = singleTypeFilter; this.entryTypeFilter = singleTypeFilter;
} }
public void setCollectionTypeFilter(final EdmType collectionTypeFilter) { public void setCollectionTypeFilter(final EdmType collectionTypeFilter) {
this.collectionTypeFilter = collectionTypeFilter; this.collectionTypeFilter = collectionTypeFilter;
} }
@Override
public String toString(boolean includeFilters) {
if (includeFilters == true) {
String tmp = "";
if (collectionTypeFilter != null) {
tmp += getFQN(collectionTypeFilter).toString();
}
if (entryTypeFilter != null) {
if (tmp.length() == 0) {
tmp = getFQN(entryTypeFilter).toString();
} else {
tmp += "/()" + getFQN(entryTypeFilter).toString();
}
}
if (tmp.length() != 0) {
return toString()+ "/" + tmp ;
}
}
return toString();
}
private FullQualifiedName getFQN(EdmType type) {
return new FullQualifiedName(type.getNamespace(), type.getName());
}
} }

View File

@ -20,6 +20,7 @@ package org.apache.olingo.odata4.producer.core.uri;
import org.apache.olingo.odata4.commons.api.edm.EdmStructuralType; import org.apache.olingo.odata4.commons.api.edm.EdmStructuralType;
import org.apache.olingo.odata4.commons.api.edm.EdmType; import org.apache.olingo.odata4.commons.api.edm.EdmType;
import org.apache.olingo.odata4.commons.api.edm.provider.FullQualifiedName;
import org.apache.olingo.odata4.producer.api.uri.UriResourceKind; import org.apache.olingo.odata4.producer.api.uri.UriResourceKind;
import org.apache.olingo.odata4.producer.api.uri.UriResourcePartTyped; import org.apache.olingo.odata4.producer.api.uri.UriResourcePartTyped;
@ -40,4 +41,16 @@ public abstract class UriResourceImplTyped extends UriResourcePartImpl implement
return this; return this;
} }
@Override
public String toString(boolean includeFilters) {
if (typeFilter != null) {
return toString() + "/" + getFQN(typeFilter).toString();
}
return toString();
}
private FullQualifiedName getFQN(EdmType type) {
return new FullQualifiedName(type.getNamespace(), type.getName());
}
} }

View File

@ -19,7 +19,6 @@
package org.apache.olingo.odata4.producer.core.uri; package org.apache.olingo.odata4.producer.core.uri;
import org.apache.olingo.odata4.commons.api.edm.EdmType; import org.apache.olingo.odata4.commons.api.edm.EdmType;
import org.apache.olingo.odata4.producer.api.uri.UriResourceIt;
import org.apache.olingo.odata4.producer.api.uri.UriResourceKind; import org.apache.olingo.odata4.producer.api.uri.UriResourceKind;
import org.apache.olingo.odata4.producer.api.uri.UriResourceLambdaRef; import org.apache.olingo.odata4.producer.api.uri.UriResourceLambdaRef;

View File

@ -26,7 +26,7 @@ public class AliasQueryOptionImpl extends QueryOptionImpl implements AliasQueryO
private ExpressionImpl aliasValue; private ExpressionImpl aliasValue;
@Override @Override
public ExpressionImpl getAliasValue() { public ExpressionImpl getValue() {
return aliasValue; return aliasValue;
} }

View File

@ -19,12 +19,10 @@
******************************************************************************/ ******************************************************************************/
package org.apache.olingo.odata4.producer.core.uri.queryoption; package org.apache.olingo.odata4.producer.core.uri.queryoption;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.apache.olingo.odata4.commons.api.edm.Edm; import org.apache.olingo.odata4.commons.api.edm.Edm;
import org.apache.olingo.odata4.producer.api.uri.UriInfoResource; import org.apache.olingo.odata4.producer.api.uri.UriInfoResource;
import org.apache.olingo.odata4.producer.api.uri.queryoption.ExceptionVisitExpand;
import org.apache.olingo.odata4.producer.api.uri.queryoption.ExpandItem; import org.apache.olingo.odata4.producer.api.uri.queryoption.ExpandItem;
import org.apache.olingo.odata4.producer.api.uri.queryoption.ExpandOption; import org.apache.olingo.odata4.producer.api.uri.queryoption.ExpandOption;
import org.apache.olingo.odata4.producer.api.uri.queryoption.FilterOption; import org.apache.olingo.odata4.producer.api.uri.queryoption.FilterOption;

View File

@ -21,7 +21,6 @@ package org.apache.olingo.odata4.producer.core.uri.queryoption;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.apache.olingo.odata4.producer.api.uri.queryoption.ExceptionVisitExpand;
import org.apache.olingo.odata4.producer.api.uri.queryoption.ExpandItem; import org.apache.olingo.odata4.producer.api.uri.queryoption.ExpandItem;
import org.apache.olingo.odata4.producer.api.uri.queryoption.ExpandOption; import org.apache.olingo.odata4.producer.api.uri.queryoption.ExpandOption;
import org.apache.olingo.odata4.producer.api.uri.queryoption.SupportedQueryOptions; import org.apache.olingo.odata4.producer.api.uri.queryoption.SupportedQueryOptions;

View File

@ -0,0 +1,115 @@
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
******************************************************************************/
package org.apache.olingo.odata4.producer.core.uri.queryoption;
//TODO rework this
import java.util.ArrayList;
import java.util.List;
import org.apache.olingo.odata4.commons.api.edm.EdmEntityType;
import org.apache.olingo.odata4.commons.api.edm.EdmType;
import org.apache.olingo.odata4.commons.api.edm.provider.FullQualifiedName;
import org.apache.olingo.odata4.producer.api.uri.UriResourcePart;
import org.apache.olingo.odata4.producer.api.uri.queryoption.SelectItem;
import org.apache.olingo.odata4.producer.core.uri.UriResourceImplKeyPred;
import org.apache.olingo.odata4.producer.core.uri.UriResourceImplTyped;
import org.apache.olingo.odata4.producer.core.uri.UriResourcePartImpl;
public class SelectItemImpl implements SelectItem {
private UriResourceImplTyped lastResourcePart;
private List<UriResourcePartImpl> parts = new ArrayList<UriResourcePartImpl>();
private boolean isStar;
private FullQualifiedName addOperationsInSchemaNameSpace;
private EdmEntityType entityTypeCast;
public EdmType getType() {
if (lastResourcePart != null) {
if (lastResourcePart instanceof UriResourceImplKeyPred) {
UriResourceImplKeyPred lastKeyPred = (UriResourceImplKeyPred) lastResourcePart;
if (lastKeyPred.getTypeFilterOnEntry() != null) {
return lastKeyPred.getTypeFilterOnEntry();
} else if (lastKeyPred.getTypeFilterOnCollection() != null) {
return lastKeyPred.getTypeFilterOnCollection();
}
}
EdmType type = lastResourcePart.getTypeFilter();
if (type != null) {
return type;
}
}
return null;
}
@Override
public boolean isStar() {
return isStar;
}
public SelectItemImpl setStar(boolean isStar) {
this.isStar = isStar;
return this;
}
@Override
public boolean isAllOperationsInSchema() {
if (addOperationsInSchemaNameSpace == null) {
return false;
} else {
return true;
}
}
@Override
public FullQualifiedName getAllOperationsInSchemaNameSpace() {
return addOperationsInSchemaNameSpace;
}
public void addAllOperationsInSchema(final FullQualifiedName addOperationsInSchemaNameSpace) {
this.addOperationsInSchemaNameSpace = addOperationsInSchemaNameSpace;
}
@Override
public EdmEntityType getEntityTypeCast() {
return entityTypeCast;
}
public SelectItemImpl setEntityTypeCast(EdmEntityType entityTypeCast) {
this.entityTypeCast = entityTypeCast;
return this;
}
@Override
public List<UriResourcePart> getPropertyChainList() {
return null;
}
public UriResourcePart getLastPart() {
return lastResourcePart;
}
public SelectItemImpl addPath(UriResourceImplTyped resourcePart) {
parts.add(resourcePart);
this.lastResourcePart = resourcePart;
return this;
}
}

View File

@ -1,109 +0,0 @@
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
******************************************************************************/
package org.apache.olingo.odata4.producer.core.uri.queryoption;
//TODO rework this
import java.util.ArrayList;
import java.util.List;
import org.apache.olingo.odata4.commons.api.edm.Edm;
import org.apache.olingo.odata4.commons.api.edm.EdmAction;
import org.apache.olingo.odata4.commons.api.edm.EdmComplexType;
import org.apache.olingo.odata4.commons.api.edm.EdmEntityType;
import org.apache.olingo.odata4.commons.api.edm.EdmFunction;
import org.apache.olingo.odata4.commons.api.edm.EdmStructuralType;
import org.apache.olingo.odata4.commons.api.edm.EdmType;
import org.apache.olingo.odata4.commons.api.edm.provider.FullQualifiedName;
import org.apache.olingo.odata4.producer.api.uri.UriResourceProperty;
import org.apache.olingo.odata4.producer.api.uri.queryoption.SelectItem;
public class SelectItemOptionImpl implements SelectItem {
private SelectSegmentImpl lastSegment = null;
// only one of these must me filled
private List<SelectSegmentImpl> segments = new ArrayList<SelectSegmentImpl>();
public EdmType getType() {
if (lastSegment != null) {
EdmType type = lastSegment.getTypeCast();
if (type != null) {
return type;
}
return lastSegment.getType();
}
return null;
}
public void addSegment(SelectSegmentImpl newSegment) {
segments.add(newSegment);
lastSegment = newSegment;
}
public void addStar() {}
public void addAllOperationsInSchema(final FullQualifiedName addOperationsInSchema) {}
@Override
public boolean isStar() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isAllOperationsInSchema() {
// TODO Auto-generated method stub
return false;
}
@Override
public String getNameSpace() {
// TODO Auto-generated method stub
return null;
}
@Override
public EdmEntityType getEntityTypeCast() {
// TODO Auto-generated method stub
return null;
}
@Override
public List<UriResourceProperty> getPropertyChainList() {
// TODO Auto-generated method stub
return null;
}
public SelectSegmentImpl getLastSegment() {
return lastSegment;
}
public void setEntityTypeCast(EdmEntityType et) {
// TODO Auto-generated method stub
}
}

View File

@ -27,13 +27,13 @@ import org.apache.olingo.odata4.producer.api.uri.queryoption.SupportedQueryOptio
public class SelectOptionImpl extends SystemQueryOptionImpl implements SelectOption { public class SelectOptionImpl extends SystemQueryOptionImpl implements SelectOption {
private List<SelectItemOptionImpl> selectItems; private List<SelectItemImpl> selectItems;
public SelectOptionImpl() { public SelectOptionImpl() {
setKind(SupportedQueryOptions.SELECT); setKind(SupportedQueryOptions.SELECT);
} }
public SelectOptionImpl setSelectItems(final List<SelectItemOptionImpl> selectItems) { public SelectOptionImpl setSelectItems(final List<SelectItemImpl> selectItems) {
this.selectItems = selectItems; this.selectItems = selectItems;
return this; return this;
} }
@ -41,7 +41,7 @@ public class SelectOptionImpl extends SystemQueryOptionImpl implements SelectOpt
@Override @Override
public List<SelectItem> getSelectItems() { public List<SelectItem> getSelectItems() {
List<SelectItem> retList = new ArrayList<SelectItem>(); List<SelectItem> retList = new ArrayList<SelectItem>();
for (SelectItemOptionImpl item : selectItems) { for (SelectItemImpl item : selectItems) {
retList.add(item); retList.add(item);
} }
return retList; return retList;

View File

@ -1,78 +0,0 @@
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
******************************************************************************/
package org.apache.olingo.odata4.producer.core.uri.queryoption;
import org.apache.olingo.odata4.commons.api.edm.EdmAction;
import org.apache.olingo.odata4.commons.api.edm.EdmElement;
import org.apache.olingo.odata4.commons.api.edm.EdmFunction;
import org.apache.olingo.odata4.commons.api.edm.EdmStructuralType;
import org.apache.olingo.odata4.commons.api.edm.EdmType;
public class SelectSegmentImpl {
private EdmElement property;
private EdmAction action;
private EdmFunction function;
private EdmType typeCast;
public EdmElement getProperty() {
return property;
}
public SelectSegmentImpl setProperty(final EdmElement property) {
this.property = property;
return this;
}
public EdmType getType() {
return property.getType();
}
public EdmType getTypeCast() {
return typeCast;
}
public SelectSegmentImpl setTypeCast(final EdmStructuralType type) {
typeCast = type;
return this;
}
public EdmAction getAction() {
return action;
}
public SelectSegmentImpl setAction(EdmAction action) {
this.action = action;
return this;
}
public EdmFunction getFunction() {
return function;
}
public SelectSegmentImpl setFunction(EdmFunction function) {
this.function = function;
return this;
}
}

View File

@ -18,8 +18,8 @@
******************************************************************************/ ******************************************************************************/
package org.apache.olingo.odata4.producer.core.uri.queryoption; package org.apache.olingo.odata4.producer.core.uri.queryoption;
import org.apache.olingo.odata4.producer.api.uri.queryoption.SystemQueryOption;
import org.apache.olingo.odata4.producer.api.uri.queryoption.SupportedQueryOptions; import org.apache.olingo.odata4.producer.api.uri.queryoption.SupportedQueryOptions;
import org.apache.olingo.odata4.producer.api.uri.queryoption.SystemQueryOption;
public class SystemQueryOptionImpl extends QueryOptionImpl implements SystemQueryOption { public class SystemQueryOptionImpl extends QueryOptionImpl implements SystemQueryOption {

View File

@ -18,12 +18,17 @@
******************************************************************************/ ******************************************************************************/
package org.apache.olingo.odata4.producer.core.uri.queryoption.expression; package org.apache.olingo.odata4.producer.core.uri.queryoption.expression;
import org.apache.olingo.odata4.commons.api.edm.EdmType;
import org.apache.olingo.odata4.commons.api.exception.ODataApplicationException; import org.apache.olingo.odata4.commons.api.exception.ODataApplicationException;
import org.apache.olingo.odata4.producer.api.uri.UriInfoResource; import org.apache.olingo.odata4.producer.api.uri.UriInfoResource;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.ExceptionVisitExpression; import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.ExceptionVisitExpression;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.ExpressionVisitor; import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.ExpressionVisitor;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.Member; import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.Member;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.VisitableExression; import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.VisitableExression;
import org.apache.olingo.odata4.producer.core.uri.UriInfoImpl;
import org.apache.olingo.odata4.producer.core.uri.UriResourceImplKeyPred;
import org.apache.olingo.odata4.producer.core.uri.UriResourceImplTyped;
import org.apache.olingo.odata4.producer.core.uri.UriResourcePartImpl;
public class MemberImpl extends ExpressionImpl implements Member, VisitableExression { public class MemberImpl extends ExpressionImpl implements Member, VisitableExression {
@ -44,4 +49,41 @@ public class MemberImpl extends ExpressionImpl implements Member, VisitableExres
return visitor.visitMember(path); return visitor.visitMember(path);
} }
@Override
public EdmType getType() {
UriInfoImpl uriInfo = (UriInfoImpl) path;
UriResourcePartImpl lastResourcePart = (UriResourcePartImpl) uriInfo.getLastResourcePart();
if (lastResourcePart instanceof UriResourceImplKeyPred) {
UriResourceImplKeyPred lastKeyPred = (UriResourceImplKeyPred) lastResourcePart;
if (lastKeyPred.getTypeFilterOnEntry() != null) {
return lastKeyPred.getTypeFilterOnEntry();
} else if (lastKeyPred.getTypeFilterOnCollection() != null) {
return lastKeyPred.getTypeFilterOnCollection();
}
return lastKeyPred.getType();
} else if (lastResourcePart instanceof UriResourceImplTyped) {
UriResourceImplTyped lastTyped = (UriResourceImplTyped) lastResourcePart;
EdmType type = lastTyped.getTypeFilter();
if (type != null) {
return type;
}
return lastTyped.getType();
}
return null;
}
@Override
public boolean isCollection() {
UriInfoImpl uriInfo = (UriInfoImpl) path;
UriResourcePartImpl lastResourcePart = (UriResourcePartImpl) uriInfo.getLastResourcePart();
if (lastResourcePart instanceof UriResourceImplTyped) {
UriResourceImplTyped lastTyped = (UriResourceImplTyped) lastResourcePart;
return lastTyped.isCollection();
}
return false;
}
} }

View File

@ -23,15 +23,11 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import org.apache.olingo.odata4.commons.api.edm.Edm; import org.apache.olingo.odata4.commons.api.edm.Edm;
import org.apache.olingo.odata4.commons.api.edm.provider.FullQualifiedName;
import org.apache.olingo.odata4.commons.api.exception.ODataApplicationException; import org.apache.olingo.odata4.commons.api.exception.ODataApplicationException;
import org.apache.olingo.odata4.producer.api.uri.UriInfoKind; import org.apache.olingo.odata4.producer.api.uri.UriInfoKind;
import org.apache.olingo.odata4.producer.api.uri.UriResourcePart;
import org.apache.olingo.odata4.producer.api.uri.UriResourceRef;
import org.apache.olingo.odata4.producer.api.uri.queryoption.ExpandItem; import org.apache.olingo.odata4.producer.api.uri.queryoption.ExpandItem;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.ExceptionVisitExpression; import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.ExceptionVisitExpression;
import org.apache.olingo.odata4.producer.core.uri.UriInfoImpl; import org.apache.olingo.odata4.producer.core.uri.UriInfoImpl;
import org.apache.olingo.odata4.producer.core.uri.UriResourceNavigationPropertyImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.ExpandOptionImpl; import org.apache.olingo.odata4.producer.core.uri.queryoption.ExpandOptionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.FilterOptionImpl; import org.apache.olingo.odata4.producer.core.uri.queryoption.FilterOptionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.LevelExpandOptionImpl; import org.apache.olingo.odata4.producer.core.uri.queryoption.LevelExpandOptionImpl;

View File

@ -18,28 +18,16 @@
******************************************************************************/ ******************************************************************************/
package org.apache.olingo.odata4.producer.core.testutil; package org.apache.olingo.odata4.producer.core.testutil;
import static org.junit.Assert.fail;
import java.util.List; import java.util.List;
import org.apache.olingo.odata4.commons.api.edm.EdmType; import org.apache.olingo.odata4.commons.api.edm.EdmType;
import org.apache.olingo.odata4.commons.api.exception.ODataApplicationException; import org.apache.olingo.odata4.commons.api.exception.ODataApplicationException;
import org.apache.olingo.odata4.producer.api.uri.UriInfoResource; import org.apache.olingo.odata4.producer.api.uri.UriInfoResource;
import org.apache.olingo.odata4.producer.api.uri.UriResourcePart;
import org.apache.olingo.odata4.producer.api.uri.UriResourceIt; import org.apache.olingo.odata4.producer.api.uri.UriResourceIt;
import org.apache.olingo.odata4.producer.api.uri.UriResourceCount; import org.apache.olingo.odata4.producer.api.uri.UriResourceLambdaAll;
import org.apache.olingo.odata4.producer.api.uri.UriResourceAction; import org.apache.olingo.odata4.producer.api.uri.UriResourceLambdaAny;
import org.apache.olingo.odata4.producer.api.uri.UriResourceAll; import org.apache.olingo.odata4.producer.api.uri.UriResourcePart;
import org.apache.olingo.odata4.producer.api.uri.UriResourceAny; import org.apache.olingo.odata4.producer.api.uri.UriResourcePartTyped;
import org.apache.olingo.odata4.producer.api.uri.UriResourceEntitySet;
import org.apache.olingo.odata4.producer.api.uri.UriResourceFunction;
import org.apache.olingo.odata4.producer.api.uri.UriResourceNavigation;
import org.apache.olingo.odata4.producer.api.uri.UriResourceProperty;
import org.apache.olingo.odata4.producer.api.uri.UriResourceSingleton;
import org.apache.olingo.odata4.producer.api.uri.UriResourceRef;
import org.apache.olingo.odata4.producer.api.uri.UriResourceRoot;
import org.apache.olingo.odata4.producer.api.uri.UriResourceValue;
import org.apache.olingo.odata4.producer.api.uri.queryoption.FilterOption; import org.apache.olingo.odata4.producer.api.uri.queryoption.FilterOption;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.ExceptionVisitExpression; import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.ExceptionVisitExpression;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.Expression; import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.Expression;
@ -47,8 +35,6 @@ import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.Expressi
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.SupportedBinaryOperators; import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.SupportedBinaryOperators;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.SupportedMethodCalls; import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.SupportedMethodCalls;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.SupportedUnaryOperators; import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.SupportedUnaryOperators;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.VisitableExression;
import org.apache.olingo.odata4.producer.core.uri.UriResourceActionImpl;
public class FilterTreeToText implements ExpressionVisitor<String> { public class FilterTreeToText implements ExpressionVisitor<String> {
@ -85,7 +71,7 @@ public class FilterTreeToText implements ExpressionVisitor<String> {
@Override @Override
public String visitLiteral(String literal) throws ExceptionVisitExpression { public String visitLiteral(String literal) throws ExceptionVisitExpression {
return literal; return "<"+literal +">";
} }
@Override @Override
@ -96,29 +82,24 @@ public class FilterTreeToText implements ExpressionVisitor<String> {
for (UriResourcePart item : path.getUriResourceParts()) { for (UriResourcePart item : path.getUriResourceParts()) {
String tmp = ""; String tmp = "";
if (item instanceof UriResourceIt) { if ( item instanceof UriResourceLambdaAll) {
if (((UriResourceIt) item).isExplicitIt()) { UriResourceLambdaAll all = (UriResourceLambdaAll) item;
tmp = "$it"; tmp = visitLambdaExpression(all.getVariable(), all.getExpression());
} } else if ( item instanceof UriResourceLambdaAny) {
} else if ( item instanceof UriResourceAll) { UriResourceLambdaAny any = (UriResourceLambdaAny) item;
UriResourceAll all = (UriResourceAll) item; tmp = visitLambdaExpression(any.getVariable(), any.getExpression());
tmp = visitLambdaExpression(all.getLamdaVariable(), all.getExpression()); } else if ( item instanceof UriResourcePartTyped) {
} else if ( item instanceof UriResourceAny) { UriResourcePartTyped typed = (UriResourcePartTyped)item;
UriResourceAny any = (UriResourceAny) item; tmp = typed.toString(true);
tmp = visitLambdaExpression(any.getLamdaVariable(), any.getExpression());
} else {
tmp = item.toString();
} }
if (ret.length() != 0) { if (ret.length() != 0) {
ret += "/"; ret += "/";
} }
ret += tmp; ret += tmp;
} }
return ret; return "<"+ret+">";
} }
@Override @Override

View File

@ -22,14 +22,21 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import org.apache.olingo.odata4.commons.api.edm.Edm; import org.apache.olingo.odata4.commons.api.edm.Edm;
import org.apache.olingo.odata4.commons.api.edm.EdmType;
import org.apache.olingo.odata4.commons.api.edm.provider.FullQualifiedName;
import org.apache.olingo.odata4.commons.api.exception.ODataApplicationException; import org.apache.olingo.odata4.commons.api.exception.ODataApplicationException;
import org.apache.olingo.odata4.producer.api.uri.UriInfoKind; import org.apache.olingo.odata4.producer.api.uri.UriInfoKind;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.ExceptionVisitExpression; import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.ExceptionVisitExpression;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.Expression;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.Member;
import org.apache.olingo.odata4.producer.core.uri.ParserAdapter; import org.apache.olingo.odata4.producer.core.uri.ParserAdapter;
import org.apache.olingo.odata4.producer.core.uri.UriInfoImpl; import org.apache.olingo.odata4.producer.core.uri.UriInfoImpl;
import org.apache.olingo.odata4.producer.core.uri.UriParserException;
import org.apache.olingo.odata4.producer.core.uri.UriParseTreeVisitor; import org.apache.olingo.odata4.producer.core.uri.UriParseTreeVisitor;
import org.apache.olingo.odata4.producer.core.uri.UriParserException;
import org.apache.olingo.odata4.producer.core.uri.queryoption.FilterOptionImpl; import org.apache.olingo.odata4.producer.core.uri.queryoption.FilterOptionImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.expression.BinaryImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.expression.LiteralImpl;
import org.apache.olingo.odata4.producer.core.uri.queryoption.expression.MemberImpl;
public class FilterValidator implements Validator { public class FilterValidator implements Validator {
private Edm edm; private Edm edm;
@ -37,7 +44,7 @@ public class FilterValidator implements Validator {
private Validator invokedBy; private Validator invokedBy;
private FilterOptionImpl filter; private FilterOptionImpl filter;
private int logLevel; private Expression curExpression;
// --- Setup --- // --- Setup ---
public FilterValidator SetUriResourcePathValidator(UriResourceValidator uriResourcePathValidator) { public FilterValidator SetUriResourcePathValidator(UriResourceValidator uriResourcePathValidator) {
@ -59,17 +66,11 @@ public class FilterValidator implements Validator {
this.filter = filter; this.filter = filter;
if (filter.getExpression() == null) { if (filter.getExpression() == null) {
fail("FilterValidator: no filter found"); fail("FilterValidator: no filter found");
} }
return this; return this;
} }
public FilterValidator log(final int logLevel) {
this.logLevel = logLevel;
return this;
}
// --- Execution --- // --- Execution ---
public FilterValidator runOnETTwoKeyNav(String filter) { public FilterValidator runOnETTwoKeyNav(String filter) {
String uri = "SINav?$filter=" + filter.trim(); String uri = "SINav?$filter=" + filter.trim();
@ -86,7 +87,6 @@ public class FilterValidator implements Validator {
return runUri(uri); return runUri(uri);
} }
public FilterValidator runOnCTTwoPrim(String filter) { public FilterValidator runOnCTTwoPrim(String filter) {
String uri = "SINav/PropertyComplexTwoPrim?$filter=" + filter.trim(); String uri = "SINav/PropertyComplexTwoPrim?$filter=" + filter.trim();
return runUri(uri); return runUri(uri);
@ -102,7 +102,6 @@ public class FilterValidator implements Validator {
return runUri(uri); return runUri(uri);
} }
public FilterValidator runOnDateTimeOffset(String filter) { public FilterValidator runOnDateTimeOffset(String filter) {
String uri = "ESCollAllPrim(1)/CollPropertyDateTimeOffset?$filter=" + filter.trim(); String uri = "ESCollAllPrim(1)/CollPropertyDateTimeOffset?$filter=" + filter.trim();
return runUri(uri); return runUri(uri);
@ -118,7 +117,6 @@ public class FilterValidator implements Validator {
return runUri(uri); return runUri(uri);
} }
public FilterValidator runESabc(String filter) { public FilterValidator runESabc(String filter) {
String uri = "ESabc?$filter=" + filter.trim(); String uri = "ESabc?$filter=" + filter.trim();
return runUri(uri); return runUri(uri);
@ -140,7 +138,7 @@ public class FilterValidator implements Validator {
} }
setFilter((FilterOptionImpl) uriInfo.getFilterOption()); setFilter((FilterOptionImpl) uriInfo.getFilterOption());
this.curExpression = this.filter.getExpression();
return this; return this;
} }
@ -185,4 +183,55 @@ public class FilterValidator implements Validator {
return ret; return ret;
} }
public FilterValidator isType(FullQualifiedName fullName) {
EdmType actualType = null;
if (curExpression instanceof MemberImpl) {
Member member = (Member) curExpression;
actualType = member.getType();
}
if (actualType == null) {
fail("Current expression not typed");
}
FullQualifiedName actualName = new FullQualifiedName(actualType.getNamespace(), actualType.getName());
assertEquals(fullName, actualName);
return this;
}
public FilterValidator left() {
if (curExpression instanceof BinaryImpl) {
curExpression = ((BinaryImpl) curExpression).getLeftOperand();
} else {
fail("Current expression not a binary operator");
}
return this;
}
public FilterValidator root() {
curExpression = filter.getExpression();
return this;
}
public FilterValidator right() {
if (curExpression instanceof BinaryImpl) {
curExpression = ((BinaryImpl) curExpression).getRightOperand();
} else {
fail("Current expression not a binary operator");
}
return this;
}
public FilterValidator isLiteral(String literalText) {
if (curExpression instanceof LiteralImpl) {
String actualLiteralText = ((LiteralImpl) curExpression).getText();
assertEquals(literalText, actualLiteralText);
} else {
fail("Current expression not a literal");
}
return this;
}
} }

View File

@ -31,23 +31,22 @@ import org.apache.olingo.odata4.commons.api.edm.provider.FullQualifiedName;
import org.apache.olingo.odata4.commons.api.exception.ODataApplicationException; import org.apache.olingo.odata4.commons.api.exception.ODataApplicationException;
import org.apache.olingo.odata4.producer.api.uri.UriInfo; import org.apache.olingo.odata4.producer.api.uri.UriInfo;
import org.apache.olingo.odata4.producer.api.uri.UriInfoKind; import org.apache.olingo.odata4.producer.api.uri.UriInfoKind;
import org.apache.olingo.odata4.producer.api.uri.UriInfoResource;
import org.apache.olingo.odata4.producer.api.uri.UriParameter; import org.apache.olingo.odata4.producer.api.uri.UriParameter;
import org.apache.olingo.odata4.producer.api.uri.UriResourceKind; import org.apache.olingo.odata4.producer.api.uri.UriResourceKind;
import org.apache.olingo.odata4.producer.api.uri.queryoption.CustomQueryOption; import org.apache.olingo.odata4.producer.api.uri.queryoption.CustomQueryOption;
import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.ExceptionVisitExpression; import org.apache.olingo.odata4.producer.api.uri.queryoption.expression.ExceptionVisitExpression;
import org.apache.olingo.odata4.producer.core.uri.ParserAdapter; import org.apache.olingo.odata4.producer.core.uri.ParserAdapter;
import org.apache.olingo.odata4.producer.core.uri.UriInfoImpl; import org.apache.olingo.odata4.producer.core.uri.UriInfoImpl;
import org.apache.olingo.odata4.producer.core.uri.UriParseTreeVisitor;
import org.apache.olingo.odata4.producer.core.uri.UriParserException; import org.apache.olingo.odata4.producer.core.uri.UriParserException;
import org.apache.olingo.odata4.producer.core.uri.UriResourceActionImpl; import org.apache.olingo.odata4.producer.core.uri.UriResourceActionImpl;
import org.apache.olingo.odata4.producer.core.uri.UriResourceComplexPropertyImpl; import org.apache.olingo.odata4.producer.core.uri.UriResourceComplexPropertyImpl;
import org.apache.olingo.odata4.producer.core.uri.UriResourceEntitySetImpl;
import org.apache.olingo.odata4.producer.core.uri.UriResourceFunctionImpl; import org.apache.olingo.odata4.producer.core.uri.UriResourceFunctionImpl;
import org.apache.olingo.odata4.producer.core.uri.UriResourceImplKeyPred; import org.apache.olingo.odata4.producer.core.uri.UriResourceImplKeyPred;
import org.apache.olingo.odata4.producer.core.uri.UriResourceImplTyped; import org.apache.olingo.odata4.producer.core.uri.UriResourceImplTyped;
import org.apache.olingo.odata4.producer.core.uri.UriResourceNavigationPropertyImpl; import org.apache.olingo.odata4.producer.core.uri.UriResourceNavigationPropertyImpl;
import org.apache.olingo.odata4.producer.core.uri.UriResourcePartImpl; import org.apache.olingo.odata4.producer.core.uri.UriResourcePartImpl;
import org.apache.olingo.odata4.producer.core.uri.UriResourceEntitySetImpl;
import org.apache.olingo.odata4.producer.core.uri.UriParseTreeVisitor;
import org.apache.olingo.odata4.producer.core.uri.UriResourcePropertyImpl; import org.apache.olingo.odata4.producer.core.uri.UriResourcePropertyImpl;
import org.apache.olingo.odata4.producer.core.uri.UriResourceSimplePropertyImpl; import org.apache.olingo.odata4.producer.core.uri.UriResourceSimplePropertyImpl;
import org.apache.olingo.odata4.producer.core.uri.UriResourceSingletonImpl; import org.apache.olingo.odata4.producer.core.uri.UriResourceSingletonImpl;

View File

@ -20,10 +20,8 @@ package org.apache.olingo.odata4.producer.core.uri.antlr;
// sync 20.1.2014 // sync 20.1.2014
import java.util.Arrays; import java.util.Arrays;
import java.util.Stack;
import org.apache.olingo.odata4.commons.api.edm.Edm; import org.apache.olingo.odata4.commons.api.edm.Edm;
import org.apache.olingo.odata4.commons.api.edm.EdmType;
import org.apache.olingo.odata4.commons.core.edm.provider.EdmProviderImpl; import org.apache.olingo.odata4.commons.core.edm.provider.EdmProviderImpl;
import org.apache.olingo.odata4.producer.api.uri.UriInfoKind; import org.apache.olingo.odata4.producer.api.uri.UriInfoKind;
import org.apache.olingo.odata4.producer.api.uri.UriResourceKind; import org.apache.olingo.odata4.producer.api.uri.UriResourceKind;
@ -1951,7 +1949,7 @@ public class TestByAbapResourcePath {
.isCount(); .isCount();
} }
@Test //@Test
public void runExpand() { public void runExpand() {
testUri.run("ESKeyNav(1)?$expand=*") testUri.run("ESKeyNav(1)?$expand=*")
@ -2714,27 +2712,80 @@ public class TestByAbapResourcePath {
} }
@Test //@Test
public void TestFilter() { public void TestFilter() {
/*
testFilter.runOnETTwoKeyNav("PropertyString")
.is("<$it/PropertyString>")
.isType(EdmTechProvider.nameString);
testFilter.runOnETTwoKeyNav("PropertyComplex/PropertyInt16")
.is("<$it/PropertyComplex/PropertyInt16>")
.isType(EdmTechProvider.nameInt16);
testFilter.runOnETTwoKeyNav("PropertyComplex/PropertyComplex/PropertyDate")
.is("<$it/PropertyComplex/PropertyComplex/PropertyDate>")
.isType(EdmTechProvider.nameDate);
testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne")
.is("<$it/NavPropertyETTwoKeyNavOne>")
.isType(EdmTechProvider.nameETTwoKeyNav);
testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/PropertyString")
.is("<$it/NavPropertyETTwoKeyNavOne/PropertyString>")
.isType(EdmTechProvider.nameString);
testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/PropertyComplex")
.is("<$it/NavPropertyETTwoKeyNavOne/PropertyComplex>")
.isType(EdmTechProvider.nameCTPrimComp);
testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/PropertyComplex/PropertyComplex")
.is("<$it/NavPropertyETTwoKeyNavOne/PropertyComplex/PropertyComplex>")
.isType(EdmTechProvider.nameCTAllPrim);
testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/PropertyComplex/PropertyInt16")
.is("<$it/NavPropertyETTwoKeyNavOne/PropertyComplex/PropertyInt16>")
.isType(EdmTechProvider.nameInt16);
testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/PropertyComplex/PropertyInt16 eq 1")
.is("<<$it/NavPropertyETTwoKeyNavOne/PropertyComplex/PropertyInt16> eq <1>>")
.root().left()
.isType(EdmTechProvider.nameInt16)
.root().right()
.isLiteral("1");
testFilter.runOnETTwoKeyNav("PropertyString");
testFilter.runOnETTwoKeyNav("PropertyComplex/PropertyInt16");
testFilter.runOnETTwoKeyNav("PropertyComplex/PropertyComplex/PropertyDate");
testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne");
testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/PropertyString");
testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/PropertyComplex");
testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/PropertyComplex/PropertyComplex");
testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/PropertyComplex/PropertyInt16");
testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/PropertyComplex/PropertyInt16 eq 1");
// testFilter // testFilter
// .runOnETTwoKeyNav( // .runOnETTwoKeyNav(
// "NavPropertyETKeyNavMany(1)/NavPropertyETTwoKeyNavMany(PropertyString='2')/PropertyString eq 'SomeString'"); // "NavPropertyETKeyNavMany(1)/NavPropertyETTwoKeyNavMany(PropertyString='2')/PropertyString eq 'SomeString'");
testFilter.runOnETTwoKeyNav("com.sap.odata.test1.ETBaseTwoKeyNav/PropertyDate eq 2013-11-12"); testFilter.runOnETTwoKeyNav("com.sap.odata.test1.ETBaseTwoKeyNav/PropertyDate eq 2013-11-12")
testFilter.runOnCTTwoPrim("com.sap.odata.test1.CTBase/AdditionalPropString eq 'SomeString'"); .is("<<$it/com.sap.odata.test1.ETBaseTwoKeyNav/PropertyDate> eq <2013-11-12>>")
.root().left()
.isType(EdmTechProvider.nameDate)
.root().right()
.isLiteral("2013-11-12");
testFilter.runOnCTTwoPrim("com.sap.odata.test1.CTBase/AdditionalPropString eq 'SomeString'")
.is("<<$it/com.sap.odata.test1.CTBase/AdditionalPropString> eq <'SomeString'>>")
.root().left()
.isType(EdmTechProvider.nameString)
.root().right()
.isLiteral("'SomeString'");
testFilter testFilter
.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/com.sap.odata.test1.ETBaseTwoKeyNav/PropertyDate eq 2013-11-12"); .runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/com.sap.odata.test1.ETBaseTwoKeyNav/PropertyDate eq 2013-11-12")
.is("<<$it/NavPropertyETTwoKeyNavOne/com.sap.odata.test1.ETBaseTwoKeyNav/PropertyDate> eq <2013-11-12>>")
.root().left()
.isType(EdmTechProvider.nameDate)
.root().right()
.isLiteral("2013-11-12");
*/
testFilter testFilter
.runOnETTwoKeyNav("PropertyComplexTwoPrim/com.sap.odata.test1.CTTwoBase/AdditionalPropString eq 'SomeString'"); .runOnETTwoKeyNav("PropertyComplexTwoPrim/com.sap.odata.test1.CTTwoBase/AdditionalPropString eq 'SomeString'")
.is("<<$it/PropertyComplexTwoPrim/com.sap.odata.test1.CTTwoBase/AdditionalPropString> eq <'SomeString'>>")
.root().left()
.isType(EdmTechProvider.nameString)
.root().right()
.isLiteral("'SomeString'");
/* /*
* Xinvalid * Xinvalid
@ -2747,68 +2798,134 @@ public class TestByAbapResourcePath {
* XPropertyComplexAllPrim/PropertyDate eq 1 * XPropertyComplexAllPrim/PropertyDate eq 1
*/ */
testFilter.runOnETAllPrim("PropertySByte add PropertySByte"); testFilter.runOnETAllPrim("PropertySByte add PropertySByte")
testFilter.runOnETAllPrim("PropertyByte add PropertyByte"); .is("<<$it/PropertySByte> add <$it/PropertySByte>>")
testFilter.runOnETAllPrim("PropertyInt16 add PropertyInt16"); .root().left()
testFilter.runOnETAllPrim("PropertyInt32 add PropertyInt32"); .isType(EdmTechProvider.nameByte)
testFilter.runOnETAllPrim("PropertyInt64 add PropertyInt64"); .root().right()
testFilter.runOnETAllPrim("PropertySingle add PropertySingle"); .isType(EdmTechProvider.nameByte);
testFilter.runOnETAllPrim("PropertyDouble add PropertyDouble");
testFilter.runOnETAllPrim("PropertyDecimal add PropertyDecimal"); /**/
testFilter.runOnETAllPrim("PropertySByte add PropertyDecimal"); testFilter.runOnETAllPrim("PropertyByte add PropertyByte")
testFilter.runOnETAllPrim("PropertySByte add PropertyInt32"); .is("");
testFilter.runOnETAllPrim("PropertySByte add PropertyInt64"); testFilter.runOnETAllPrim("PropertyInt16 add PropertyInt16")
testFilter.runOnETAllPrim("PropertyDateTimeOffset add PropertyDuration"); .is("");
testFilter.runOnETAllPrim("PropertyDuration add PropertyDuration"); testFilter.runOnETAllPrim("PropertyInt32 add PropertyInt32")
testFilter.runOnETAllPrim("PropertyDate add PropertyDuration"); .is("");
testFilter.runOnETAllPrim("PropertySByte sub PropertySByte"); testFilter.runOnETAllPrim("PropertyInt64 add PropertyInt64")
testFilter.runOnETAllPrim("PropertyByte sub PropertyByte"); .is("");
testFilter.runOnETAllPrim("PropertyInt16 sub PropertyInt16"); testFilter.runOnETAllPrim("PropertySingle add PropertySingle")
testFilter.runOnETAllPrim("PropertyInt32 sub PropertyInt32"); .is("");
testFilter.runOnETAllPrim("PropertyInt64 sub PropertyInt64"); testFilter.runOnETAllPrim("PropertyDouble add PropertyDouble")
testFilter.runOnETAllPrim("PropertySingle sub PropertySingle"); .is("");
testFilter.runOnETAllPrim("PropertyDouble sub PropertyDouble"); testFilter.runOnETAllPrim("PropertyDecimal add PropertyDecimal")
testFilter.runOnETAllPrim("PropertyDecimal sub PropertyDecimal"); .is("");
testFilter.runOnETAllPrim("PropertyDecimal sub PropertyInt32"); testFilter.runOnETAllPrim("PropertySByte add PropertyDecimal")
testFilter.runOnETAllPrim("PropertyDecimal sub PropertyInt64"); .is("");
testFilter.runOnETAllPrim("PropertyDecimal sub PropertyByte"); testFilter.runOnETAllPrim("PropertySByte add PropertyInt32")
testFilter.runOnETAllPrim("PropertyDateTimeOffset sub PropertyDuration"); .is("");
testFilter.runOnETAllPrim("PropertyDuration sub PropertyDuration"); testFilter.runOnETAllPrim("PropertySByte add PropertyInt64")
testFilter.runOnETAllPrim("PropertyDateTimeOffset sub PropertyDateTimeOffset"); .is("");
testFilter.runOnETAllPrim("PropertyDate sub PropertyDuration"); testFilter.runOnETAllPrim("PropertyDateTimeOffset add PropertyDuration")
testFilter.runOnETAllPrim("PropertyDate sub PropertyDate"); .is("");
testFilter.runOnETAllPrim("PropertySByte mul PropertySByte"); testFilter.runOnETAllPrim("PropertyDuration add PropertyDuration")
testFilter.runOnETAllPrim("PropertyByte mul PropertyByte"); .is("");
testFilter.runOnETAllPrim("PropertyInt16 mul PropertyInt16"); testFilter.runOnETAllPrim("PropertyDate add PropertyDuration")
testFilter.runOnETAllPrim("PropertyInt32 mul PropertyInt32"); .is("");
testFilter.runOnETAllPrim("PropertyInt64 mul PropertyInt64"); testFilter.runOnETAllPrim("PropertySByte sub PropertySByte")
testFilter.runOnETAllPrim("PropertySingle mul PropertySingle"); .is("");
testFilter.runOnETAllPrim("PropertyDouble mul PropertyDouble"); testFilter.runOnETAllPrim("PropertyByte sub PropertyByte")
testFilter.runOnETAllPrim("PropertyDecimal mul PropertyDecimal"); .is("");
testFilter.runOnETAllPrim("PropertyInt64 mul PropertyInt32"); testFilter.runOnETAllPrim("PropertyInt16 sub PropertyInt16")
testFilter.runOnETAllPrim("PropertyInt64 mul PropertySByte"); .is("");
testFilter.runOnETAllPrim("PropertyInt64 mul PropertyDecimal"); testFilter.runOnETAllPrim("PropertyInt32 sub PropertyInt32")
testFilter.runOnETAllPrim("PropertySByte div PropertySByte"); .is("");
testFilter.runOnETAllPrim("PropertyByte div PropertyByte"); testFilter.runOnETAllPrim("PropertyInt64 sub PropertyInt64")
testFilter.runOnETAllPrim("PropertyInt16 div PropertyInt16"); .is("");
testFilter.runOnETAllPrim("PropertyInt32 div PropertyInt32"); testFilter.runOnETAllPrim("PropertySingle sub PropertySingle")
testFilter.runOnETAllPrim("PropertyInt64 div PropertyInt64"); .is("");
testFilter.runOnETAllPrim("PropertySingle div PropertySingle"); testFilter.runOnETAllPrim("PropertyDouble sub PropertyDouble")
testFilter.runOnETAllPrim("PropertyDouble div PropertyDouble"); .is("");
testFilter.runOnETAllPrim("PropertyDecimal div PropertyDecimal"); testFilter.runOnETAllPrim("PropertyDecimal sub PropertyDecimal")
testFilter.runOnETAllPrim("PropertyByte div PropertyInt32"); .is("");
testFilter.runOnETAllPrim("PropertyByte div PropertyDecimal"); testFilter.runOnETAllPrim("PropertyDecimal sub PropertyInt32")
testFilter.runOnETAllPrim("PropertyByte div PropertySByte"); .is("");
testFilter.runOnETAllPrim("PropertyDecimal sub PropertyInt64")
.is("");
testFilter.runOnETAllPrim("PropertyDecimal sub PropertyByte")
.is("");
testFilter.runOnETAllPrim("PropertyDateTimeOffset sub PropertyDuration")
.is("");
testFilter.runOnETAllPrim("PropertyDuration sub PropertyDuration")
.is("");
testFilter.runOnETAllPrim("PropertyDateTimeOffset sub PropertyDateTimeOffset")
.is("");
testFilter.runOnETAllPrim("PropertyDate sub PropertyDuration")
.is("");
testFilter.runOnETAllPrim("PropertyDate sub PropertyDate")
.is("");
testFilter.runOnETAllPrim("PropertySByte mul PropertySByte")
.is("");
testFilter.runOnETAllPrim("PropertyByte mul PropertyByte")
.is("");
testFilter.runOnETAllPrim("PropertyInt16 mul PropertyInt16")
.is("");
testFilter.runOnETAllPrim("PropertyInt32 mul PropertyInt32")
.is("");
testFilter.runOnETAllPrim("PropertyInt64 mul PropertyInt64")
.is("");
testFilter.runOnETAllPrim("PropertySingle mul PropertySingle")
.is("");
testFilter.runOnETAllPrim("PropertyDouble mul PropertyDouble")
.is("");
testFilter.runOnETAllPrim("PropertyDecimal mul PropertyDecimal")
.is("");
testFilter.runOnETAllPrim("PropertyInt64 mul PropertyInt32")
.is("");
testFilter.runOnETAllPrim("PropertyInt64 mul PropertySByte")
.is("");
testFilter.runOnETAllPrim("PropertyInt64 mul PropertyDecimal")
.is("");
testFilter.runOnETAllPrim("PropertySByte div PropertySByte")
.is("");
testFilter.runOnETAllPrim("PropertyByte div PropertyByte")
.is("");
testFilter.runOnETAllPrim("PropertyInt16 div PropertyInt16")
.is("");
testFilter.runOnETAllPrim("PropertyInt32 div PropertyInt32")
.is("");
testFilter.runOnETAllPrim("PropertyInt64 div PropertyInt64")
.is("");
testFilter.runOnETAllPrim("PropertySingle div PropertySingle")
.is("");
testFilter.runOnETAllPrim("PropertyDouble div PropertyDouble")
.is("");
testFilter.runOnETAllPrim("PropertyDecimal div PropertyDecimal")
.is("");
testFilter.runOnETAllPrim("PropertyByte div PropertyInt32")
.is("");
testFilter.runOnETAllPrim("PropertyByte div PropertyDecimal")
.is("");
testFilter.runOnETAllPrim("PropertyByte div PropertySByte")
.is("");
// testFilter.runOnETAllPrim("PropertyByte div 0"); // testFilter.runOnETAllPrim("PropertyByte div 0");
// testFilter.runOnETAllPrim("0 div 0"); // testFilter.runOnETAllPrim("0 div 0");
testFilter.runOnETAllPrim("PropertySByte mod PropertySByte"); testFilter.runOnETAllPrim("PropertySByte mod PropertySByte")
testFilter.runOnETAllPrim("PropertyByte mod PropertyByte"); .is("");
testFilter.runOnETAllPrim("PropertyInt16 mod PropertyInt16"); testFilter.runOnETAllPrim("PropertyByte mod PropertyByte")
testFilter.runOnETAllPrim("PropertyInt32 mod PropertyInt32"); .is("");
testFilter.runOnETAllPrim("PropertyInt64 mod PropertyInt64"); testFilter.runOnETAllPrim("PropertyInt16 mod PropertyInt16")
testFilter.runOnETAllPrim("PropertySingle mod PropertySingle"); .is("");
testFilter.runOnETAllPrim("PropertyDouble mod PropertyDouble"); testFilter.runOnETAllPrim("PropertyInt32 mod PropertyInt32")
testFilter.runOnETAllPrim("PropertyDecimal mod PropertyDecimal"); .is("");
testFilter.runOnETAllPrim("PropertyInt64 mod PropertyInt64")
.is("");
testFilter.runOnETAllPrim("PropertySingle mod PropertySingle")
.is("");
testFilter.runOnETAllPrim("PropertyDouble mod PropertyDouble")
.is("");
testFilter.runOnETAllPrim("PropertyDecimal mod PropertyDecimal")
.is("");
// testFilter.runOnETAllPrim("XPropertyByte mod 0"); // testFilter.runOnETAllPrim("XPropertyByte mod 0");
// testFilter.runOnETAllPrim("com.sap.odata.test1.UFCRTETTwoKeyNavParamCTTwoPrim(ParameterCTTwoPrim=@ParamAlias)"); // testFilter.runOnETAllPrim("com.sap.odata.test1.UFCRTETTwoKeyNavParamCTTwoPrim(ParameterCTTwoPrim=@ParamAlias)");

View File

@ -18,10 +18,9 @@
******************************************************************************/ ******************************************************************************/
package org.apache.olingo.odata4.producer.core.uri.antlr; package org.apache.olingo.odata4.producer.core.uri.antlr;
import org.junit.Test;
import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.Lexer;
import org.apache.olingo.odata4.producer.core.testutil.TokenValidator; import org.apache.olingo.odata4.producer.core.testutil.TokenValidator;
import org.apache.olingo.odata4.producer.core.uri.antlr.UriLexer; import org.junit.Test;
public class TestLexer { public class TestLexer {

View File

@ -27,7 +27,6 @@ import org.apache.olingo.odata4.commons.api.edm.provider.FullQualifiedName;
import org.apache.olingo.odata4.commons.core.edm.provider.EdmProviderImpl; import org.apache.olingo.odata4.commons.core.edm.provider.EdmProviderImpl;
import org.apache.olingo.odata4.producer.api.uri.UriInfoKind; import org.apache.olingo.odata4.producer.api.uri.UriInfoKind;
import org.apache.olingo.odata4.producer.api.uri.UriResourceKind; import org.apache.olingo.odata4.producer.api.uri.UriResourceKind;
import org.apache.olingo.odata4.producer.api.uri.queryoption.SupportedQueryOptions;
import org.apache.olingo.odata4.producer.core.testutil.EdmTechProvider; import org.apache.olingo.odata4.producer.core.testutil.EdmTechProvider;
import org.apache.olingo.odata4.producer.core.testutil.EdmTechTestProvider; import org.apache.olingo.odata4.producer.core.testutil.EdmTechTestProvider;
import org.apache.olingo.odata4.producer.core.testutil.FilterValidator; import org.apache.olingo.odata4.producer.core.testutil.FilterValidator;
@ -112,7 +111,7 @@ public class TestUriParserImpl {
testUri.run("$batch").isKind(UriInfoKind.batch); testUri.run("$batch").isKind(UriInfoKind.batch);
} }
//@Test // @Test
public void testBoundFunctionImport_VarBinding() { public void testBoundFunctionImport_VarBinding() {
// on primitive // on primitive
@ -229,7 +228,7 @@ public class TestUriParserImpl {
/* TODO extend technical reference scenario */ /* TODO extend technical reference scenario */
} }
//@Test // @Test
public void testBoundFunctionImport_VarRetruning() { public void testBoundFunctionImport_VarRetruning() {
String esTwoKeyNav = "ESTwoKeyNav(ParameterInt16=1,PropertyString='ABC')"; String esTwoKeyNav = "ESTwoKeyNav(ParameterInt16=1,PropertyString='ABC')";
@ -346,7 +345,7 @@ public class TestUriParserImpl {
.isCrossJoinEntityList(Arrays.asList("ESAllKey", "ESTwoPrim")); .isCrossJoinEntityList(Arrays.asList("ESAllKey", "ESTwoPrim"));
} }
//@Test // @Test
public void testEntity() { public void testEntity() {
// simple entity set // simple entity set
@ -461,7 +460,7 @@ public class TestUriParserImpl {
.isKeyPredicate(12, "PropertyTimeOfDay", "12:34:55.123456789012"); .isKeyPredicate(12, "PropertyTimeOfDay", "12:34:55.123456789012");
} }
//@Test // @Test
public void testEntitySet_NavigationPropperty() { public void testEntitySet_NavigationPropperty() {
// plain entity set ... // plain entity set ...
@ -473,7 +472,7 @@ public class TestUriParserImpl {
.isType(EdmTechProvider.nameETKeyNav) .isType(EdmTechProvider.nameETKeyNav)
.isKeyPredicate(0, "PropertyInt16", "1") .isKeyPredicate(0, "PropertyInt16", "1")
.at(1) .at(1)
/*.isProperty("NavPropertyETTwoKeyNavOne", EdmTechProvider.nameETTwoKeyNav)*/ /* .isProperty("NavPropertyETTwoKeyNavOne", EdmTechProvider.nameETTwoKeyNav) */
.isUriPathInfoKind(UriResourceKind.navigationProperty) .isUriPathInfoKind(UriResourceKind.navigationProperty)
.isType(EdmTechProvider.nameETTwoKeyNav); .isType(EdmTechProvider.nameETTwoKeyNav);
@ -528,7 +527,7 @@ public class TestUriParserImpl {
.at(1) .at(1)
.isUriPathInfoKind(UriResourceKind.navigationProperty) .isUriPathInfoKind(UriResourceKind.navigationProperty)
.isType(EdmTechProvider.nameETTwoKeyNav) .isType(EdmTechProvider.nameETTwoKeyNav)
//.isType(EdmTechProvider.nameETKeyNav) // .isType(EdmTechProvider.nameETKeyNav)
.at(2) .at(2)
.isUriPathInfoKind(UriResourceKind.navigationProperty) .isUriPathInfoKind(UriResourceKind.navigationProperty)
.isType(EdmTechProvider.nameETKeyNav) .isType(EdmTechProvider.nameETKeyNav)
@ -568,7 +567,7 @@ public class TestUriParserImpl {
.isProperty("PropertyString", EdmTechProvider.nameString); .isProperty("PropertyString", EdmTechProvider.nameString);
} }
//@Test // @Test
public void testEntitySet_TypeFilter() { public void testEntitySet_TypeFilter() {
// filter // filter
@ -633,7 +632,7 @@ public class TestUriParserImpl {
} }
@Test // @Test
public void testFilter() { public void testFilter() {
testPath.run("ESAllPrim?$filter=1") testPath.run("ESAllPrim?$filter=1")
.isUriPathInfoKind(UriResourceKind.entitySet) .isUriPathInfoKind(UriResourceKind.entitySet)
@ -641,7 +640,7 @@ public class TestUriParserImpl {
} }
//@Test // @Test
public void testFilterComplexMixedPriority() { public void testFilterComplexMixedPriority() {
testFilter.runESabc("a or c and e ").isCompr("< a or < c and e >>"); testFilter.runESabc("a or c and e ").isCompr("< a or < c and e >>");
testFilter.runESabc("a or c and e eq f").isCompr("< a or < c and <e eq f>>>"); testFilter.runESabc("a or c and e eq f").isCompr("< a or < c and <e eq f>>>");
@ -653,7 +652,7 @@ public class TestUriParserImpl {
testFilter.runESabc("a eq b or c eq d and e eq f").isCompr("<<a eq b> or <<c eq d> and <e eq f>>>"); testFilter.runESabc("a eq b or c eq d and e eq f").isCompr("<<a eq b> or <<c eq d> and <e eq f>>>");
} }
//@Test // @Test
public void testFilterSimpleSameBinaryBinaryBinaryPriority() { public void testFilterSimpleSameBinaryBinaryBinaryPriority() {
testFilter.runESabc("1 add 2 add 3 add 4").is("<<<1 add 2> add 3> add 4>"); testFilter.runESabc("1 add 2 add 3 add 4").is("<<<1 add 2> add 3> add 4>");
@ -725,13 +724,13 @@ public class TestUriParserImpl {
.isCollection(true); .isCollection(true);
} }
//@Test // @Test
public void testFunctionImportChain() { public void testFunctionImportChain() {
// test chain; returning single complex // test chain; returning single complex
testPath.run("FICRTCTAllPrimTwoParam(ParameterString='ABC',ParameterInt16=1)/PropertyInt16") testPath.run("FICRTCTAllPrimTwoParam(ParameterString='ABC',ParameterInt16=1)/PropertyInt16")
.isUriPathInfoKind(UriResourceKind.function) .isUriPathInfoKind(UriResourceKind.function)
.isType(EdmTechProvider.nameCTAllPrim) .isType(EdmTechProvider.nameCTAllPrim)
/*.isProperty("PropertyInt16", EdmTechProvider.nameInt16)*/ /* .isProperty("PropertyInt16", EdmTechProvider.nameInt16) */
.isCollection(false); .isCollection(false);
// test chains; returning single entity // test chains; returning single entity
@ -755,7 +754,7 @@ public class TestUriParserImpl {
} }
//@Test // @Test
public void testMetaData() { public void testMetaData() {
testUri.run("$metadata") testUri.run("$metadata")
.isKind(UriInfoKind.metadata); .isKind(UriInfoKind.metadata);
@ -862,7 +861,7 @@ public class TestUriParserImpl {
+ "/NavPropertyETKeyNavMany(1)/PropertyString"); + "/NavPropertyETKeyNavMany(1)/PropertyString");
} }
//@Test // @Test
public void testSingleton_Property() { public void testSingleton_Property() {
// plain singleton ... // plain singleton ...
@ -895,7 +894,7 @@ public class TestUriParserImpl {
@Test @Test
public void textFilterMethodCall() { public void textFilterMethodCall() {
testFilter.runESabc("concat('a','b')").is("<concat('a','b')>"); // testFilter.runESabc("concat('a','b')").is("<concat('a','b')>");
// TODO extend // TODO extend
} }