Skip to content

Commit

Permalink
Enum calc migration (#470)
Browse files Browse the repository at this point in the history
* Enum calculation migration
* Migrated all calculations
* migrate remaining functions and spec
  • Loading branch information
dhuebner authored and jim-h-wang committed Sep 4, 2019
1 parent fbc15c7 commit 850e429
Show file tree
Hide file tree
Showing 11 changed files with 184 additions and 467 deletions.
26 changes: 14 additions & 12 deletions src/main/java/org/isda/cdm/functions/CalculationPeriodImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.time.chrono.IsoChronology;
import java.time.temporal.ChronoUnit;

import org.isda.cdm.CalculationPeriodData;
import org.isda.cdm.CalculationPeriodDates;

import com.opengamma.strata.basics.ReferenceData;
Expand All @@ -18,7 +19,7 @@
import com.rosetta.model.lib.records.Date;
import com.rosetta.model.lib.records.DateImpl;

public class CalculationPeriodImpl implements CalculationPeriod {
public class CalculationPeriodImpl extends CalculationPeriod {

private final Date referenceDate;

Expand All @@ -27,11 +28,7 @@ public CalculationPeriodImpl(Date referenceDate) {
}

@Override
public CalculationResult execute(CalculationPeriodDates calculationPeriodDates) {
return execute(calculationPeriodDates, referenceDate.toLocalDate());
}

private CalculationResult execute(CalculationPeriodDates calculationPeriodDates, LocalDate referenceDate) {
protected CalculationPeriodData doEvaluate(CalculationPeriodDates calculationPeriodDates) {
PeriodicSchedule periodicSchedule = PeriodicSchedule.of(
calculationPeriodDates.getEffectiveDate().getAdjustableDate().getUnadjustedDate().toLocalDate(),
calculationPeriodDates.getTerminationDate().getAdjustableDate().getUnadjustedDate().toLocalDate(),
Expand All @@ -43,7 +40,7 @@ private CalculationResult execute(CalculationPeriodDates calculationPeriodDates,
Schedule schedule = periodicSchedule.createSchedule(ReferenceData.minimal());

SchedulePeriod targetPeriod = schedule.getPeriods().stream()
.filter(period -> !(referenceDate.isBefore(period.getStartDate())) && referenceDate.isBefore(period.getEndDate()))
.filter(period -> !(toLocalDate(referenceDate).isBefore(period.getStartDate())) && toLocalDate(referenceDate).isBefore(period.getEndDate()))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("Date " + referenceDate.toString() + "not within schedule"));

Expand All @@ -54,11 +51,16 @@ private CalculationResult execute(CalculationPeriodDates calculationPeriodDates,
}
}

return new CalculationResult()
.setStartDate(new DateImpl(targetPeriod.getStartDate()))
.setEndDate(new DateImpl(targetPeriod.getEndDate()))
.setDaysInLeapYearPeriod(daysThatAreInLeapYear)
.setDaysInPeriod((int) ChronoUnit.DAYS.between(targetPeriod.getStartDate(), targetPeriod.getEndDate()));
return CalculationPeriodData.builder()
.setStartDate(new DateImpl(targetPeriod.getStartDate()))
.setEndDate(new DateImpl(targetPeriod.getEndDate()))
.setDaysInLeapYearPeriod(daysThatAreInLeapYear)
.setDaysInPeriod((int) ChronoUnit.DAYS.between(targetPeriod.getStartDate(), targetPeriod.getEndDate()))
.build();
}

private LocalDate toLocalDate(Date date) {
return LocalDate.of(date.getYear(), date.getMonth(), date.getDay());
}

}

This file was deleted.

10 changes: 0 additions & 10 deletions src/main/java/org/isda/cdm/functions/ResolveRateOfReturnImpl.java

This file was deleted.

297 changes: 125 additions & 172 deletions src/main/rosetta/model-cdm-calculations.rosetta

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/main/rosetta/model-cdm-event-functions.rosetta
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ func CalculationPeriodSpec: <"A product agnostic approach to extracting the calc
result DateRange (1..1)


func GetBusinessDateSpec: <"A function to be implementated by CDM users for systematic implementations to provide a business date">
func GetBusinessDateSpec: <"A function to be implemented by CDM users for systematic implementations to provide a business date">
output:
result date (1..1)

Expand Down
7 changes: 0 additions & 7 deletions src/main/rosetta/model-cdm-product.rosetta
Original file line number Diff line number Diff line change
Expand Up @@ -351,13 +351,6 @@ data rule ResolvablePayoutQuantity_quantityMultiplier <"A quantity reference mus
when ResolvablePayoutQuantity -> quantityMultiplier exists
then ResolvablePayoutQuantity -> quantityReference exists

spec ResolveQuantity <"Function specification to resolve a payout quantity, specified as a resolvable quantity with inputs for the resolution, into a basic quantity with just a number and a unit.">:
inputs:
resolvableQuantity ResolvablePayoutQuantity (1..1) <"The quantity to resolve.">
date date (1..1)
output:
quantity Quantity (1..1) <"The resolved quantity, containing just a number and (optionally) a unit or currency.">

class CrossCurrencyTerms
{
principalExchanges PrincipalExchanges (0..1);
Expand Down
222 changes: 0 additions & 222 deletions src/main/rosetta/model-no-code-gen.rosetta

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.isda.cdm.BusinessCenters;
import org.isda.cdm.BusinessDayAdjustments;
import org.isda.cdm.BusinessDayConventionEnum;
import org.isda.cdm.CalculationPeriodData;
import org.isda.cdm.CalculationPeriodDates;
import org.isda.cdm.CalculationPeriodFrequency;
import org.isda.cdm.PeriodExtendedEnum;
Expand Down Expand Up @@ -63,16 +64,16 @@ class CalculationPeriodImplTest {
@Test
void shouldReturnStartAndEndDateOfFirstPeriod() {
CalculationPeriod usingStartDatePeriodCalculator = new CalculationPeriodImpl(DateImpl.of(2018, 1, 3));
CalculationPeriod.CalculationResult usingStartDate = usingStartDatePeriodCalculator.execute(calculationPeriodDates);
CalculationPeriodData usingStartDate = usingStartDatePeriodCalculator.evaluate(calculationPeriodDates);

assertThat(usingStartDate.getStartDate(), is(DateImpl.of(2018, 1, 3)));
assertThat(usingStartDate.getEndDate(), is(DateImpl.of(2018, 4, 3)));

CalculationPeriod usingAnyDatePeriodCalculator = new CalculationPeriodImpl(DateImpl.of(2018, 2, 14));
CalculationPeriod.CalculationResult usingAnyDate = usingAnyDatePeriodCalculator.execute(calculationPeriodDates);
CalculationPeriodData usingAnyDate = usingAnyDatePeriodCalculator.evaluate(calculationPeriodDates);

CalculationPeriod usingEndDatePeriodCalculator = new CalculationPeriodImpl(DateImpl.of(2018, 3, 31));
CalculationPeriod.CalculationResult usingEndDate = usingEndDatePeriodCalculator.execute(calculationPeriodDates);
CalculationPeriodData usingEndDate = usingEndDatePeriodCalculator.evaluate(calculationPeriodDates);

assertThat(usingStartDate, allOf(is(usingAnyDate), is(usingEndDate)));
}
Expand All @@ -89,7 +90,7 @@ void shouldThrowWhenRollConventionNotTerminationDay() {
.setCalculationPeriodFrequency(frequency)
.build();

Executable result = () -> unit.execute(calculationPeriodDates);
Executable result = () -> unit.evaluate(calculationPeriodDates);

assertThrows(ScheduleException.class, result, "Date '2018-01-03' does not match roll convention 'Day1' when starting to roll forwards");
}
Expand Down
Loading

0 comments on commit 850e429

Please sign in to comment.