Skip to content

Commit 3ac8d92

Browse files
committed
possible fix for KPI
1 parent d624187 commit 3ac8d92

1 file changed

Lines changed: 39 additions & 14 deletions

File tree

knowagedao/src/main/java/it/eng/spagobi/kpi/job/ProcessKpiJob.java

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import org.apache.commons.lang3.exception.ExceptionUtils;
2424
import org.apache.log4j.Logger;
25+
import org.hibernate.SQLQuery;
2526
import org.hibernate.Session;
2627
import org.json.JSONArray;
2728
import 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

Comments
 (0)