如何在ActivePivot中为日期创建层次结构维度?

时间:2013-01-30 12:36:42

标签: activepivot

我是ActivePivot中的新手,我想用DimensionType = time创建一个维度,其中日期以分层方式显示。例如。对于30.01.2013,我需要一年的一个级别 - > 2013(降序排序),月份的一个级别(也是降序排序) - > 1天和一天的水平(也排序下降) - > 30, 29, 28, ...

通过ActivePivotLive查看应如下所示:

- 2013
  - 1
    - 30
    - 29
    - 28
    - ...
+ 2012
+ 2011

等等。

我浏览了ActivePivot沙箱项目,但我找不到任何可以帮助我的东西。我在TimeBucket中找到的EquityDerivativesCube维度做了类似的事情,但是桶以不同的方式创建。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

好的,我把它处理掉了。 没有必要进行往返并实现维度。这可以通过levels和a calculator轻松完成 这里是EquityDerivativesCube.xml

的代码
<!-- Standard time buckets, bucketing performed at insertion -->
<dimension name="TimeBucket">
    <properties>
        <entry key="DimensionType" value="time" />
        <entry key="IsAllMembersEnabled" value="true" />
    </properties>           
    <level name="Year">
        <properties>
            <entry key="LevelType" value="TIME_YEARS" />
        </properties>
        <comparator pluginKey="ReverseOrder" />
    </level>
    <level name="Month">
        <properties>
            <entry key="LevelType" value="TIME_MONTHS" />
        </properties>
        <comparator pluginKey="Custom">
            <order name="firstObjects">
                <value>Jan</value>
                <value>Feb</value>
                <value>Mrz</value>
                <value>Apr</value>
                <value>Mai</value>
                <value>Jun</value>
                <value>Jul</value>
                <value>Aug</value>
                <value>Sep</value>
                <value>Okt</value>
                <value>Nov</value>
                <value>Dez</value>
            </order>
        </comparator>
    </level>
    <!-- The Value Date level is the field Date -->
    <level name="Value Date" property="Date">
        <properties>
            <entry key="LevelType" value="time" />
        </properties>
        <comparator pluginKey="ReverseOrder" />
    </level>
</dimension>


我将以下代码段添加到PNLCalculator.enrichTrade

...
            pnl = pnlVega + pnlDelta;
// Year and month calculations BEGIN

            final Calendar cal = CALENDAR.get();
            cal.setTime(trade.getDate());
            final int year = cal.get(Calendar.YEAR);
            final String month = DateFormatSymbols.getInstance(GERMANY).getShortMonths()[cal.get(MONTH)];
// Year and month calculations END

            // instantiate the result that will hold the enrichment data
            final PNLCalculatorResult result = new PNLCalculatorResult();
...

// add them to the result
            result.setYear(year);
            result.setMonth(month);
...

我还使用两个新字段扩展了SanboxFields.xml

...
    <field name="Year"              type="integer" />
    <field name="Month"             type="string" />
...

干杯!

答案 1 :(得分:0)

ActivePivot Sandbox应用程序中的TimeBucket维度根据财务时间段定义自定义分组。创建标准年份&gt;月份&gt;在ActivePivot中,日层次结构实际上更简单,更无缝。在描述中,如果模式需要声明三个字段(一个用于年份,一个用于月份,一个用于当天)。

<field name="Year" indexation="dictionary" />
<field name="Month" indexation="dictionary" />
<field name="Day" indexation="dictionary" />

然后你需要声明一个引用这些字段的维度。

<dimension name="Time">
    <level name="Year" />
    <level name="Month" />
    <level name="Day" />
</dimension>

然后,ActivePivot将通过内省加载的记录来逐步构建时间层次结构。

如果输入记录(对象)已经包含Year属性,Month属性和Day属性(例如,如果输入记录是带有getYear(),getMonth()和getDay()方法的POJO,那么这将自动运行。如果不是这种情况,例如输入记录只有一个日期属性,你可以在将它们放入ActivePivot之前转换你的记录,或者在ActivePivot中注入一个计算器( com.quartetfs.biz.pivot.classification .ICalculator )将动态计算日期中的三个字段。请查看ActivePivot Sandbox应用程序以获取计算器示例。

通常使用标准Java代码来提取这些字段:

    Date date = new Date();
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);

    System.out.println("Date: "  + date);
    System.out.println("Year: "  + calendar.get(Calendar.YEAR));
    System.out.println("Month: " + calendar.get(Calendar.MONTH) + 1);
    System.out.println("Day: "   + calendar.get(Calendar.DAY_OF_MONTH));

关于维度级别中成员的排序,ActivePivot默认使用java对象的自然顺序(实现java.lang.Comparable接口的那些),因此日期和整数将从最低到最高排序。你可以通过在目标级别声明一个“ReverseOrder”比较器来轻松地反转它。

<dimension name="Time">
    <level name="Year">
        <comparator pluginKey="ReverseOrder" />
    </level>
    <level name="Month">
        <comparator pluginKey="ReverseOrder" />
    </level>
    <level name="Day">
        <comparator pluginKey="ReverseOrder" />
    </level>
</dimension>