2222
2323import org .apache .commons .lang3 .exception .ExceptionUtils ;
2424import org .apache .log4j .Logger ;
25+ import org .hibernate .SQLQuery ;
2526import org .hibernate .Session ;
2627import org .json .JSONArray ;
2728import org .json .JSONException ;
@@ -698,6 +699,7 @@ private static KpiValueExecLog computeKpi(ParsedKpi parsedKpi, List<AggregateMea
698699 KpiValueExecLog result = new KpiValueExecLog ();
699700 Session session = HibernateSessionManager .getCurrentSession ();
700701 ISQLDialect dialect = SQLDialectFactory .getSQLDialect (session );
702+ List <Map <String , Number >> rowsMeasureValues = new ArrayList <>();
701703
702704 try {
703705 logger .info (DateFormat .getInstance ().format (new Date ()) + " Processing Kpi Job..." );
@@ -722,9 +724,13 @@ private static KpiValueExecLog computeKpi(ParsedKpi parsedKpi, List<AggregateMea
722724 }
723725 // sb.append("[" + field.getValue() + "]");
724726 }
727+ Map <String , Number > mv = new HashMap <>();
728+ mv .put ("M" + mainMeasure , measureValue );
729+ rowsMeasureValues .add (mv );
730+
725731 // we are casting measures as float values because formulas are not working on Oracle and Postgres the
726732 // same way, for example: 1283 / 48204 is returning 0.0266... on Oracle and 0 on Postgres
727- String rowFormula = parsedKpi .formula . replaceFirst ( "M" + mainMeasure + "([^ \\ d].*)*$" , dialect . getCastingToFloatFormula ( measureValue ) + "$1" ) ;
733+ String rowFormula = parsedKpi .formula ;
728734 rowsFormulae .add (rowFormula );
729735 rowsAttributesValues .add (rowAttributesValues );
730736 // sb.append("###");
@@ -760,6 +766,7 @@ private static KpiValueExecLog computeKpi(ParsedKpi parsedKpi, List<AggregateMea
760766 row = qr .iterator .next ();
761767 }
762768 }
769+ rowsMeasureValues .get (r ).put ("M" + m , measureValue );
763770 String rowFormula = rowsFormulae .get (r );
764771 // we are casting measures as float values because formulas are not working on Oracle and Postgres the
765772 // same way, for example: 1283 / 48204 is returning 0.0266... on Oracle and 0 on Postgres
@@ -821,8 +828,22 @@ private static KpiValueExecLog computeKpi(ParsedKpi parsedKpi, List<AggregateMea
821828 Object theMonth = ifNull (temporalValues .get ("MONTH" ), CARDINALITY_ALL );
822829 Object theQuarter = ifNull (temporalValues .get ("QUARTER" ), CARDINALITY_ALL );
823830 Object theYear = ifNull (temporalValues .get ("YEAR" ), CARDINALITY_ALL );
824- String insertSql = "INSERT INTO SBI_KPI_VALUE (id, kpi_id, kpi_version, logical_key, time_run, computed_value,"
825- + " the_day, the_week, the_month, the_quarter, the_year, state) VALUES (?, ?, ?, ?" + ",?, coalesce(? , ?) ,?,?,?,?,?,?)" ;
831+
832+ String evalSql = "SELECT COALESCE((" + parsedKpi .formula .replaceAll ("\\ bM(\\ d+)\\ b" , ":M$1" ) + "), 0) AS V FROM dual" ;
833+ SQLQuery q = session .createSQLQuery (evalSql );
834+
835+ for (int m = 0 ; m < parsedKpi .measures .size (); m ++) {
836+ Number mvVal = rowsMeasureValues .get (r ).get ("M" + m );
837+ q .setParameter ("M" + m , mvVal );
838+ }
839+
840+ Number computedValue = (Number ) q .uniqueResult ();
841+
842+
843+ String insertSql =
844+ "INSERT INTO SBI_KPI_VALUE (id, kpi_id, kpi_version, logical_key, time_run, computed_value,"
845+ + " the_day, the_week, the_month, the_quarter, the_year, state) "
846+ + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" ;
826847 String whereCondition = "kpi_id = " + parsedKpi .id + " AND kpi_version = " + parsedKpi .version + " AND logical_key = '"
827848 + logicalKey .toString ().replaceAll ("'" , "''" ) + "'" + " AND the_day = '" + theDay + "' AND the_week = '" + theWeek + "'"
828849 + " AND the_month = '" + theMonth + "' AND the_quarter = '" + theQuarter + "' AND the_year = '" + theYear + "'" ;
@@ -835,17 +856,21 @@ private static KpiValueExecLog computeKpi(ParsedKpi parsedKpi, List<AggregateMea
835856
836857 logger .debug ("PERFORMING INSERT: " + insertSql );
837858
838- try {
839- session .createSQLQuery (insertSql ).setParameter (0 , ++lastId ).setParameter (1 , parsedKpi .id ).setParameter (2 , parsedKpi .version )
840- .setParameter (3 , logicalKey .toString ().replaceAll ("'" , "''" )).setParameter (4 , timeRun ).setParameter (5 , (nullValue ? "0" : value ))
841- .setParameter (6 , 0 ).setParameter (7 , theDay ).setParameter (8 , theWeek ).setParameter (9 , theMonth ).setParameter (10 , theQuarter ).setParameter (11 , theYear )
842- .setParameter (12 , (nullValue ? "1" : "0" )).executeUpdate ();
843- } catch (Exception ex ) {
844- session .createSQLQuery (insertSql ).setParameter (0 , ++lastId ).setParameter (1 , parsedKpi .id ).setParameter (2 , parsedKpi .version )
845- .setParameter (3 , logicalKey .toString ().replaceAll ("'" , "''" )).setParameter (4 , timeRun ).setParameter (5 , (nullValue ? "0" : value ))
846- .setParameter (6 , '0' ).setParameter (7 , theDay ).setParameter (8 , theWeek ).setParameter (9 , theMonth ).setParameter (10 , theQuarter ).setParameter (11 , theYear )
847- .setParameter (12 , (nullValue ? "1" : "0" )).executeUpdate ();
848- }
859+ session .createSQLQuery (insertSql )
860+ .setParameter (0 , ++lastId )
861+ .setParameter (1 , parsedKpi .id )
862+ .setParameter (2 , parsedKpi .version )
863+ .setParameter (3 , logicalKey .toString ().replaceAll ("'" , "''" ))
864+ .setParameter (4 , timeRun )
865+ .setParameter (5 , computedValue ) // numeric bind
866+ .setParameter (6 , theDay )
867+ .setParameter (7 , theWeek )
868+ .setParameter (8 , theMonth )
869+ .setParameter (9 , theQuarter )
870+ .setParameter (10 , theYear )
871+ .setParameter (11 , (nullValue ? "1" : "0" ))
872+ .executeUpdate ();
873+
849874 session .getTransaction ().commit ();
850875 }
851876
0 commit comments