我是ActivePivot的新手,我想用DimensionType = time创建一个维度,其中日期是以分层方式显示的。
通过ActivePivotLive查看应如下所示:
- 2013
- 1
- 30
- 29
- 28
- ...
+ 2012
+ 2011诸若此类。
我浏览了ActivePivot沙箱项目,但我没有找到任何对我有帮助的东西。我在EquityDerivativesCube中找到的TimeBucket维度做了一些类似的事情,但存储桶是以不同的方式创建的。
我该如何解决这个问题?
发布于 2013-01-31 17:48:59
ActivePivot沙盒应用程序中的TimeBucket维度定义了一个基于财务时段的自定义分组。在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沙盒应用程序中的计算器示例。
提取这些字段通常是使用标准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>发布于 2013-01-31 19:47:52
好的,我来处理。不需要进行往返,也不需要实现维度。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" />
...干杯!
https://stackoverflow.com/questions/14604176
复制相似问题