diff --git a/elide-core/src/main/java/com/yahoo/elide/core/filter/dialect/RSQLFilterDialect.java b/elide-core/src/main/java/com/yahoo/elide/core/filter/dialect/RSQLFilterDialect.java index c51ea0e2ac..32084eda5d 100644 --- a/elide-core/src/main/java/com/yahoo/elide/core/filter/dialect/RSQLFilterDialect.java +++ b/elide-core/src/main/java/com/yahoo/elide/core/filter/dialect/RSQLFilterDialect.java @@ -6,6 +6,7 @@ package com.yahoo.elide.core.filter.dialect; import static com.yahoo.elide.core.EntityDictionary.REGULAR_ID_NAME; +import static com.yahoo.elide.utils.TypeHelper.isPrimitiveNumberType; import com.yahoo.elide.core.EntityDictionary; import com.yahoo.elide.core.Path; @@ -299,7 +300,7 @@ public FilterExpression visit(ComparisonNode node, Class entityType) { //Coerce arguments to their correct types List values = arguments.stream() .map(argument -> - Number.class.isAssignableFrom(relationshipType) + isPrimitiveNumberType(relationshipType) || Number.class.isAssignableFrom(relationshipType) ? argument.replace("*", "") //Support filtering on number types : argument ) diff --git a/elide-core/src/main/java/com/yahoo/elide/utils/TypeHelper.java b/elide-core/src/main/java/com/yahoo/elide/utils/TypeHelper.java new file mode 100644 index 0000000000..478fa0f334 --- /dev/null +++ b/elide-core/src/main/java/com/yahoo/elide/utils/TypeHelper.java @@ -0,0 +1,29 @@ +/* + * Copyright 2019, Oath Inc. + * Licensed under the Apache License, Version 2.0 + * See LICENSE file in project root for terms. + */ + +package com.yahoo.elide.utils; + +import com.google.common.collect.Sets; + +import java.util.Set; + +/** + * Utilities for checking classes and primitive types. + */ +public class TypeHelper { + private static final Set> PRIMITIVE_NUMBER_TYPES = Sets + .newHashSet(short.class, int.class, long.class, float.class, double.class); + + /** + * Determine whether a type is primitive number type + * + * @param type type to check + * @return True is the type is primitive number type + */ + public static boolean isPrimitiveNumberType(Class type) { + return PRIMITIVE_NUMBER_TYPES.contains(type); + } +} diff --git a/elide-core/src/test/java/com/yahoo/elide/core/filter/dialect/RSQLFilterDialectTest.java b/elide-core/src/test/java/com/yahoo/elide/core/filter/dialect/RSQLFilterDialectTest.java index 859fa2b7d2..b7643d73c1 100644 --- a/elide-core/src/test/java/com/yahoo/elide/core/filter/dialect/RSQLFilterDialectTest.java +++ b/elide-core/src/test/java/com/yahoo/elide/core/filter/dialect/RSQLFilterDialectTest.java @@ -13,6 +13,7 @@ import example.Author; import example.Book; import example.Job; +import example.PrimitiveId; import example.StringId; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -38,6 +39,7 @@ public static void init() { dictionary.bindEntity(Book.class); dictionary.bindEntity(StringId.class); dictionary.bindEntity(Job.class); + dictionary.bindEntity(PrimitiveId.class); dialect = new RSQLFilterDialect(dictionary); } @@ -291,4 +293,20 @@ public void testFilterOnCustomizedStringIdField() throws ParseException { assertEquals("stringId.surrogateKey INFIX_CASE_INSENSITIVE [identifier]", expression.toString()); } + + @Test + public void testInfixFilterOnPrimitiveIdField() throws ParseException { + MultivaluedMap queryParams = new MultivaluedHashMap<>(); + + queryParams.add( + "filter", + "id==*1*" + ); + + FilterExpression expression = dialect.parseGlobalExpression("/primitiveTypeId", queryParams); + + assertEquals(expression.toString(), + "primitiveId.primitiveId INFIX_CASE_INSENSITIVE [1]" + ); + } } diff --git a/elide-core/src/test/java/example/PrimitiveId.java b/elide-core/src/test/java/example/PrimitiveId.java new file mode 100644 index 0000000000..a8a0a1c19d --- /dev/null +++ b/elide-core/src/test/java/example/PrimitiveId.java @@ -0,0 +1,22 @@ +/* + * Copyright 2015, Yahoo Inc. + * Licensed under the Apache License, Version 2.0 + * See LICENSE file in project root for terms. + */ +package example; + +import com.yahoo.elide.annotation.Include; +import lombok.Data; + +import javax.persistence.Entity; +import javax.persistence.Id; + + +@Include(rootLevel = true, type = "primitiveTypeId") +@Entity +@Data +public class PrimitiveId { + + @Id + private long primitiveId; +}