Hello,
I have a UDF to obtain a percentile (the default doesn't give the desired results):
Percentile2 is the function that obtain the result.
I have defined a calculated member as follows: Percentile2([Test performance].Children, [Measures].[Score],75)
The UDF is used as many times as results are required, so this query is executed the same number of times:
SqlMemberSource.getMemberChildren: executing sql [select `fact_tests`.`idTestsResults` as `c0` from `fact_tests` as `fact_tests` group by `fact_tests`.`idTestsResults` order by ISNULL(`fact_tests`.`idTestsResults`) ASC, `fact_tests`.`idTestsResults` ASC]
The performance would improve if the result of this query was reused.
It is possible?
I have a UDF to obtain a percentile (the default doesn't give the desired results):
Code:
public Object execute(Evaluator evaluator, Argument[] arguments) {
ArrayList<Double> memberArrayList = new ArrayList<>();
final List memberList = arguments[0].evaluateList(evaluator);
final Argument exp = arguments[1];
final Argument num = arguments[2];
final Double percentile = (Double) num.evaluateScalar(evaluator);
for (int i = 0; i < memberList.size(); i++) {
Member member = (Member) memberList.get(i);
evaluator.setContext(member);
final Double number = (Double) exp.evaluateScalar(evaluator);
if (number != null) {
memberArrayList.add(number);
}
}
if (memberArrayList.isEmpty()) {
return null;
} else {
return percentile2(memberArrayList,percentile);
}
}
I have defined a calculated member as follows: Percentile2([Test performance].Children, [Measures].[Score],75)
The UDF is used as many times as results are required, so this query is executed the same number of times:
SqlMemberSource.getMemberChildren: executing sql [select `fact_tests`.`idTestsResults` as `c0` from `fact_tests` as `fact_tests` group by `fact_tests`.`idTestsResults` order by ISNULL(`fact_tests`.`idTestsResults`) ASC, `fact_tests`.`idTestsResults` ASC]
The performance would improve if the result of this query was reused.
It is possible?