From f4bfddd6f207cce6e2f16db9efa5f2fbc5067378 Mon Sep 17 00:00:00 2001 From: lucashimpens Date: Fri, 26 Jul 2024 15:58:13 +0200 Subject: [PATCH 1/2] feat(tagstatistics): add endpoint to get statistics by environment and countries --- .../CampaignExecutionPrivateController.java | 76 ++++-- .../core/crud/dao/ITagStatisticDAO.java | 3 + .../core/crud/dao/impl/TagStatisticDAO.java | 77 ++++++ .../crud/service/ITagStatisticService.java | 7 +- .../service/impl/TagStatisticService.java | 219 ++++++++++++------ 5 files changed, 290 insertions(+), 92 deletions(-) diff --git a/source/src/main/java/org/cerberus/core/apiprivate/CampaignExecutionPrivateController.java b/source/src/main/java/org/cerberus/core/apiprivate/CampaignExecutionPrivateController.java index c52cc3668..1245e2a77 100644 --- a/source/src/main/java/org/cerberus/core/apiprivate/CampaignExecutionPrivateController.java +++ b/source/src/main/java/org/cerberus/core/apiprivate/CampaignExecutionPrivateController.java @@ -37,7 +37,6 @@ import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.BadRequestException; import java.text.SimpleDateFormat; import java.util.*; import org.cerberus.core.crud.service.ITagService; @@ -58,11 +57,11 @@ public class CampaignExecutionPrivateController { @GetMapping(path = "/statistics", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity getTagStatistics( HttpServletRequest request, - @RequestParam(name = "systemsFilter", required = false) String[] systemsParam, - @RequestParam(name = "applicationsFilter", required = false) String[] applicationsParam, - @RequestParam(name = "group1Filter", required = false) String[] group1Param, - @RequestParam(name = "from", required = false) String fromParam, - @RequestParam(name = "to", required = false) String toParam + @RequestParam(name = "systems") String[] systemsParam, + @RequestParam(name = "applications") String[] applicationsParam, + @RequestParam(name = "group1") String[] group1Param, + @RequestParam(name = "from") String fromParam, + @RequestParam(name = "to") String toParam ) { //Retrieve and format URL parameter fromParam = ParameterParserUtil.parseStringParamAndDecode(fromParam, new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S'Z'").format(new Date()), "UTF8"); @@ -79,11 +78,15 @@ public ResponseEntity getTagStatistics( try { systemsAllowed = tagStatisticService.getSystemsAllowedForUser(request.getUserPrincipal().getName()); - applicationsAllowed = tagStatisticService.getApplicationsSystems(systemsAllowed); - } catch (CerberusException e) { - throw new BadRequestException(); + } catch (CerberusException exception) { + LOG.error("Unable to get allowed systems: ", exception); + return ResponseEntity + .status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Unable to get allowed systems: " + exception.getMessage()); } + applicationsAllowed = tagStatisticService.getApplicationsSystems(systemsAllowed); + if (systems.isEmpty() && applications.isEmpty()) { tagStatistics = new ArrayList<>(); } else { @@ -94,8 +97,8 @@ public ResponseEntity getTagStatistics( } try { - Map> aggregateByTag = tagStatisticService.createMapAggregateByTag(tagStatistics); - Map aggregateByCampaign = tagStatisticService.createMapAggregateByCampaign(aggregateByTag); + Map> aggregateByTag = tagStatisticService.createMapGroupedByTag(tagStatistics, "CAMPAIGN"); + Map aggregateByCampaign = tagStatisticService.createMapAggregatedStatistics(aggregateByTag, "CAMPAIGN"); List aggregateListByCampaign = new ArrayList<>(); aggregateByCampaign.forEach((key, value) -> { if (!Objects.equals(key, "globalGroup1List")) { @@ -106,11 +109,58 @@ public ResponseEntity getTagStatistics( response.put("campaignStatistics", aggregateListByCampaign); return ResponseEntity.ok(response.toString()); } catch (JSONException ex) { - LOG.error("Internal server error: ", ex); + LOG.error("Error when JSON processing: ", ex); return ResponseEntity .status(HttpStatus.INTERNAL_SERVER_ERROR) - .body("Internal server error: " + ex.getMessage()); + .body("Error when JSON processing: " + ex.getMessage()); + } + } + + @GetMapping(path = "/statistics/{campaign}", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity getCampaignStatisticsByCountryEnv( + HttpServletRequest request, + @PathVariable("campaign") String campaign, + @RequestParam(name = "countries", required = false) String[] countriesParam, + @RequestParam(name = "environments", required = false) String[] environmentsParam, + @RequestParam(name = "from") String fromParam, + @RequestParam(name = "to") String toParam + ) throws JSONException { + fromParam = ParameterParserUtil.parseStringParamAndDecode(fromParam, new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S'Z'").format(new Date()), "UTF8"); + toParam = ParameterParserUtil.parseStringParamAndDecode(toParam, new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S'Z'").format(new Date()), "UTF8"); + List countries = ParameterParserUtil.parseListParamAndDecode(countriesParam, new ArrayList<>(), "UTF8"); + List environments = ParameterParserUtil.parseListParamAndDecode(environmentsParam, new ArrayList<>(), "UTF8"); + String fromDateFormatted = tagStatisticService.formatDateForDb(fromParam); + String toDateFormatted = tagStatisticService.formatDateForDb(toParam); + List tagStatistics; + JSONObject response = new JSONObject(); + + tagStatistics = tagStatisticService.readByCriteria(campaign, countries, environments, fromDateFormatted, toDateFormatted).getDataList(); + + boolean userHasRightSystems = tagStatisticService.userHasRightSystems(request.getUserPrincipal().getName(), tagStatistics); + if (!userHasRightSystems) { + response.put("message", "User has no access to required systems."); + return ResponseEntity + .status(HttpStatus.FORBIDDEN) + .body(response.toString()); } + + Map> aggregateByTag = tagStatisticService.createMapGroupedByTag(tagStatistics, "ENV_COUNTRY"); + Map aggregateByCampaign = tagStatisticService.createMapAggregatedStatistics(aggregateByTag, "ENV_COUNTRY"); + List aggregateListByCampaign = new ArrayList<>(); + countries.clear(); + environments.clear(); + aggregateByCampaign.forEach((key, value) -> { + aggregateListByCampaign.add(value); + String environment = key.split("_")[0]; + String country = key.split("_")[1]; + if (!environments.contains(environment)) environments.add(environment); + if (!countries.contains(country)) countries.add(country); + }); + + response.put("campaignStatistics", aggregateListByCampaign); + response.put("environments", environments); + response.put("countries", countries); + return ResponseEntity.ok(response.toString()); } @PostMapping("{executionId}/declareFalseNegative") diff --git a/source/src/main/java/org/cerberus/core/crud/dao/ITagStatisticDAO.java b/source/src/main/java/org/cerberus/core/crud/dao/ITagStatisticDAO.java index a8c2407a3..6c3922f47 100644 --- a/source/src/main/java/org/cerberus/core/crud/dao/ITagStatisticDAO.java +++ b/source/src/main/java/org/cerberus/core/crud/dao/ITagStatisticDAO.java @@ -54,8 +54,11 @@ public interface ITagStatisticDAO { * @return */ Answer read(TagStatistic object); + AnswerList readByCriteria(List systems, List applications, List groups1, String minDate, String maxDate); + AnswerList readByCriteria(String campaign, List countries, List environments, String minDate, String maxDate); + /** * Get a TagStatistics list by tag from database * @param tag diff --git a/source/src/main/java/org/cerberus/core/crud/dao/impl/TagStatisticDAO.java b/source/src/main/java/org/cerberus/core/crud/dao/impl/TagStatisticDAO.java index 1900540bd..4d9a9f937 100644 --- a/source/src/main/java/org/cerberus/core/crud/dao/impl/TagStatisticDAO.java +++ b/source/src/main/java/org/cerberus/core/crud/dao/impl/TagStatisticDAO.java @@ -220,6 +220,83 @@ public AnswerList readByCriteria(List systems, List readByCriteria(String campaign, List countries, List environments, String minDate, String maxDate) { + AnswerList response = new AnswerList<>(); + MessageEvent msg = new MessageEvent(MessageEventEnum.DATA_OPERATION_ERROR_UNEXPECTED); + msg.setDescription(msg.getDescription().replace("%DESCRIPTION%", "")); + List tagStatistics = new ArrayList<>(); + + StringBuilder query = new StringBuilder(); + + query.append("SELECT `Id`, `Tag`, `Country`, `Environment`, `Campaign`, `CampaignGroup1`, `SystemList`, `ApplicationList`, `DateStartExe`, `DateEndExe`, `NbExe`, `NbExeUsefull`, `NbOK`, `NbKO`, `NbFA`, `NbNA`, `NbNE`, `NbPE`, `NbWE`, `NbPE`, `NbQU`, `NbQE`, `NbCA` from tagstatistic WHERE `Campaign` = ? AND `DateStartExe` >= ? AND `DateEndExe` <= ?"); + + if (!countries.isEmpty()) { + query.append(" AND ").append(SqlUtil.generateInClause("`Country`", countries)); + } + + if (!environments.isEmpty()) { + query.append(" AND ").append(SqlUtil.generateInClause("`Environment`", environments)); + } + + try (Connection connection = this.databaseSpring.connect(); + PreparedStatement preStat = connection.prepareStatement(query.toString()); + Statement stm = connection.createStatement()) { + + int i = 1; + + preStat.setString(i++, campaign); + preStat.setString(i++, minDate); + preStat.setString(i++, maxDate); + + if (!countries.isEmpty()) { + for (String country : countries) { + preStat.setString(i++, country); + } + } + + if (!environments.isEmpty()) { + for (String environment : environments) { + preStat.setString(i++, environment); + } + } + + try (ResultSet resultSet = preStat.executeQuery(); + ResultSet rowSet = stm.executeQuery("SELECT FOUND_ROWS()")) { + + LOG.info("Execute SQL Statement: {} ", preStat); + + while (resultSet.next()) { + tagStatistics.add(this.loadFromResultSet(resultSet)); + } + + int nrTotalRows = 0; + if (rowSet != null && rowSet.next()) { + nrTotalRows = rowSet.getInt(1); + } + + if (tagStatistics.size() >= MAX_ROW_SELECTED) { // Result of SQl was limited by MAX_ROW_SELECTED constrain. That means that we may miss some lines in the resultList. + LOG.error("Partial Result in the query."); + msg = new MessageEvent(MessageEventEnum.DATA_OPERATION_WARNING_PARTIAL_RESULT); + msg.setDescription(msg.getDescription().replace("%DESCRIPTION%", "Maximum row reached : " + MAX_ROW_SELECTED)); + } else if (tagStatistics.isEmpty()) { + msg = new MessageEvent(MessageEventEnum.DATA_OPERATION_NO_DATA_FOUND); + } else { + msg = new MessageEvent(MessageEventEnum.DATA_OPERATION_OK); + msg.setDescription(msg.getDescription().replace("%ITEM%", OBJECT_NAME).replace("%OPERATION%", "SELECT")); + } + response = new AnswerList<>(tagStatistics, nrTotalRows); + } + } catch (SQLException exception) { + LOG.error("Unable to execute query : {}", exception.toString()); + msg = new MessageEvent(MessageEventEnum.DATA_OPERATION_ERROR_UNEXPECTED); + msg.setDescription(msg.getDescription().replace("%DESCRIPTION%", exception.toString())); + } + response.setResultMessage(msg); + response.setDataList(tagStatistics); + return response; + } + /** * Get a TagStatistics list by tag from database * @param tag diff --git a/source/src/main/java/org/cerberus/core/crud/service/ITagStatisticService.java b/source/src/main/java/org/cerberus/core/crud/service/ITagStatisticService.java index 0335add9d..03a676815 100644 --- a/source/src/main/java/org/cerberus/core/crud/service/ITagStatisticService.java +++ b/source/src/main/java/org/cerberus/core/crud/service/ITagStatisticService.java @@ -56,10 +56,11 @@ public interface ITagStatisticService { */ void populateTagStatisticsMap(Map tagStatistics, List executions, Tag tag); - Map> createMapAggregateByTag(List tagStatistics) throws JSONException; - Map createMapAggregateByCampaign(Map> aggregateByTag) throws JSONException; + AnswerList readByCriteria(String campaign, List countries, List environment, String minDate, String maxDate); + Map> createMapGroupedByTag(List tagStatistics, String aggregateType) throws JSONException; + Map createMapAggregatedStatistics(Map> aggregateByTag, String aggregateType) throws JSONException; List getSystemsAllowedForUser(String user) throws CerberusException; List getApplicationsSystems(List systems); String formatDateForDb(String date); - + boolean userHasRightSystems(String user, List tagStatistics); } diff --git a/source/src/main/java/org/cerberus/core/crud/service/impl/TagStatisticService.java b/source/src/main/java/org/cerberus/core/crud/service/impl/TagStatisticService.java index 79c0ffb2b..44b4d89e4 100644 --- a/source/src/main/java/org/cerberus/core/crud/service/impl/TagStatisticService.java +++ b/source/src/main/java/org/cerberus/core/crud/service/impl/TagStatisticService.java @@ -21,6 +21,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.apache.tika.sax.Link; import org.cerberus.core.crud.dao.ITagStatisticDAO; import org.cerberus.core.crud.entity.*; import org.cerberus.core.crud.service.IApplicationService; @@ -36,6 +37,8 @@ import org.json.JSONException; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import java.sql.Timestamp; @@ -232,63 +235,64 @@ public AnswerList readByCriteria(List systems, List> createMapAggregateByTag(List tagStatistics) throws JSONException { + @Override + public AnswerList readByCriteria(String campaign, List countries, List environment, String minDate, String maxDate) { + return tagStatisticDAO.readByCriteria(campaign, countries, environment, minDate, maxDate); + } + + public Map> createMapGroupedByTag(List tagStatistics, String aggregateType) throws JSONException { Map> aggregateByTag = new HashMap<>(); for (TagStatistic tagStatistic : tagStatistics) { int nbExeUsefull = 0; int nbExe = 0; int nbOK = 0; long duration = 0; + long msMinTagDateStart = 0; + long msMaxTagDateEnd = 0; + + String key = setKeyAccordingToAggregateType(aggregateType, tagStatistic); String campaign = tagStatistic.getCampaign(); String tag = tagStatistic.getTag(); + String group1 = tagStatistic.getCampaignGroup1(); + Timestamp minTagDateStartExe = new Timestamp(0); Timestamp maxTagDateEndExe = new Timestamp(0); - long msMinTagDateStart = 0; - long msMaxTagDateEnd = 0; - JSONArray systemsInTagMap; - JSONArray applicationsInTagMap; - if (!aggregateByTag.containsKey(campaign)) { - aggregateByTag.put(campaign, new HashMap<>()); - } + JSONArray systemsInTagMap = new JSONArray(); + JSONArray applicationsInTagMap = new JSONArray(); + + JSONObject statistics; + + key = setKeyAccordingToAggregateType(aggregateType, tagStatistic); - if (!aggregateByTag.get(campaign).containsKey(tag)) { - aggregateByTag.get(campaign).put(tag, new JSONObject()); - aggregateByTag.get(campaign).get(tag) - .put("campaign", tagStatistic.getCampaign()) - .put("campaignGroup1", tagStatistic.getCampaignGroup1()) - .put("systemList", new JSONArray().toString()) - .put("applicationList", new JSONArray().toString()) - .put("maxTagDateEnd", minTagDateStartExe) - .put("minTagDateStart", maxTagDateEndExe) - .put("nbExeUsefull", 0) - .put("nbExe", 0) - .put("nbOK", 0) - .put("duration", 0); + if (!aggregateByTag.containsKey(key)) { + aggregateByTag.put(key, new HashMap<>()); } - JSONObject mapTag = aggregateByTag.get(campaign).get(tag); + if (!aggregateByTag.get(key).containsKey(tag)) { + statistics = createJsonTagStat(systemsInTagMap, applicationsInTagMap, group1, minTagDateStartExe, maxTagDateEndExe, duration, nbExeUsefull, nbExe, nbOK); + aggregateByTag.get(key).put(tag, statistics); + } - systemsInTagMap = JSONUtil.jsonArrayAddUniqueElement( + JSONUtil.jsonArrayAddUniqueElement( new JSONArray(tagStatistic.getSystemList()), - new JSONArray(mapTag.getString("systemList")) + systemsInTagMap ); - applicationsInTagMap = JSONUtil.jsonArrayAddUniqueElement( + JSONUtil.jsonArrayAddUniqueElement( new JSONArray(tagStatistic.getApplicationList()), - new JSONArray(mapTag.getString("applicationList")) + applicationsInTagMap ); - minTagDateStartExe = Timestamp.valueOf(mapTag.getString("minTagDateStart")); if (minTagDateStartExe.equals(new Timestamp(0)) || tagStatistic.getDateStartExe().getTime() < minTagDateStartExe.getTime()) { minTagDateStartExe = tagStatistic.getDateStartExe(); } - maxTagDateEndExe = Timestamp.valueOf(mapTag.getString("maxTagDateEnd")); if (maxTagDateEndExe.equals(new Timestamp(0)) || tagStatistic.getDateEndExe().getTime() > maxTagDateEndExe.getTime()) { maxTagDateEndExe = tagStatistic.getDateEndExe(); } + JSONObject mapTag = aggregateByTag.get(key).get(tag); msMinTagDateStart = minTagDateStartExe.getTime(); msMaxTagDateEnd = maxTagDateEndExe.getTime(); duration = (msMaxTagDateEnd - msMinTagDateStart) / 1000; @@ -296,23 +300,17 @@ public Map> createMapAggregateByTag(List createMapAggregateByCampaign(Map> aggregateByTag) throws JSONException { + public Map createMapAggregatedStatistics(Map> aggregateByTag, String aggregateType) throws JSONException { Map aggregateByCampaign = new HashMap<>(); JSONArray globalGroup1List = new JSONArray(); for (Map.Entry> aggregateByTagEntry : aggregateByTag.entrySet()) { - String campaign = aggregateByTagEntry.getKey(); + String key = aggregateByTagEntry.getKey(); double totalDuration = 0; String minDateStart = ""; String maxDateEnd = ""; @@ -323,60 +321,53 @@ public Map createMapAggregateByCampaign(Map { - JSONObject entry = new JSONObject(new LinkedHashMap<>()); - try { - entry.put("campaign", campaign) - .put("systemList", new JSONArray().toString()) - .put("applicationList", new JSONArray().toString()); - } catch (JSONException exception) { - LOG.error(exception); - } - return entry; - }); - - JSONObject campaignStatistic = aggregateByCampaign.get(campaign); - for (JSONObject mapTagEntry : aggregateByTagEntry.getValue().values()) { - campaignGroup1 = mapTagEntry.getString("campaignGroup1"); - - systemsByCampaign = JSONUtil.jsonArrayAddUniqueElement( + JSONUtil.jsonArrayAddUniqueElement( new JSONArray(mapTagEntry.getString("systemList")), - new JSONArray(campaignStatistic.getString("systemList")) + systemsByCampaign ); - - applicationsByCampaign = JSONUtil.jsonArrayAddUniqueElement( + JSONUtil.jsonArrayAddUniqueElement( new JSONArray(mapTagEntry.getString("applicationList")), - new JSONArray(campaignStatistic.getString("applicationList")) + applicationsByCampaign ); - if (StringUtil.isNotEmpty(campaignGroup1)) { - updateGlobalGroup1List(globalGroup1List, campaignGroup1); - } - minDateStart = updateMinCampaignDateStart(minDateStart, mapTagEntry); maxDateEnd = updateMaxCampaignDateEnd(maxDateEnd, mapTagEntry); sumPercOK += ((double) mapTagEntry.getInt("nbOK") / mapTagEntry.getInt("nbExeUsefull")); sumPercReliability += ((double) mapTagEntry.getInt("nbExeUsefull") / mapTagEntry.getInt("nbExe")); sumNumberExeUsefull += mapTagEntry.getInt("nbExeUsefull"); totalDuration += mapTagEntry.getLong("duration"); + + if (aggregateType.equals("CAMPAIGN")) { + campaignGroup1 = mapTagEntry.getString("campaignGroup1"); + if (StringUtil.isNotEmpty(campaignGroup1)) { + updateGlobalGroup1List(globalGroup1List, campaignGroup1); + } + } + } + + JSONObject statistics; + double avgDuration = totalDuration / aggregateByTagEntry.getValue().size(); + double avgOK = (sumPercOK * 100.0) / aggregateByTagEntry.getValue().size(); + double avgReliability = (sumPercReliability * 100) / aggregateByTagEntry.getValue().size(); + int avgNbExeUsefull = sumNumberExeUsefull / aggregateByTagEntry.getValue().size(); + + if (aggregateType.equals("ENV_COUNTRY")) { + String environment = key.split("_")[0]; + String country = key.split("_")[1]; + statistics = createJsonCampaignStatByEnvCountry(systemsByCampaign, applicationsByCampaign, environment, country, avgDuration, minDateStart, maxDateEnd, avgOK, avgReliability, avgNbExeUsefull); + } else { + statistics = createJsonCampaignStat(key, systemsByCampaign, applicationsByCampaign, campaignGroup1, avgDuration, minDateStart, maxDateEnd, avgOK, avgReliability, avgNbExeUsefull); } - campaignStatistic - .put("systemList", systemsByCampaign) - .put("systemList", systemsByCampaign) - .put("applicationList", applicationsByCampaign) - .put("campaignGroup1", campaignGroup1) - .put("avgDuration", totalDuration / aggregateByTagEntry.getValue().size()) - .put("minDateStart", minDateStart) - .put("maxDateEnd", maxDateEnd) - .put("avgOK", (sumPercOK * 100.0) / aggregateByTagEntry.getValue().size()) - .put("avgReliability", (sumPercReliability * 100) / aggregateByTagEntry.getValue().size()) - .put("avgNbExeUsefull", sumNumberExeUsefull / aggregateByTagEntry.getValue().size()); + aggregateByCampaign.put(key, statistics); + } + + if (aggregateType.equals("CAMPAIGN")) { + aggregateByCampaign.put("globalGroup1List", new JSONObject().put("array", globalGroup1List)); } - aggregateByCampaign.put("globalGroup1List", new JSONObject().put("array", globalGroup1List)); + return aggregateByCampaign; } @@ -418,6 +409,28 @@ private String updateMaxCampaignDateEnd(String maxDateEnd, JSONObject mapTagEntr return maxDateEnd; } + public boolean userHasRightSystems(String user, List tagStatistics) { + List systemsAllowedforUser = null; + try { + systemsAllowedforUser = getSystemsAllowedForUser(user); + } catch (CerberusException exception) { + LOG.error("Unable to get systems allowed for user: ", exception); + } + for (TagStatistic tagStatistic : tagStatistics) { + List systemList =Arrays.stream( + tagStatistic.getSystemList() + .replaceAll("\"", "") + .replace("[", "") + .replace("]", "") + .split(",")) + .collect(Collectors.toList()); + if (!new HashSet<>(systemsAllowedforUser).containsAll(systemList)) { + return false; + } + } + return true; + } + private String updateMinCampaignDateStart(String minDateStart, JSONObject mapTagEntry) throws JSONException { String currentStartDate = mapTagEntry.getString("minTagDateStart"); if (StringUtil.isEmpty(minDateStart) || Timestamp.valueOf(currentStartDate).getTime() < Timestamp.valueOf(minDateStart).getTime()) { @@ -425,4 +438,58 @@ private String updateMinCampaignDateStart(String minDateStart, JSONObject mapTag } return minDateStart; } + + private JSONObject createJsonTagStat(JSONArray systems, JSONArray applications, String group1, Timestamp minDateStart, Timestamp maxDateEnd, long duration, int nbExeUsefull, int nbExe, int nbOK) throws JSONException { + return new JSONObject(new LinkedHashMap<>()) + .put("systemList", systems) + .put("applicationList", applications) + .put("campaignGroup1", group1) + .put("minTagDateStart", minDateStart) + .put("maxTagDateEnd", maxDateEnd) + .put("duration", duration) + .put("nbExeUsefull", nbExeUsefull) + .put("nbExe", nbExe) + .put("nbOK",nbOK); + } + + private JSONObject createJsonCampaignStatByEnvCountry(JSONArray systems, JSONArray applications, String environment, String country, double avgDuration, String minDateStart, String maxDateEnd, double avgOK, double avgReliability, int avgNbExeUsefull) throws JSONException { + return new JSONObject(new LinkedHashMap<>()) + .put("systemList", systems) + .put("applicationList", applications) + .put("environment", environment) + .put("country", country) + .put("avgDuration", avgDuration) + .put("minDateStart", minDateStart) + .put("maxDateEnd", maxDateEnd) + .put("avgOK", avgOK) + .put("avgReliability",avgReliability) + .put("avgNbExeUsefull", avgNbExeUsefull); + } + + private JSONObject createJsonCampaignStat(String campaign, JSONArray systems, JSONArray applications, String group1, double avgDuration, String minDateStart, String maxDateEnd, double avgOK, double avgReliability, int avgNbExeUsefull) throws JSONException { + return new JSONObject(new LinkedHashMap<>()) + .put("campaign", campaign) + .put("systemList", systems) + .put("applicationList", applications) + .put("campaignGroup1", group1) + .put("avgDuration", avgDuration) + .put("minDateStart", minDateStart) + .put("maxDateEnd", maxDateEnd) + .put("avgOK", avgOK) + .put("avgReliability",avgReliability) + .put("avgNbExeUsefull", avgNbExeUsefull); + } + + private String setKeyAccordingToAggregateType(String aggregateType, TagStatistic tagStatistic) { + String key = ""; + switch (aggregateType) { + case "CAMPAIGN": + key = tagStatistic.getCampaign(); + break; + case "ENV_COUNTRY": + key = String.format("%s_%s", tagStatistic.getEnvironment(), tagStatistic.getCountry()); + break; + } + return key; + } } From 487b734a8c8176688fabfa70296a2dcfe2f656e6 Mon Sep 17 00:00:00 2001 From: lucashimpens Date: Fri, 26 Jul 2024 15:59:50 +0200 Subject: [PATCH 2/2] feat(tagstatistics): create 2nd screen. --- .../DocumentationDatabaseService.java | 8 + .../webapp/ReportingCampaignStatistics.jsp | 106 +++--- .../js/pages/ReportingCampaignStatistics.js | 303 ++++++++++++++---- 3 files changed, 319 insertions(+), 98 deletions(-) diff --git a/source/src/main/java/org/cerberus/core/database/DocumentationDatabaseService.java b/source/src/main/java/org/cerberus/core/database/DocumentationDatabaseService.java index 976a35ef8..5c66509c7 100644 --- a/source/src/main/java/org/cerberus/core/database/DocumentationDatabaseService.java +++ b/source/src/main/java/org/cerberus/core/database/DocumentationDatabaseService.java @@ -2811,12 +2811,20 @@ public ArrayList getSqlDocumentation() { b.append(",('page_campaignstatistics','labelFromPicker','','en','From','',NULL)"); b.append(",('page_campaignstatistics','labelToPicker','','fr','Au','',NULL)"); b.append(",('page_campaignstatistics','labelToPicker','','en','To','',NULL)"); + b.append(",('page_campaignstatistics','labelEnvironmentSelect','','fr','Environnement','',NULL)"); + b.append(",('page_campaignstatistics','labelEnvironmentSelect','','en','Environment','',NULL)"); + b.append(",('page_campaignstatistics','labelCountrySelect','','fr','Pays','',NULL)"); + b.append(",('page_campaignstatistics','labelCountrySelect','','en','Country','',NULL)"); b.append(",('page_campaignstatistics','buttonDetailByCountryEnv','','fr','Détail par environnement et pays','',NULL)"); b.append(",('page_campaignstatistics','buttonDetailByCountryEnv','','en','Detail by country and environment','',NULL)"); b.append(",('page_campaignstatistics','buttonLoad','','fr','Charger','',NULL)"); b.append(",('page_campaignstatistics','buttonLoad','','en','Load','',NULL)"); b.append(",('page_campaignstatistics','campaign_col','','fr','Campagne','',NULL)"); b.append(",('page_campaignstatistics','campaign_col','','en','Campaign','',NULL)"); + b.append(",('page_campaignstatistics','environment_col','','fr','Environnement','',NULL)"); + b.append(",('page_campaignstatistics','environment_col','','en','Environment','',NULL)"); + b.append(",('page_campaignstatistics','country_col','','fr','Pays','',NULL)"); + b.append(",('page_campaignstatistics','country_col','','en','Country','',NULL)"); b.append(",('page_campaignstatistics','systems_col','','fr','Systèmes','',NULL)"); b.append(",('page_campaignstatistics','systems_col','','en','Systems','',NULL)"); b.append(",('page_campaignstatistics','applications_col','','fr','Applications','',NULL)"); diff --git a/source/src/main/webapp/ReportingCampaignStatistics.jsp b/source/src/main/webapp/ReportingCampaignStatistics.jsp index 5e0355272..ecfaf7305 100644 --- a/source/src/main/webapp/ReportingCampaignStatistics.jsp +++ b/source/src/main/webapp/ReportingCampaignStatistics.jsp @@ -37,56 +37,78 @@
<%@ include file="include/global/messagesArea.html"%> <%@ include file="include/utils/modal-confirmation.html"%> - -

Campaign Statistics

+

Campaign Statistics

-
-
- - + -
-
- - +
+
+ + +
-
-
- - +
+
+
+ + +
-
-
-
- -
- - - - +
+
+ +
-
-
-
- -
- - - - +
+
+ +
-
-
- +
+
+
+ +
+ + + + +
+
+
+
+
+ +
+ + + + +
+
+
+
+
+ +
+
@@ -99,6 +121,10 @@
+