[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"><<a \
href="mailto:andrey.khayrutdinov@gmail.com" \
target="_blank">andrey.khayrutdinov@gmail.com</a>></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"><<a href="mailto:andrey.khayrutdinov@gmail.com" \
target="_blank">andrey.khayrutdinov@gmail.com</a>></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'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'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:'Segoe \
UI','Segoe WP','Segoe UI \
WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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:'Segoe UI','Segoe \
WP','Segoe UI WPC',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