[
https://issues.apache.org/jira/browse/TINKERPOP-1356?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Daniel Kuppitz closed TINKERPOP-1356.
-------------------------------------
Resolution: Fixed
Assignee: Daniel Kuppitz
Fix Version/s: 3.2.3
This is no longer an issue in 3.2.3+. (perhaps we were already done with
{{has}} in 3.2.2, I only verified that current versions do work as expected).
> Several issues in HasContainer
> ------------------------------
>
> Key: TINKERPOP-1356
> URL: https://issues.apache.org/jira/browse/TINKERPOP-1356
> Project: TinkerPop
> Issue Type: Bug
> Components: process
> Affects Versions: 3.2.0-incubating, 3.1.2-incubating
> Reporter: Daniel Kuppitz
> Assignee: Daniel Kuppitz
> Fix For: 3.2.3
>
>
> {{HasContainer}} has some issues that are not covered by test cases, but IMO
> likely to happen in real world applications.
> Empty collections lead to uncaught exceptions with a meaningless error
> message:
> {noformat}
> gremlin> g = TinkerFactory.createModern().traversal()
> ==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
> gremlin> g.V().hasId(within(new ArrayList()))
> 0
> Display stack trace? [yN] N
> gremlin> g.V().hasId(without(new ArrayList()))
> 0
> Display stack trace? [yN]
> {noformat}
> In the constructor of {{HasContainer}} we should use:
> {code}
> ((Collection)
> this.predicate.getValue()).stream().findFirst().orElseGet(Object::new)
> {code}
> ...instead of:
> {code}
> ((Collection) this.predicate.getValue()).toArray()[0]
> {code}
> ..or anything else that doesn't assume that we will always have a first
> element.
> Furthermore {{enforceHomogenousCollectionIfPresent}} should check for empty
> collections:
> {code}
> ...
> final Collection collection = (Collection) predicateValue;
> if (!collection.isEmpty()) { // <--
> final Class<?> first = collection.toArray()[0].getClass();
> if (!((Collection)
> predicateValue).stream().map(Object::getClass).allMatch(c -> first.equals(c)))
> throw new IllegalArgumentException("Has comparisons on a collection
> of ids require ids to all be of the same type");
> }
> ...
> {code}
> And the last issue is this one (from the code snippet above):
> {{collection.toArray()\[0\].getClass()}}. What if the first (or any other)
> element is actually {{null}}? The check should be more like:
> {code}
> final Object obj = new Object();
> if (((Collection) predicateValue).stream().map(o ->
> Optional.ofNullable(o).orElse(obj).getClass()).distinct().count() != 1)
> throw ...
> {code}
> Or something smarter like that, as long as it has a {{null}}-check.
> The proposed code changes seem to work fine, except for
> {{hasId(within(<empty-collection>))}}, which emits all vertices instead of
> none.
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)