[prev in list] [next in list] [prev in thread] [next in thread] 

List:       mondrian
Subject:    Re: [Mondrian] Re-implementing native TopCount
From:       Andrey Khayrutdinov <andrey.khayrutdinov () gmail ! com>
Date:       2015-09-22 16:45:24
Message-ID: CAFiMitOKWUKkbJC7GuaBbuOhGAxKEBpWcD05QnaLsLjb=e-qPA () mail ! gmail ! com
[Download RAW message or body]

[Attachment #2 (multipart/alternative)]


Did anyone have a chance to take a look at the changes?


Regards,
Andrey Khayrutdinov

2015-09-10 22:09 GMT+04:00 Andrey Khayrutdinov <
andrey.khayrutdinov@gmail.com>:

> Julian,
>
> I will highly appreciate to get your feedback.
>
>
> King regards,
> Andrey Khayrutdinov
>
> 2015-09-08 23:23 GMT+04:00 Andrey Khayrutdinov <
> andrey.khayrutdinov@gmail.com>:
>
>> Dear all,
>>
>> I've picked up MONDRIAN-1272
>> <http://jira.pentaho.com/browse/MONDRIAN-1272>. It is about shrinking
>> tuples having no corresponding data in the fact table.
>> The approach to avoid such behaviour is to use OUTER JOIN.
>>
>> The general routine is the following:
>>
>> Let current SQL query be called SUBSELECT_Q. It is created by combining
>> different levels and then linking them with a constraint through the fact
>> table. Let's call these combined levels CROSSJOIN_Q.
>> So we can execute this query:
>>
>> SELECT
>> FROM SUBSELECT_Q
>> RIGHT JOIN CROSSJOIN_Q
>>
>>
>> And this is the general schema.
>> Level should be combined not by linking via the fact table (that will
>> change nothing), but with CROSS JOIN operator.
>>
>> As an example, here is an MDX query:
>>
>> SELECT [Measures].[Unit Sales] on columns,
>> TopCount(Crossjoin([Product].[Product Category].Members,
>> [Customers].[City].Members), 10, [Measures].[Unit Sales]) on rows
>> FROM [Sales]
>> WHERE [Time].[1997].[Q3]
>>
>> and here is the monstrous SQL query, produced via the schema above:
>>
>> select
>>           crossj.`cj0` as `c0`,
>>           crossj.`cj1` as `c1`,
>>           crossj.`cj2` as `c2`,
>>           crossj.`cj3` as `c3`,
>>           crossj.`cj4` as `c4`,
>>           crossj.`cj5` as `c5`,
>>           subsel.`c6` as `c6`
>> from (
>>           select
>>                    `product_class`.`product_family` as `c0`,
>>                    `product_class`.`product_department` as `c1`,
>>                    `product_class`.`product_category` as `c2`,
>>                    `customer`.`country` as `c3`,
>>                    `customer`.`state_province` as `c4`,
>>                    `customer`.`city` as `c5`,
>>                    sum(`sales_fact_1997`.`unit_sales`) as `c6`
>>           from
>>                    `product` as `product`,
>>                    `product_class` as `product_class`,
>>                    `sales_fact_1997` as `sales_fact_1997`,
>>                    `customer` as `customer`,
>>                    `time_by_day` as `time_by_day`
>>           where
>>                    `product`.`product_class_id` =
>> `product_class`.`product_class_id` and
>>                    `sales_fact_1997`.`product_id` =
>> `product`.`product_id` and
>>                    `sales_fact_1997`.`customer_id` =
>> `customer`.`customer_id` and
>>                    `sales_fact_1997`.`time_id` = `time_by_day`.`time_id`
>> and
>>                    `time_by_day`.`the_year` = 1997 and
>>                    `time_by_day`.`quarter` = 'Q3'
>>           group by
>>                    `product_class`.`product_family`,
>>                    `product_class`.`product_department`,
>>                    `product_class`.`product_category`,
>>                    `customer`.`country`,
>>                    `customer`.`state_province`,
>>                    `customer`.`city`
>>           order by
>>                    sum(`sales_fact_1997`.`unit_sales`) DESC,
>>                    ISNULL(`product_class`.`product_family`) ASC,
>> `product_class`.`product_family` ASC,
>>                    ISNULL(`product_class`.`product_department`) ASC,
>> `product_class`.`product_department` ASC,
>>                    ISNULL(`product_class`.`product_category`) ASC,
>> `product_class`.`product_category` ASC,
>>                    ISNULL(`customer`.`country`) ASC, `customer`.`country`
>> ASC,
>>                    ISNULL(`customer`.`state_province`) ASC,
>> `customer`.`state_province` ASC,
>>                    ISNULL(`customer`.`city`) ASC, `customer`.`city` ASC
>> ) as `subsel`
>> right join (
>>           select
>>                    `t0`.`product_family` as `cj0` ,
>>                    `t0`.`product_department` as `cj1` ,
>>                    `t0`.`product_category` as `cj2` ,
>>                    `t1`.`country` as `cj3` ,
>>                    `t1`.`state_province` as `cj4` ,
>>                    `t1`.`city` as `cj5`
>>           from (
>>                    select
>>                              `product_class`.`product_family` as
>> `product_family`,
>>                              `product_class`.`product_department` as
>> `product_department`,
>>                              `product_class`.`product_category` as
>> `product_category`
>>                    from
>>                              `product` as `product`,
>>                              `product_class` as `product_class`
>>                    where
>>                              `product`.`product_class_id` =
>> `product_class`.`product_class_id`
>>                    group by
>>                              `product_class`.`product_family`,
>>                              `product_class`.`product_department`,
>>                              `product_class`.`product_category`
>>                    order by
>>                              ISNULL(`product_class`.`product_family`)
>> ASC, `product_class`.`product_family` ASC,
>>                              ISNULL(`product_class`.`product_department`)
>> ASC, `product_class`.`product_department` ASC,
>>                              ISNULL(`product_class`.`product_category`)
>> ASC, `product_class`.`product_category` ASC
>>           ) as t0
>>           cross join (
>>                    select
>>                              `customer`.`country` as `country`,
>>                              `customer`.`state_province` as
>> `state_province`,
>>                              `customer`.`city` as `city`
>>                    from
>>                              `customer` as `customer`
>>                    group by
>>                              `customer`.`country`,
>>                              `customer`.`state_province`,
>>                              `customer`.`city`
>>                    order by
>>                              ISNULL(`customer`.`country`) ASC,
>> `customer`.`country` ASC,
>>                              ISNULL(`customer`.`state_province`) ASC,
>> `customer`.`state_province` ASC,
>>                              ISNULL(`customer`.`city`) ASC,
>> `customer`.`city` ASC
>>           ) as t1
>> ) as `crossj` on
>>           (`subsel`.`c0` = `crossj`.`cj0`) and
>>           (`subsel`.`c1` = `crossj`.`cj1`) and
>>           (`subsel`.`c2` = `crossj`.`cj2`) and
>>           (`subsel`.`c3` = `crossj`.`cj3`) and
>>           (`subsel`.`c4` = `crossj`.`cj4`) and
>>           (`subsel`.`c5` = `crossj`.`cj5`)
>> order by
>>           subsel.`c6` DESC,
>>           ISNULL(crossj.`cj0`) ASC, crossj.`cj0` ASC,
>>           ISNULL(crossj.`cj1`) ASC, crossj.`cj1` ASC,
>>           ISNULL(crossj.`cj2`) ASC, crossj.`cj2` ASC,
>>           ISNULL(crossj.`cj3`) ASC, crossj.`cj3` ASC,
>>           ISNULL(crossj.`cj4`) ASC, crossj.`cj4` ASC,
>>           ISNULL(crossj.`cj5`) ASC, crossj.`cj5` ASC
>>
>> Unfortunately, Mondrian does not have many tools for manipulating with
>> SQL, thus I made my own.
>> I have completed the POC, it passes almost all prepared tests and before
>> starting polishing it I asked Matt C if he had any objection against the
>> approach. He told me to ask the community, and here I am with this thread.
>>
>> My current work was pushed here:
>> https://github.com/akhayrutdinov/mondrian/tree/NativeTopCount.
>> It consists of two commits:
>>
>>    1. Tests for TopCount:
>>    https://github.com/akhayrutdinov/mondrian/commit/3963fb37a7da8284bb5ed1ddb79825c6bf7018cf
>>    2. My changes:
>>    https://github.com/akhayrutdinov/mondrian/commit/2436bfbd6cca007f0f3fd866b8e61e7f4c2adb5c
>>
>> I want to ask your opinion whether the approach is acceptable not to
>> spend time for improving the code that will be rejected.
>>
>> Best regards,
>> Andrey Khayrutdinov
>>
>
>

[Attachment #5 (text/html)]

<div dir="ltr"><font face="trebuchet ms, sans-serif">Did anyone have a chance to take \
a look at the changes?<br></font><div class="gmail_extra"><font face="trebuchet ms, \
sans-serif"><br clear="all"></font><div><div><div><font face="trebuchet ms, \
sans-serif"><br></font></div><font face="trebuchet ms, \
sans-serif">Regards,</font><div><font face="trebuchet ms, sans-serif">Andrey \
Khayrutdinov</font></div></div></div> <br><div class="gmail_quote">2015-09-10 22:09 \
GMT+04:00 Andrey Khayrutdinov <span dir="ltr">&lt;<a \
href="mailto:andrey.khayrutdinov@gmail.com" \
target="_blank">andrey.khayrutdinov@gmail.com</a>&gt;</span>:<br><blockquote \
class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc \
solid;padding-left:1ex"><div dir="ltr"><font face="trebuchet ms, \
sans-serif">Julian,</font><div><font face="trebuchet ms, \
sans-serif"><br></font></div><div><font face="trebuchet ms, sans-serif">I will highly \
appreciate to get your feedback.</font></div></div><div class="gmail_extra"><br \
clear="all"><div><div><div><font face="trebuchet ms, \
sans-serif"><br></font></div><font face="trebuchet ms, sans-serif">King \
regards,</font><div><font face="trebuchet ms, sans-serif">Andrey \
Khayrutdinov</font></div></div></div><div><div> <br><div \
class="gmail_quote">2015-09-08 23:23 GMT+04:00 Andrey Khayrutdinov <span \
dir="ltr">&lt;<a href="mailto:andrey.khayrutdinov@gmail.com" \
target="_blank">andrey.khayrutdinov@gmail.com</a>&gt;</span>:<br><blockquote \
class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc \
solid;padding-left:1ex"><div dir="ltr"><font face="trebuchet ms, sans-serif" \
style="font-size:12.8px">Dear all,</font><div style="font-size:12.8px"><font \
face="trebuchet ms, sans-serif"><br></font></div><div style="font-size:12.8px"><font \
face="trebuchet ms, sans-serif">I&#39;ve picked up  <a \
href="http://jira.pentaho.com/browse/MONDRIAN-1272" \
target="_blank">MONDRIAN-1272</a>. It is about shrinking tuples having no \
corresponding data in the fact table.</font></div><div style="font-size:12.8px"><font \
face="trebuchet ms, sans-serif">The approach to avoid such behaviour is to use OUTER \
JOIN.</font></div><div style="font-size:12.8px"><font face="trebuchet ms, \
sans-serif"><br></font></div><div style="font-size:12.8px"><font face="trebuchet ms, \
sans-serif">The general routine is the following:</font></div><div \
style="font-size:12.8px"><font face="trebuchet ms, sans-serif"><br></font></div><div \
style="font-size:12.8px"><font face="trebuchet ms, sans-serif">Let current SQL query \
be called  </font><font face="monospace, monospace">SUBSELECT_Q</font><font \
face="trebuchet ms, sans-serif">. It is created by combining different levels and \
then linking them with a constraint through the fact table. Let&#39;s call these \
combined levels  </font><font face="monospace, monospace">CROSSJOIN_Q</font><font \
face="trebuchet ms, sans-serif">.</font></div><div style="font-size:12.8px"><font \
face="trebuchet ms, sans-serif">So we can execute this query:</font></div><div \
style="font-size:12.8px"><font face="trebuchet ms, \
sans-serif"><br></font></div><blockquote style="font-size:12.8px;margin:0px 0px 0px \
40px;border:none;padding:0px"><div><font face="monospace, monospace">SELECT  \
</font></div><div><font face="monospace, monospace">FROM \
SUBSELECT_Q</font></div><div><font face="monospace, monospace">RIGHT JOIN \
CROSSJOIN_Q</font></div></blockquote><div style="font-size:12.8px"><font \
face="trebuchet ms, sans-serif"><br></font></div><div style="font-size:12.8px"><font \
face="trebuchet ms, sans-serif">And this is the general schema.</font></div><div \
style="font-size:12.8px"><font face="trebuchet ms, sans-serif">Level should be \
combined not by linking via the fact table (that will change nothing), but with  \
</font><font face="monospace, monospace">CROSS JOIN</font><font face="trebuchet ms, \
sans-serif">  operator.</font></div><div style="font-size:12.8px"><font \
face="trebuchet ms, sans-serif"><br></font></div><div style="font-size:12.8px"><font \
face="trebuchet ms, sans-serif">As an example, here is an MDX query:</font></div><div \
style="font-size:12.8px"><font face="trebuchet ms, sans-serif"><br></font></div><div \
style="font-size:12.8px"><div style="color:rgb(33,33,33);font-family:&#39;Segoe \
UI&#39;,&#39;Segoe WP&#39;,&#39;Segoe UI \
WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px 0px 36pt"><font \
face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font face="Consolas" \
size="2" color="#2E2D2F"><span style="font-size:9pt">SELECT [Measures].[Unit Sales] \
on columns,</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="2" color="#2E2D2F"><span \
style="font-size:9pt">TopCount(Crossjoin([Product].[Product Category].Members, \
[Customers].[City].Members), 10, [Measures].[Unit Sales]) on \
rows</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="2" color="#2E2D2F"><span style="font-size:9pt">FROM \
[Sales]</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="2" color="#2E2D2F"><span style="font-size:9pt">WHERE \
[Time].[1997].[Q3]</span></font></span></font></div><div><div><font face="trebuchet \
ms, sans-serif"><br></font></div><div><font face="trebuchet ms, sans-serif">and here \
is the monstrous SQL query, produced via the schema above:</font></div><div><font \
face="trebuchet ms, sans-serif"><br></font></div><div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span \
style="font-size:7pt">select</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
crossj.`cj0` as `c0`,</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
crossj.`cj1` as `c1`,</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
crossj.`cj2` as `c2`,</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
crossj.`cj3` as `c3`,</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
crossj.`cj4` as `c4`,</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
crossj.`cj5` as `c5`,</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
subsel.`c6` as `c6`</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">from \
(</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
select</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
`product_class`.`product_family` as `c0`,</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
`product_class`.`product_department` as `c1`,</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
`product_class`.`product_category` as `c2`,</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
`customer`.`country` as `c3`,</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
`customer`.`state_province` as `c4`,</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
`customer`.`city` as `c5`,</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
sum(`sales_fact_1997`.`unit_sales`) as `c6`</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
from</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
`product` as `product`,</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
`product_class` as `product_class`,</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
`sales_fact_1997` as `sales_fact_1997`,</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
`customer` as `customer`,</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
`time_by_day` as `time_by_day`</span></font></span></font></div><div \
style="color:rgb(33,33,33);font-family:&#39;Segoe UI&#39;,&#39;Segoe \
WP&#39;,&#39;Segoe UI WPC&#39;,Tahoma,Arial,sans-serif;font-size:15px;margin:0px 0px \
0px 36pt"><font face="Calibri,sans-serif" size="2"><span style="font-size:11pt"><font \
face="Consolas" size="1" color="#2E2D2F"><span style="font-size:7pt">                 \
where</span></font></span></font></div><div \
</div>
</blockquote></div><br></div></div></div>
</blockquote></div><br></div></div>



_______________________________________________
Mondrian mailing list
Mondrian@pentaho.org
http://lists.pentaho.org/mailman/listinfo/mondrian


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic