[Mondrian] non empty eval when calc members change context
Tom Barber(Alabs)
tom at analytical-labs.com
Mon Dec 8 16:55:31 EST 2014
Hey,
This looks suspiciously like a bug that a Saiku user got me to look at
and validate.
I haven't dug into it but one observation I did make was that the same
query executed on Mondrian 4 was returning the correct results when
Mondrian 3 wasn't. So make of that what you will, or don't.
Cheers
Tom
On 08/12/14 21:41, Matt Campbell wrote:
>
> Hey all,
>
> I’ve been investigating a particularly bad bug (MONDRIAN-2022) which
> involves tuples being suppressed incorrectly. It can be demonstrated
> easily:
>
> WITH member measures.[overrideContext] as '( measures.[unit sales],
> Time.[*1997*].Q1 )’
>
> SELECT measures.[overrideContext] on 0,
>
> NON EMPTY crossjoin( Time.[*1998*].Q1, [marital status].[marital
> status].members) on 1
>
> FROM sales
>
> This query will return no tuples, even though it should have a NON
> EMPTY value for the measure for each tuple on the rows axis. There’s
> no data in 1998.Q1, but that shouldn’t matter since the measure
> changes the context to 1997.Q1. This is a contrived example, but the
> problem can show up less obviously with things like YTD() calculations.
>
> There are actually 2 separate problems, applicable to both Mondrian 3x
> and 4x. First, the crossjoin optimizer logic (in
> CrossJoinFunDef.nonEmptyList) will pull out the base measures from any
> calculated members and use those when determining the nonEmptyList.
> Unfortunately, for queries like the one above, this ignores the fact
> that the calculated member will change the context of evaluation to be
> [1997].Q1, overriding the [1998].Q1 context. The second problem is
> similar, but involves native evaluation logic. Disabling both the cj
> optimizer and native eval will cause the query to return correct results.
>
> I had originally been thinking we could fix the issue with the
> crossjoin optimizer by having the calculated measures themselves
> pushed into context and evaluated when determining whether there is
> data present. I.e. don’t collect the base measures nested in the
> calculations and add them to the measureSet, grab the calculations
> themselves. This works in the simple case, but fails in cases where
> evaluation of the measure requires evaluation of the CJ set itself.
>
> As an alternative, I’ve been trying out an algorithm which extracts
> both the base measures /and/ any hierarchy members referenced in
> calculations. This list of members can then be used to determine
> which hierarchies should be set to the [All] member when checking for
> non-emptiness. For example, with the MDX above the algorithm would
> extract Time.[1997].Q1, and then when doing a checkData(), we’d set
> context to be Time.[All].
>
> I’m going to continue testing with this approach but thought I’d see
> if people have any feedback or suggestions.
>
> Thanks!
>
> Matt
>
>
>
> _______________________________________________
> Mondrian mailing list
> Mondrian at pentaho.org
> http://lists.pentaho.org/mailman/listinfo/mondrian
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.pentaho.org/pipermail/mondrian/attachments/20141208/7ebac82c/attachment.html
More information about the Mondrian
mailing list