Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Measurable rating change logs #6656

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,39 +23,16 @@
import org.finos.waltz.data.InlineSelectFieldFactory;
import org.finos.waltz.data.JooqUtilities;
import org.finos.waltz.data.SelectorUtilities;
import org.finos.waltz.model.EntityKind;
import org.finos.waltz.model.EntityLifecycleStatus;
import org.finos.waltz.model.EntityReference;
import org.finos.waltz.model.IdSelectionOptions;
import org.finos.waltz.model.ImmutableEntityReference;
import org.finos.waltz.model.Operation;
import org.finos.waltz.model.Severity;
import org.finos.waltz.model.measurable_rating.ImmutableMeasurableRating;
import org.finos.waltz.model.measurable_rating.MeasurableRating;
import org.finos.waltz.model.measurable_rating.RemoveMeasurableRatingCommand;
import org.finos.waltz.model.measurable_rating.SaveMeasurableRatingCommand;
import org.finos.waltz.model.*;
import org.finos.waltz.model.measurable_rating.*;
import org.finos.waltz.model.tally.ImmutableMeasurableRatingTally;
import org.finos.waltz.model.tally.MeasurableRatingTally;
import org.finos.waltz.model.tally.Tally;
import org.finos.waltz.schema.Tables;
import org.finos.waltz.schema.tables.EntityHierarchy;
import org.finos.waltz.schema.tables.Measurable;
import org.finos.waltz.schema.tables.records.MeasurableRatingRecord;
import org.jooq.Condition;
import org.jooq.DSLContext;
import org.jooq.Field;
import org.jooq.Record;
import org.jooq.Record1;
import org.jooq.Record2;
import org.jooq.Record3;
import org.jooq.Record4;
import org.jooq.Record9;
import org.jooq.RecordMapper;
import org.jooq.Select;
import org.jooq.SelectConditionStep;
import org.jooq.SelectHavingStep;
import org.jooq.SelectJoinStep;
import org.jooq.SelectOrderByStep;
import org.jooq.*;
import org.jooq.impl.DSL;
import org.jooq.lambda.tuple.Tuple2;
import org.slf4j.Logger;
Expand All @@ -80,12 +57,7 @@
import static org.finos.waltz.common.SetUtilities.union;
import static org.finos.waltz.common.StringUtilities.firstChar;
import static org.finos.waltz.common.StringUtilities.notEmpty;
import static org.finos.waltz.schema.Tables.ALLOCATION;
import static org.finos.waltz.schema.Tables.CHANGE_LOG;
import static org.finos.waltz.schema.Tables.ENTITY_HIERARCHY;
import static org.finos.waltz.schema.Tables.MEASURABLE_CATEGORY;
import static org.finos.waltz.schema.Tables.MEASURABLE_RATING_PLANNED_DECOMMISSION;
import static org.finos.waltz.schema.Tables.USER_ROLE;
import static org.finos.waltz.schema.Tables.*;
import static org.finos.waltz.schema.tables.Application.APPLICATION;
import static org.finos.waltz.schema.tables.Measurable.MEASURABLE;
import static org.finos.waltz.schema.tables.MeasurableRating.MEASURABLE_RATING;
Expand Down Expand Up @@ -302,7 +274,7 @@ public List<MeasurableRatingTally> statsByAppSelector(Select<Record1<Long>> sele
boolean primaryOnly) {
Condition cond = MEASURABLE_CATEGORY.ALLOW_PRIMARY_RATINGS.isFalse()
.or(primaryOnly
? MEASURABLE_RATING.IS_PRIMARY.eq(primaryOnly)
? MEASURABLE_RATING.IS_PRIMARY.isTrue()
: DSL.trueCondition());

return dsl
Expand All @@ -318,28 +290,6 @@ public List<MeasurableRatingTally> statsByAppSelector(Select<Record1<Long>> sele
}


public List<MeasurableRatingTally> statsForRelatedMeasurable(Select<Record1<Long>> selector) {
org.finos.waltz.schema.tables.MeasurableRating related = MEASURABLE_RATING.as("related");
org.finos.waltz.schema.tables.MeasurableRating orig = MEASURABLE_RATING.as("orig");

SelectConditionStep<Record1<Long>> relatedAppIds = DSL
.selectDistinct(orig.ENTITY_ID)
.from(orig)
.where(orig.MEASURABLE_ID.in(selector))
.and(orig.ENTITY_KIND.eq(EntityKind.APPLICATION.name()));

return dsl
.select(related.MEASURABLE_ID,
related.RATING,
DSL.count())
.from(related)
.where(related.ENTITY_ID.in(relatedAppIds))
.groupBy(related.MEASURABLE_ID,
related.RATING)
.fetch(TO_TALLY_MAPPER);
}


public int deleteByMeasurableIdSelector(Select<Record1<Long>> selector) {
return dsl
.deleteFrom(MEASURABLE_RATING)
Expand Down Expand Up @@ -817,4 +767,13 @@ public boolean saveRatingDescription(EntityReference entityRef, long measurableI
description,
username));
}


public MeasurableRatingChangeSummary resolveLoggingContextForRatingChange(EntityReference entityRef,
long measurableId,
String desiredRatingCode) {
return MeasurableRatingHelper.resolveLoggingContextForRatingChange(dsl, entityRef, measurableId, desiredRatingCode);
}


}
Original file line number Diff line number Diff line change
@@ -1,14 +1,26 @@
package org.finos.waltz.data.measurable_rating;

import org.finos.waltz.model.EntityKind;
import org.finos.waltz.model.EntityReference;
import org.finos.waltz.model.ImmutableEntityReference;
import org.finos.waltz.model.measurable_rating.ImmutableMeasurableRatingChangeSummary;
import org.finos.waltz.model.measurable_rating.MeasurableRatingChangeSummary;
import org.finos.waltz.schema.tables.*;
import org.finos.waltz.schema.tables.records.MeasurableRatingRecord;
import org.jooq.Condition;
import org.jooq.DSLContext;
import org.jooq.Record;
import org.jooq.SelectConditionStep;
import org.jooq.impl.DSL;
import org.jooq.lambda.tuple.Tuple2;

import static org.finos.waltz.common.DateTimeUtilities.nowUtcTimestamp;
import static org.finos.waltz.data.measurable.MeasurableIdSelectorFactory.allMeasurablesIdsInSameCategory;
import static org.finos.waltz.model.EntityReference.mkRef;
import static org.finos.waltz.schema.Tables.*;
import static org.finos.waltz.schema.tables.Measurable.MEASURABLE;
import static org.finos.waltz.schema.tables.MeasurableRating.MEASURABLE_RATING;
import static org.jooq.lambda.tuple.Tuple.tuple;

public class MeasurableRatingHelper {

Expand Down Expand Up @@ -63,12 +75,12 @@ public static boolean saveRatingDescription(DSLContext tx,


/**
* @param tx
* @param entityRef
* @param measurableId
* @param ratingCode
* @param username
* @return
* @param tx the dsl context to use
* @param entityRef the entity the rating is against, usually an app
* @param measurableId the measurable being rated against the entity
* @param ratingCode the rating code to use
* @param username who is doing the rating
* @return true iff the item was saved
*/
public static boolean saveRatingItem(DSLContext tx,
EntityReference entityRef,
Expand Down Expand Up @@ -125,4 +137,82 @@ private static Condition mkPkCondition(EntityReference entityRef,
}


/**
* Given and entity, a measurable and a desired rating code this will
* return an object with the following:
*
* <ul>
* <li>Resolved measurable name and id</li>
* <li>Resolved measurable category name and id</li>
* <li>Maybe a tuple of any current mapping name and code</li>
* <li>Maybe a tuple of the desired mapping name and code</li>
* </ul>
*
* The main use of this method is to provide additional logging context
*
* @param tx dslContext to issue the query with
* @param entityRef the entity which needs the new rating
* @param measurableId the measurable id for the new rating
* @param desiredRatingCode the rating code for the new rating
* @return resolved names
*/
public static MeasurableRatingChangeSummary resolveLoggingContextForRatingChange(DSLContext tx,
EntityReference entityRef,
long measurableId,
String desiredRatingCode) {

Measurable m = MEASURABLE.as("m");
MeasurableCategory mc = MEASURABLE_CATEGORY.as("mc");
org.finos.waltz.schema.tables.MeasurableRating mr = MEASURABLE_RATING.as("mr");
RatingScheme rs = RATING_SCHEME.as("rs");
RatingSchemeItem current = RATING_SCHEME_ITEM.as("current");
RatingSchemeItem desired = RATING_SCHEME_ITEM.as("desired");
Application app = APPLICATION.as("app");

SelectConditionStep<Record> qry = tx
.select(m.NAME, m.ID)
.select(mc.NAME, mc.ID)
.select(app.NAME, app.ID)
.select(current.NAME, current.CODE)
.select(desired.NAME, desired.CODE)
.from(m)
.innerJoin(mc).on(mc.ID.eq(m.MEASURABLE_CATEGORY_ID))
.innerJoin(rs).on(rs.ID.eq(mc.RATING_SCHEME_ID))
.innerJoin(app).on(app.ID.eq(entityRef.id()))
.leftJoin(mr).on(mr.MEASURABLE_ID.eq(m.ID)
.and(mr.ENTITY_ID.eq(entityRef.id()))
.and(mr.ENTITY_KIND.eq(entityRef.kind().name())))
.leftJoin(current).on(current.CODE.eq(mr.RATING)
.and(current.SCHEME_ID.eq(rs.ID)))
.leftJoin(desired).on(desired.CODE.eq(desiredRatingCode)
.and(desired.SCHEME_ID.eq(rs.ID)))
.where(m.ID.eq(measurableId));

return qry
.fetchOne(r -> {
String currentCode = r.get(current.CODE);
String currentName = r.get(current.NAME);
String desiredCode = r.get(desired.CODE);
String desiredName = r.get(desired.NAME);

Tuple2<String, String> currentRatingNameAndCode = currentCode == null
? null
: tuple(currentName, currentCode);

Tuple2<String, String> desiredRatingNameAndCode = desiredCode == null
? null
: tuple(desiredName, desiredCode);

return ImmutableMeasurableRatingChangeSummary
.builder()
.measurableRef(mkRef(EntityKind.MEASURABLE, measurableId, r.get(m.NAME)))
.measurableCategoryRef(mkRef(EntityKind.MEASURABLE_CATEGORY, r.get(mc.ID), r.get(mc.NAME)))
.entityRef(ImmutableEntityReference.copyOf(entityRef).withName(r.get(app.NAME)))
.currentRatingNameAndCode(currentRatingNameAndCode)
.desiredRatingNameAndCode(desiredRatingNameAndCode)
.build();
});

}

}
Loading
Loading