/** * Evaluates the condition for the specified measure */ static EvaluatedCondition evaluate(Condition condition, QualityGateEvaluator.Measures measures) { Optional<QualityGateEvaluator.Measure> measure = measures.get(condition.getMetricKey()); if (!measure.isPresent()) { return new EvaluatedCondition(condition, EvaluationStatus.OK, null); } Optional<Comparable> value = getMeasureValue(condition, measure.get()); if (!value.isPresent()) { return new EvaluatedCondition(condition, EvaluationStatus.OK, null); } ValueType type = measure.get().getType(); return evaluateCondition(condition, type, value.get()) .orElseGet(() -> new EvaluatedCondition(condition, EvaluationStatus.OK, value.get().toString())); }
@CheckForNull private static Comparable getLeakValue(QualityGateEvaluator.Measure measure) { if (NUMERICAL_TYPES.contains(measure.getType())) { return measure.getNewMetricValue().isPresent() ? getNumericValue(measure.getType(), measure.getNewMetricValue().getAsDouble()) : null; } throw new IllegalArgumentException("Condition on leak period is not allowed for type " + measure.getType()); }
@CheckForNull private static Comparable getValue(QualityGateEvaluator.Measure measure) { if (NUMERICAL_TYPES.contains(measure.getType())) { return measure.getValue().isPresent() ? getNumericValue(measure.getType(), measure.getValue().getAsDouble()) : null; } checkArgument(ValueType.LEVEL.equals(measure.getType()), "Condition is not allowed for type %s" , measure.getType()); return measure.getStringValue().orElse(null); }
/** * Evaluates the condition for the specified measure */ static EvaluatedCondition evaluate(Condition condition, QualityGateEvaluator.Measures measures) { Optional<QualityGateEvaluator.Measure> measure = measures.get(condition.getMetricKey()); if (!measure.isPresent()) { return new EvaluatedCondition(condition, EvaluationStatus.OK, null); } Optional<Comparable> value = getMeasureValue(condition, measure.get()); if (!value.isPresent()) { return new EvaluatedCondition(condition, EvaluationStatus.OK, null); } ValueType type = measure.get().getType(); return evaluateCondition(condition, type, value.get(), true) .orElseGet(() -> evaluateCondition(condition, type, value.get(), false) .orElseGet(() -> new EvaluatedCondition(condition, EvaluationStatus.OK, value.get().toString()))); }
@CheckForNull private static Comparable getValue(QualityGateEvaluator.Measure measure) { if (NUMERICAL_TYPES.contains(measure.getType())) { return measure.getValue().isPresent() ? getNumericValue(measure.getType(), measure.getValue().getAsDouble()) : null; } switch (measure.getType()) { case LEVEL: case STRING: case DISTRIB: return measure.getStringValue().orElse(null); default: throw new IllegalArgumentException("Condition on leak period is not allowed for type " + measure.getType()); } }
@CheckForNull private static Comparable getLeakValue(QualityGateEvaluator.Measure measure) { if (NUMERICAL_TYPES.contains(measure.getType())) { return measure.getLeakValue().isPresent() ? getNumericValue(measure.getType(), measure.getLeakValue().getAsDouble()) : null; } throw new IllegalArgumentException("Condition on leak period is not allowed for type " + measure.getType()); }
@Test public void refreshGateStatus_provides_measures_to_evaluator() { ComponentDto project = ComponentTesting.newPublicProjectDto(newOrganizationDto()); MetricDto numericMetric = newMetricDto().setValueType(Metric.ValueType.FLOAT.name()); MetricDto numericNewMetric = newMetricDto().setValueType(Metric.ValueType.FLOAT.name()).setKey("new_metric"); MetricDto stringMetric = newMetricDto().setValueType(Metric.ValueType.STRING.name()); MetricDto statusMetric = newMetricDto().setKey(CoreMetrics.ALERT_STATUS_KEY); MetricDto detailsMetric = newMetricDto().setKey(CoreMetrics.QUALITY_GATE_DETAILS_KEY); QualityGate gate = new QualityGate("1", "foo", Collections.emptySet()); LiveMeasureDto numericMeasure = new LiveMeasureDto().setMetricId(numericMetric.getId()).setValue(1.23).setVariation(4.56).setComponentUuid(project.uuid()); LiveMeasureDto numericNewMeasure = new LiveMeasureDto().setMetricId(numericNewMetric.getId()).setValue(7.8).setVariation(8.9).setComponentUuid(project.uuid()); LiveMeasureDto stringMeasure = new LiveMeasureDto().setMetricId(stringMetric.getId()).setData("bar").setComponentUuid(project.uuid()); MeasureMatrix matrix = new MeasureMatrix(singleton(project), asList(statusMetric, detailsMetric, numericMetric, numericNewMetric, stringMetric), asList(numericMeasure, numericNewMeasure, stringMeasure)); underTest.refreshGateStatus(project, gate, matrix); QualityGateEvaluator.Measures measures = qualityGateEvaluator.getCalledMeasures(); QualityGateEvaluator.Measure loadedStringMeasure = measures.get(stringMetric.getKey()).get(); assertThat(loadedStringMeasure.getStringValue()).hasValue("bar"); assertThat(loadedStringMeasure.getValue()).isEmpty(); assertThat(loadedStringMeasure.getType()).isEqualTo(Metric.ValueType.STRING); QualityGateEvaluator.Measure loadedNumericMeasure = measures.get(numericMetric.getKey()).get(); assertThat(loadedNumericMeasure.getStringValue()).isEmpty(); assertThat(loadedNumericMeasure.getValue()).hasValue(1.23); assertThat(loadedNumericMeasure.getType()).isEqualTo(Metric.ValueType.FLOAT); QualityGateEvaluator.Measure loadedNumericNewMeasure = measures.get(numericNewMetric.getKey()).get(); assertThat(loadedNumericNewMeasure.getStringValue()).isEmpty(); assertThat(loadedNumericNewMeasure.getNewMetricValue()).hasValue(8.9); assertThat(loadedNumericNewMeasure.getType()).isEqualTo(Metric.ValueType.FLOAT); }