limits the result of a Member SQL query to the current evaluation context.
All Members of the current context are joined against the fact table and only
those rows are returned, that have an entry in the fact table.

For example, if you have two dimensions, "invoice" and "time", and the
current context (e.g. the slicer) contains a day from the "time" dimension,
then only the invoices of that day are found. Used to optimize NON EMPTY.

The TupleConstraint methods may silently ignore calculated
members (depends on the strict c'tor argument), so these may
return more members than the current context restricts to. The
MemberChildren methods will never accept calculated members as parents,
these will cause an exception.

isJoinRequired

Returns whether a join with the fact table is required. A join is
required if the context contains members from dimensions other than
level. If we are interested in the members of a level or a members
children then it does not make sense to join only one dimension (the one
that contains the requested members) with the fact table for NON EMPTY
optimization.

getMemberChildrenConstraint

When the members of a level are fetched, the result is grouped
by into parents and their children. These parent/children are
stored in the parent/children cache, whose key consists of the parent
and the MemberChildrenConstraint#hashKey(). So we need a matching
MemberChildrenConstraint to store the parent with its children into
the parent/children cache.

The returned MemberChildrenConstraint must be one that would have
returned the same children for the given parent as the MemberLevel query
has found for that parent.

If null is returned, the parent/children will not be cached (but the
level/members still will be).

getCacheKey

Returns a key that becomes part of the key for caching the
result of the SQL query. So SqlConstraint instances that
produce the same SQL resultset must return equal keys
in terms of equal() and hashCode().