Quantcast
Channel: Pentaho Community Forums
Viewing all articles
Browse latest Browse all 16689

Avoid to repeat the same SQL query (reuse) in UDF

$
0
0
Hello,

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);
        }
    }

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?

Viewing all articles
Browse latest Browse all 16689

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>