首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ActivePivot中创建日期的分层维度?

如何在ActivePivot中创建日期的分层维度?
EN

Stack Overflow用户
提问于 2013-01-30 20:36:42
回答 2查看 298关注 0票数 1

我是ActivePivot的新手,我想用DimensionType = time创建一个维度,其中日期是以分层方式显示的。

通过ActivePivotLive查看应如下所示:

代码语言:javascript
复制
- 2013
  - 1
    - 30
    - 29
    - 28
    - ...
+ 2012
+ 2011

诸若此类。

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

我该如何解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-31 17:48:59

ActivePivot沙盒应用程序中的TimeBucket维度定义了一个基于财务时段的自定义分组。在ActivePivot中,创建标准的年、月、日层次结构实际上更简单、更无缝。在模式描述中,您需要声明三个字段(一个用于年份,一个用于月份,一个用于日期)。

代码语言:javascript
复制
<field name="Year" indexation="dictionary" />
<field name="Month" indexation="dictionary" />
<field name="Day" indexation="dictionary" />

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

代码语言:javascript
复制
<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沙盒应用程序中的计算器示例。

提取这些字段通常是使用标准Java代码完成的:

代码语言:javascript
复制
    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“比较器,可以很容易地反转这一点。

代码语言:javascript
复制
<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>
票数 0
EN

Stack Overflow用户

发布于 2013-01-31 19:47:52

好的,我来处理。不需要进行往返,也不需要实现维度。levels和a calculator很容易做到这一点。

下面是来自EquityDerivativesCube.xml的代码

代码语言:javascript
复制
<!-- 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

代码语言:javascript
复制
...
            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

代码语言:javascript
复制
...
    <field name="Year"              type="integer" />
    <field name="Month"             type="string" />
...

干杯!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14604176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档