public final NotJoined notJoinedFrom(ChainedProperty<S> joinProperty) {
        if (!Storable.class.isAssignableFrom(joinProperty.getType())) {
            throw new IllegalArgumentException
                ("Join property type is not a Storable: " + joinProperty);
        }
        return notJoinedFromAny(joinProperty);
    }
public final NotJoined notJoinedFrom ( ChainedProperty < S > joinProperty ) { if ( ! Storable . class . isAssignableFrom ( joinProperty . getType ( ) ) ) { throw new IllegalArgumentException ( "Join property type is not a Storable: " + joinProperty ) ; } return notJoinedFromAny ( joinProperty ) ; }
Removes a join property prefix from all applicable properties of this
filter. For example, consider two Storable types, Person and
Address. Person has a property "homeAddress" which joins to Address. A
Person filter might be "homeAddress.city = ? & lastName = ?". When not
joined from "homeAddress", it becomes "city = ?" on Address with a
remainder of "lastName = ?" on Person.

<p>The resulting remainder filter (if any) is always logically and'd to
the not joined filter. In order to achieve this, the original filter is
first converted to conjunctive normal form. And as a side affect, both
the remainder and not joined filters are {@link #bind bound}.

@param joinProperty property to not join from
@return not join result
@throws IllegalArgumentException if property does not refer to a Storable