Как сделать так, чтобы показатель постпроцессора не отображал данные, если не выбраны обязательные измерения?
Мы не хотим, чтобы постпроцессор выполнялся, когда не выбраны определенные обязательные измерения. Например, у нас есть измерения, которые называются тип риска, кривая чувствительности, срок погашения, валюта1 и валюта просмотра. У нас также есть мера постобработки Rate.Move, которая реализует doLeafEvaluation.
В нашем клиенте
- Если сенсорная кривая не выбрана, мы не хотим отображать Rate.Move, когда тип риска - RateRisk.
- Если currency1 не выбран, мы не хотим показывать Rate.Move, когда типом риска является BasisSwapRisk
1 ответ
Внутри постпроцессора есть только один способ обнаружить измерения и уровни, которые изначально выбрал пользователь (скорее всего, в запросе MDX): вы анализируете местоположение, оцененное постпроцессором.
Вот небольшой пример постпроцессора (он предназначен для запуска в приложении ActivePivot Sandbox). Постпроцессор определяет контекстное измерение, измерение времени в этом примере. Если пользователь расширил измерение времени, то оцененное местоположение будет иметь глубину не менее 2 (глубина 1 означает, что для этого измерения выбран только AllMember). Затем вы можете принять решение о возврате другой меры или расчета на основе этих знаний.
/*
* (C) Quartet FS 2010
* ALL RIGHTS RESERVED. This material is the CONFIDENTIAL and PROPRIETARY
* property of Quartet Financial Systems Limited. Any unauthorized use,
* reproduction or transfer of this material is strictly prohibited
*/
package com.quartetfs.pivot.sandbox.postprocessor.impl;
import java.util.Properties;
import com.quartetfs.biz.pivot.IActivePivot;
import com.quartetfs.biz.pivot.ILocation;
import com.quartetfs.biz.pivot.impl.Util;
import com.quartetfs.biz.pivot.postprocessing.impl.ABasicPostProcessor;
import com.quartetfs.fwk.QuartetException;
import com.quartetfs.fwk.QuartetExtendedPluginValue;
/**
*
* @author Quartet FS
*
*/
@QuartetExtendedPluginValue(
interfaceName = "com.quartetfs.biz.pivot.postprocessing.IPostProcessor",
key = ContextualPostProcessor.PLUGIN_TYPE
)
public class ContextualPostProcessor extends ABasicPostProcessor<Double> {
/** serialVersionUID */
private static final long serialVersionUID = 4484708084267009957L;
/** Plugin key */
static final String PLUGIN_TYPE = "CTX";
/** Ordinal of the time dimension */
protected int timeDimensionOrdinal = -1;
/** Constructor */
public ContextualPostProcessor(String name, IActivePivot pivot) {
super(name, pivot);
}
@Override
public String getType() { return PLUGIN_TYPE; }
@Override
public void init(Properties properties) throws QuartetException {
super.init(properties);
// Store the ordinal of the time dimension
timeDimensionOrdinal = Util.findDimension(pivot.getDimensions(), "TimeBucket");
}
@Override
protected Double doEvaluation(ILocation location, Object[] underlyingMeasures) throws QuartetException {
if(location.getLevelDepth(timeDimensionOrdinal - 1) > 1) {
return (Double) underlyingMeasures[0];
} else {
return (Double) underlyingMeasures[1];
}
}
}
Вот как вы можете объявить постпроцессор в описании куба:
<measure name="ctx" isIntrospectionMeasure="false">
<!-- This post processor dynamically buckets an underlying measure -->
<!-- It works together with a dynamic bucket dimension. -->
<postProcessor pluginKey="CTX">
<properties>
<entry key="id" value="SUM" />
<entry key="underlyingMeasures" value="pv.SUM,pnl.SUM" />
</properties>
</postProcessor>
</measure>