public <Y> CollectionJoin<X, Y> join(CollectionAttribute<? super X, Y> collection, JoinType jt) {
org.eclipse.persistence.expressions.Expression node;
Class clazz = collection.getBindableJavaType();
CollectionJoin<X, Y> join = null;
if (jt.equals(JoinType.INNER)) {
node = this.currentNode.anyOf(collection.getName());
} else if (jt.equals(JoinType.RIGHT)) {
throw new UnsupportedOperationException(ExceptionLocalization.buildMessage("RIGHT_JOIN_NOT_SUPPORTED"));
} else {
node = this.currentNode.anyOfAllowingNone(collection.getName());
}
if (collection.getElementType().getPersistenceType().equals(PersistenceType.BASIC)) {
join = new BasicCollectionJoinImpl<X, Y>(this, this.metamodel, clazz, node, (Bindable) collection, jt);
} else {
join = new CollectionJoinImpl<X, Y>(this, metamodel.managedType(clazz), this.metamodel, clazz, node, (Bindable) collection, jt);
}
this.joins.add(join);
((FromImpl)join).isJoin = true;
return join;
}