Skip to content

Commit 3199828

Browse files
authored
Merge pull request #134 from q-rapids/develop
Release v1.2
2 parents 174c782 + 80852fd commit 3199828

File tree

74 files changed

+2563
-391
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+2563
-391
lines changed

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ apply plugin: 'jacoco'
2626
apply plugin: 'org.asciidoctor.convert'
2727

2828
group = 'com.upc.gessi.qrapids'
29-
version = '1.1.1'
29+
version = '1.2'
3030
sourceCompatibility = 1.8
3131

3232
war {
@@ -78,7 +78,7 @@ dependencies {
7878
compile('org.elasticsearch.client:transport:5.6.3')
7979
compile('org.elasticsearch:elasticsearch:5.6.3')
8080
compile('org.elasticsearch.client:elasticsearch-rest-high-level-client:5.6.3')
81-
compile files('libs/qrapids-qma-elastic-0.16.jar')
81+
compile files('libs/qrapids-qma-elastic-0.18.jar')
8282

8383
//API QR Generator
8484
compile files('libs/qrapids-qr_generator-0.2.jar')

docs/asciidoc/index.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
= Q-Rapids Dashboard API REST Documentation
2-
v1.1.1, {docdate}
2+
v1.2, {docdate}
33
:toc: left
44

55
:sectnums:

docs/asciidoc/index.html

Lines changed: 125 additions & 59 deletions
Large diffs are not rendered by default.
Binary file not shown.

sonar-project.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ sonar.projectKey=q-rapids_qrapids-dashboard
22

33
sonar.projectName=qrapids-dashboard
44

5-
sonar.projectVersion=1.1.1
5+
sonar.projectVersion=1.2
66

77
sonar.sources=src/main/java
88
sonar.tests=src/test/java

src/main/java/com/upc/gessi/qrapids/QrapidsApplication.java

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package com.upc.gessi.qrapids;
22

3+
import com.upc.gessi.qrapids.app.domain.controllers.MetricsController;
4+
import com.upc.gessi.qrapids.app.domain.controllers.QualityFactorsController;
35
import com.upc.gessi.qrapids.app.domain.controllers.StrategicIndicatorsController;
6+
import com.upc.gessi.qrapids.app.domain.models.MetricCategory;
7+
import com.upc.gessi.qrapids.app.domain.models.QFCategory;
8+
import com.upc.gessi.qrapids.app.domain.models.SICategory;
49
import com.upc.gessi.qrapids.app.presentation.rest.services.Alerts;
510
import org.slf4j.Logger;
611
import org.slf4j.LoggerFactory;
@@ -12,6 +17,11 @@
1217
import org.springframework.context.annotation.Bean;
1318
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
1419

20+
import java.util.ArrayList;
21+
import java.util.HashMap;
22+
import java.util.List;
23+
import java.util.Map;
24+
1525
@SpringBootApplication
1626
public class QrapidsApplication extends SpringBootServletInitializer {
1727

@@ -26,9 +36,49 @@ public BCryptPasswordEncoder bCryptPasswordEncoder() {
2636
}
2737

2838
public static void main(String[] args) {
29-
// Commented fetch function for avoid automatic add elasticsearch information to local SQL database.
39+
3040
ConfigurableApplicationContext context = SpringApplication.run(QrapidsApplication.class, args);
31-
/*
41+
42+
// Check the categories in the SQL database and if they are empty create the default ones
43+
List<SICategory> siCategoryList = context.getBean(StrategicIndicatorsController.class).getStrategicIndicatorCategories();
44+
List<QFCategory> factorCategoryList = context.getBean(QualityFactorsController.class).getFactorCategories();
45+
List<MetricCategory> metricCategoryList = context.getBean(MetricsController.class).getMetricCategories();
46+
try {
47+
// Declare default categories
48+
List<Map<String, String>> categories = new ArrayList<>();
49+
Map<String,String> cat1 = new HashMap<>();
50+
cat1.put("color", "#00ff00");
51+
cat1.put("name", "Good");
52+
cat1.put("upperThreshold", "100");
53+
categories.add(cat1);
54+
Map<String,String> cat2 = new HashMap<>();
55+
cat2.put("color", "#ff8000");
56+
cat2.put("name", "Normal");
57+
cat2.put("upperThreshold", "67");
58+
categories.add(cat2);
59+
Map<String,String> cat3 = new HashMap<>();
60+
cat3.put("color", "#ff0000");
61+
cat3.put("name", "Bad");
62+
cat3.put("upperThreshold", "33");
63+
categories.add(cat3);
64+
65+
// Save Strategic Indicator categories
66+
if (siCategoryList.size() == 0) {
67+
context.getBean(StrategicIndicatorsController.class).newStrategicIndicatorCategories(categories);
68+
}
69+
// Save Factor categories
70+
if (factorCategoryList.size() == 0){
71+
context.getBean(QualityFactorsController.class).newFactorCategories(categories);
72+
}
73+
// Save Metric categories
74+
if (metricCategoryList.size() == 0) {
75+
context.getBean(MetricsController.class).newMetricCategories(categories);
76+
}
77+
} catch (Exception e) {
78+
Logger logger = LoggerFactory.getLogger(Alerts.class);
79+
logger.error(e.getMessage(), e);
80+
}
81+
/* Commented fetch function for avoid automatically add elasticsearch information to local SQL database.
3282
try {
3383
context.getBean(StrategicIndicatorsController.class).fetchStrategicIndicators();
3484
} catch (Exception e) {

src/main/java/com/upc/gessi/qrapids/app/config/security/seeds/RoutesFirstLoad.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public void init() throws Exception {
4949

5050
// Quality Factor
5151
routes.add( new Route( "Quality Factor - Current Chart", "/QualityFactor/CurrentChart") );
52+
routes.add( new Route( "Quality Factor - Current Stacked", "/QualityFactor/CurrentStacked") );
5253
routes.add( new Route( "Quality Factor - Current Table", "/QualityFactor/CurrentTable") );
5354

5455
routes.add( new Route( "Quality Factor - Historic Table", "/QualityFactor/HistoricTable") );
@@ -62,7 +63,9 @@ public void init() throws Exception {
6263

6364
// Detailed Strategic Indicators
6465
routes.add( new Route( "Detailed Strategic Indicators - Current Chart", "/DetailedStrategicIndicators/CurrentChart") );
66+
routes.add( new Route( "Detailed Strategic Indicators - Current Stacked", "/DetailedStrategicIndicators/CurrentStacked") );
6567
routes.add( new Route( "Detailed Strategic Indicators - Current Table", "/DetailedStrategicIndicators/CurrentTable") );
68+
6669
routes.add( new Route( "Detailed Strategic Indicators - Historic Table", "/DetailedStrategicIndicators/HistoricTable") );
6770
routes.add( new Route( "Detailed Strategic Indicators - Historic Chart", "/DetailedStrategicIndicators/HistoricChart") );
6871

src/main/java/com/upc/gessi/qrapids/app/domain/adapters/AssesSI.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,24 @@ public List<DTOSIAssessment> dtoAssessmentSItoDTOSIAssessment(List<DTOCategorySI
111111
}
112112
return categories;
113113
}
114+
115+
public float assesSI_weighted(List<Float> factorsAssessment, List<Float> weights) {
116+
try {
117+
float total = 0.f;
118+
float result =0.f;
119+
120+
for (int i = 0; i < factorsAssessment.size(); i++) {
121+
total += ((weights.get(i)/100)*factorsAssessment.get(i));
122+
}
123+
if (total>0)
124+
result = total/1; // sum of weights always is 1 = 100%
125+
126+
return result;
127+
128+
} catch (Exception e) {
129+
Logger logger = LoggerFactory.getLogger(AssesSI.class);
130+
logger.error(e.getMessage(), e);
131+
return 0.f;
132+
}
133+
}
114134
}

src/main/java/com/upc/gessi/qrapids/app/domain/adapters/Forecast.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,7 @@ private void getAndBuildDTOStrategicIndicatorEvaluation(List<DTOStrategicIndicat
584584
si.getName(),
585585
si.getDescription(),
586586
Pair.of(value, strategicIndicatorsController.getLabel(value)),
587+
"",
587588
strategicIndicatorsController.getCategories(),
588589
l.getKey(), "Dashboard Assessment",
589590
si.getId(),
@@ -604,6 +605,7 @@ private void getAndBuildDTOStrategicIndicatorEvaluationWithBayesianNetwork(List<
604605
si.getName(),
605606
si.getDescription(),
606607
Pair.of(value, strategicIndicatorsController.getLabel(value)),
608+
"",
607609
assessment, m.getKey(),
608610
"Dashboard Assessment",
609611
si.getId(),

src/main/java/com/upc/gessi/qrapids/app/domain/adapters/QMA/QMARelations.java

Lines changed: 87 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@
44
import DTOs.Relations.SourceRelationDTO;
55
import DTOs.Relations.TargetRelationDTO;
66
import com.upc.gessi.qrapids.app.config.QMAConnection;
7+
import com.upc.gessi.qrapids.app.domain.controllers.QualityFactorsController;
78
import com.upc.gessi.qrapids.app.domain.controllers.StrategicIndicatorsController;
9+
import com.upc.gessi.qrapids.app.domain.exceptions.CategoriesException;
10+
import com.upc.gessi.qrapids.app.presentation.rest.dto.DTOMetric;
11+
import com.upc.gessi.qrapids.app.presentation.rest.dto.DTOQualityFactor;
12+
import com.upc.gessi.qrapids.app.presentation.rest.dto.DTOStrategicIndicatorEvaluation;
813
import com.upc.gessi.qrapids.app.presentation.rest.dto.relations.DTORelationsFactor;
914
import com.upc.gessi.qrapids.app.presentation.rest.dto.relations.DTORelationsMetric;
1015
import com.upc.gessi.qrapids.app.presentation.rest.dto.relations.DTORelationsSI;
@@ -29,6 +34,9 @@ public class QMARelations {
2934
@Autowired
3035
private StrategicIndicatorsController strategicIndicatorsController;
3136

37+
@Autowired
38+
private QualityFactorsController qualityFactorsController;
39+
3240
private static final String SI_TYPE = "strategic_indicators";
3341
private static final String FACTORS_TYPE = "factors";
3442
private static final String METRICS_TYPE = "metrics";
@@ -60,18 +68,21 @@ private double[] convertFloatListToDoubleArray(List<Float> floatList) {
6068
return doubleArray;
6169
}
6270

63-
public List<DTORelationsSI> getRelations (String prj, LocalDate date) throws IOException {
71+
public List<DTORelationsSI> getRelations (String prj, LocalDate date) throws IOException, CategoriesException, ArithmeticException {
6472
qmacon.initConnexion();
6573
List<RelationDTO> relationDTOS;
74+
// get relations from elasticsearch
6675
if (date == null)
6776
relationDTOS = Relations.getRelations(prj);
6877
else
6978
relationDTOS = Relations.getRelations(prj, date);
70-
71-
return RelationDTOToDTORelationSI(relationDTOS);
79+
// get current evaluations for SI and Quality Factors
80+
List<DTOStrategicIndicatorEvaluation> siEval = strategicIndicatorsController.getAllStrategicIndicatorsCurrentEvaluation(prj);
81+
List<DTOQualityFactor> qfEval = qualityFactorsController.getAllFactorsWithMetricsCurrentEvaluation(prj);
82+
return RelationDTOToDTORelationSI(relationDTOS, siEval, qfEval);
7283
}
7384

74-
private List<DTORelationsSI> RelationDTOToDTORelationSI (List<RelationDTO> relationDTOS) {
85+
private List<DTORelationsSI> RelationDTOToDTORelationSI (List<RelationDTO> relationDTOS, List<DTOStrategicIndicatorEvaluation> siEval, List<DTOQualityFactor> qfEval) throws ArithmeticException {
7586
Map<String, DTORelationsSI> strategicIndicatorsMap = new HashMap<>();
7687
Map<String, DTORelationsFactor> factorsMap = new HashMap<>();
7788
Map<String, DTORelationsMetric> metricsMap = new HashMap<>();
@@ -81,22 +92,60 @@ private List<DTORelationsSI> RelationDTOToDTORelationSI (List<RelationDTO> relat
8192
SourceRelationDTO source = relation.getSource();
8293
TargetRelationDTO target = relation.getTarget();
8394
if (target.getType().equals(FACTORS_TYPE) && source.getType().equals(METRICS_TYPE)) {
84-
buildFactorMetricRelation(factorsMap, metricsMap, weight, source, target);
95+
buildFactorMetricRelation(factorsMap, metricsMap, weight, source, target, qfEval);
8596
}
8697
else if (target.getType().equals(SI_TYPE) && source.getType().equals(FACTORS_TYPE)) {
87-
buildSIFactorRelation(strategicIndicatorsMap, factorsMap, weight, source, target);
98+
buildSIFactorRelation(strategicIndicatorsMap, factorsMap, weight, source, target, siEval, qfEval);
8899
}
89100
}
90101

91-
return new ArrayList<>(strategicIndicatorsMap.values());
102+
List<DTORelationsSI> result = new ArrayList<>(strategicIndicatorsMap.values());
103+
for (DTORelationsSI si : result) {
104+
for (DTORelationsFactor f : si.getFactors()) {
105+
// Define weight & weightedValue for factors legacy cases (0 & 1)
106+
float w = Float.parseFloat(f.getWeight());
107+
if (w == 0f || w == 1f) {
108+
float nFactors = si.getFactors().size();
109+
w = 1/nFactors;
110+
f.setWeight(String.valueOf(w));
111+
f.setWeightedValue(String.valueOf(Float.parseFloat(f.getAssessmentValue()) * Float.parseFloat(f.getWeight())));
112+
} else if (w == -1) { // Define weightedValue for factor with BN case (-1)
113+
f.setWeightedValue(String.valueOf(Float.parseFloat(f.getAssessmentValue()) * 1/si.getFactors().size()));
114+
}
115+
float sum = sumMetricsWeights(f.getMetrics());
116+
for (DTORelationsMetric m : f.getMetrics()) {
117+
// Define weight percentage & weightedValue for metrics
118+
if (sum != 0) {
119+
m.setWeight(String.valueOf((Float.parseFloat(m.getWeight())/sum)));
120+
m.setWeightedValue(String.valueOf(Float.parseFloat(m.getAssessmentValue())*Float.parseFloat(m.getWeight())));
121+
} else {
122+
throw new ArithmeticException("/ by 0: sum of metrics weights is zero.");
123+
}
124+
}
125+
}
126+
}
127+
return result;
92128
}
93129

94-
private void buildSIFactorRelation(Map<String, DTORelationsSI> strategicIndicatorsMap, Map<String, DTORelationsFactor> factorsMap, String weight, SourceRelationDTO source, TargetRelationDTO target) {
130+
private float sumMetricsWeights(List<DTORelationsMetric> metrics) {
131+
float totalWeight = 0f;
132+
for (int i = 0; i < metrics.size(); i++){
133+
totalWeight += Float.parseFloat(metrics.get(i).getWeight());
134+
}
135+
return totalWeight;
136+
}
137+
138+
private void buildSIFactorRelation(Map<String, DTORelationsSI> strategicIndicatorsMap, Map<String, DTORelationsFactor> factorsMap, String weight, SourceRelationDTO source, TargetRelationDTO target, List<DTOStrategicIndicatorEvaluation> siEval, List<DTOQualityFactor> qfEval) {
95139
DTORelationsSI strategicIndicator;
140+
DTOStrategicIndicatorEvaluation thisSI = siEval.stream()
141+
.filter(si -> target.getID().equals(si.getId()))
142+
.findAny()
143+
.orElse(null);
96144
if (strategicIndicatorsMap.containsKey(target.getID())) {
97145
strategicIndicator = strategicIndicatorsMap.get(target.getID());
98146
} else {
99147
strategicIndicator = new DTORelationsSI(target.getID());
148+
strategicIndicator.setName(thisSI.getName());
100149
strategicIndicatorsMap.put(target.getID(), strategicIndicator);
101150
}
102151
strategicIndicator.setValue(target.getValue());
@@ -106,8 +155,7 @@ private void buildSIFactorRelation(Map<String, DTORelationsSI> strategicIndicato
106155
String valueDescription = StrategicIndicatorsController.buildDescriptiveLabelAndValue(Pair.of(value, label));
107156
strategicIndicator.setValueDescription(valueDescription);
108157
strategicIndicator.setColor(strategicIndicatorsController.getColorFromLabel(label));
109-
}
110-
catch (NumberFormatException nfe) {
158+
} catch (NumberFormatException nfe) {
111159
String label = strategicIndicator.getValue();
112160
Float value = strategicIndicatorsController.getValueFromLabel(label);
113161
String valueDescription = StrategicIndicatorsController.buildDescriptiveLabelAndValue(Pair.of(value, label));
@@ -116,36 +164,61 @@ private void buildSIFactorRelation(Map<String, DTORelationsSI> strategicIndicato
116164
}
117165

118166
DTORelationsFactor factor;
167+
DTOQualityFactor thisFactor = qfEval.stream()
168+
.filter(qf -> source.getID().equals(qf.getId()))
169+
.findAny()
170+
.orElse(null);
119171
if (factorsMap.containsKey(source.getID())) {
120172
factor = factorsMap.get(source.getID());
121173
} else {
122174
factor = new DTORelationsFactor(source.getID());
175+
factor.setName(thisFactor.getName());
123176
factorsMap.put(source.getID(), factor);
124177
}
125-
factor.setWeight(weight);
126-
factor.setValue(source.getValue());
178+
// Special cases
179+
if (Float.parseFloat(weight) == 0f || Float.parseFloat(weight) == 1f || Float.parseFloat(weight) == -1f) {
180+
factor.setWeight(weight);
181+
factor.setWeightedValue(source.getValue());
182+
factor.setAssessmentValue(source.getValue());
183+
} else {
184+
factor.setWeight(weight);
185+
factor.setWeightedValue(source.getValue());
186+
factor.setAssessmentValue(String.valueOf(Float.parseFloat(source.getValue())/Float.parseFloat(weight)));
187+
}
127188

128189
strategicIndicator.setFactor(new DTORelationsFactor(factor));
129190
}
130191

131-
private void buildFactorMetricRelation(Map<String, DTORelationsFactor> factorsMap, Map<String, DTORelationsMetric> metricsMap, String weight, SourceRelationDTO source, TargetRelationDTO target) {
192+
private void buildFactorMetricRelation(Map<String, DTORelationsFactor> factorsMap, Map<String, DTORelationsMetric> metricsMap, String weight, SourceRelationDTO source, TargetRelationDTO target, List<DTOQualityFactor> qfEval) {
132193
DTORelationsFactor factor;
194+
DTOQualityFactor thisFactor = qfEval.stream()
195+
.filter(qf -> target.getID().equals(qf.getId()))
196+
.findAny()
197+
.orElse(null);
133198
if (factorsMap.containsKey(target.getID())) {
134199
factor = factorsMap.get(target.getID());
135200
} else {
136201
factor = new DTORelationsFactor(target.getID());
202+
factor.setName(thisFactor.getName());
137203
factorsMap.put(target.getID(), factor);
138204
}
139205

140206
DTORelationsMetric metric;
207+
List<DTOMetric> metrics = thisFactor.getMetrics();
208+
DTOMetric thisMetric = metrics.stream()
209+
.filter(m -> source.getID().equals(m.getId()))
210+
.findAny()
211+
.orElse(null);
141212
if (metricsMap.containsKey(source.getID())) {
142213
metric = metricsMap.get(source.getID());
143214
} else {
144215
metric = new DTORelationsMetric(source.getID());
216+
metric.setName(thisMetric.getName());
145217
metricsMap.put(source.getID(), metric);
146218
}
147219
metric.setWeight(weight);
148-
metric.setValue(source.getValue());
220+
metric.setWeightedValue(source.getValue());
221+
metric.setAssessmentValue(thisMetric.getValue().toString());
149222

150223
factor.setMetric(new DTORelationsMetric(metric));
151224
}

0 commit comments

Comments
 (0)