package com.constellio.sdk.tests.schemas;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import org.joda.time.Days;
import org.joda.time.LocalDateTime;
import com.constellio.model.entities.calculators.CalculatorParameters;
import com.constellio.model.entities.calculators.MetadataValueCalculator;
import com.constellio.model.entities.calculators.dependencies.Dependency;
import com.constellio.model.entities.calculators.dependencies.LocalDependency;
import com.constellio.model.entities.calculators.dependencies.ReferenceDependency;
import com.constellio.model.entities.schemas.MetadataValueType;
public class DaysBetweenMultivalueLocalDateAndAnotherSchemaRequiredDateCalculator implements MetadataValueCalculator<Double> {
public static AtomicInteger invokationCounter = new AtomicInteger();
ReferenceDependency<List<LocalDateTime>> anotherSchemaDateParam = ReferenceDependency
.toADateTime("dateRef", "dateMeta").whichIsMultivalue().whichIsRequired();
LocalDependency<List<LocalDateTime>> dateParam = LocalDependency.toADateTime("dateTimeMetadata").whichIsMultivalue()
.whichIsRequired();
@Override
public Double calculate(CalculatorParameters values) {
invokationCounter.incrementAndGet();
List<LocalDateTime> anotherSchemaDateList = values.get(anotherSchemaDateParam);
List<LocalDateTime> dateList = values.get(dateParam);
Double maxDaysBetween = 0.0;
for (LocalDateTime anotherSchemaDate : anotherSchemaDateList) {
for (LocalDateTime date : dateList) {
Double daysBetween = Math.abs((double) Days.daysBetween(date, anotherSchemaDate).getDays());
maxDaysBetween = Math.max(maxDaysBetween, daysBetween);
}
}
return maxDaysBetween;
}
@Override
public Double getDefaultValue() {
return -1.0;
}
@Override
public MetadataValueType getReturnType() {
return MetadataValueType.NUMBER;
}
@Override
public List<? extends Dependency> getDependencies() {
return Arrays.asList(anotherSchemaDateParam, dateParam);
}
@Override
public boolean isMultiValue() {
return false;
}
}