package com.constellio.model.services.schemas; import static com.constellio.model.entities.schemas.MetadataValueType.DATE_TIME; import static com.constellio.model.entities.schemas.MetadataValueType.NUMBER; import static com.constellio.model.entities.schemas.MetadataValueType.REFERENCE; import static com.constellio.model.entities.schemas.MetadataValueType.STRING; import static com.constellio.model.entities.schemas.MetadataTransiency.TRANSIENT_LAZY; import static com.constellio.sdk.tests.TestUtils.asList; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.constellio.model.entities.Taxonomy; 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.Metadata; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.entities.schemas.MetadataTransiency; import com.constellio.model.entities.schemas.Schemas; import com.constellio.model.services.schemas.builders.MetadataBuilder; import com.constellio.sdk.tests.schemas.SchemasSetup; import com.constellio.sdk.tests.schemas.TestsSchemasSetup; public class ModificationImpactCalculatorAcceptSetup extends TestsSchemasSetup { public List<Taxonomy> taxonomies; public ModificationImpactCalculatorAcceptSetup withStringAndDateMetadataUsedForCopyAndCalculationInOtherSchemas() throws Exception { withABooleanMetadata(); zeDefaultSchemaBuilder.create("stringMetadata").setType(STRING); MetadataBuilder dateMetadata = zeDefaultSchemaBuilder.create("dateTimeMetadata").setType(DATE_TIME); anOtherDefaultSchemaBuilder.create("reference1ToZeSchema") .defineReferencesTo(zeSchemaTypeBuilder); MetadataBuilder anotherSchemaReference2ToZeSchema = anOtherDefaultSchemaBuilder .create("reference2ToZeSchema").defineReferencesTo(zeSchemaTypeBuilder); MetadataBuilder aThirdSchemaReferenceToZeSchema = athirdDefaultSchemaBuilder.create( "referenceToZeSchema").defineReferencesTo(zeSchemaTypeBuilder); anOtherDefaultSchemaBuilder.create("calculatedNumberMetadata") .setType(NUMBER).defineDataEntry() .asCalculated(CalculatorUsingZeSchemaStringMetadata.class); aThirdSchemaTypeBuilder.getDefaultSchema().create("copiedDate") .setType(DATE_TIME).defineDataEntry().asCopied(aThirdSchemaReferenceToZeSchema, dateMetadata); aThirdSchemaTypeBuilder.createCustomSchema("custom1").create("custom1CopiedDate") .setType(DATE_TIME).defineDataEntry().asCopied(aThirdSchemaReferenceToZeSchema, dateMetadata); aThirdSchemaTypeBuilder.createCustomSchema("custom2").create("custom2CopiedDate") .setType(DATE_TIME).defineDataEntry().asCopied(aThirdSchemaReferenceToZeSchema, dateMetadata); anOtherDefaultSchemaBuilder.create("copiedDateMetadata").setType(DATE_TIME).defineDataEntry() .asCopied(anotherSchemaReference2ToZeSchema, dateMetadata); return this; } public ModificationImpactCalculatorAcceptSetup withComputedTitleSizeCopiedInAnotherSchema(MetadataTransiency mode) throws Exception { withAReferenceFromAnotherSchemaToZeSchema(); MetadataBuilder titleLength = zeDefaultSchemaBuilder.create("titleLength").setType(NUMBER).setTransiency(mode) .defineDataEntry().asCalculated(TitleLengthCalculator.class); anOtherSchemaTypeBuilder.getDefaultSchema().create("copiedTitleLength").setType(NUMBER).defineDataEntry().asCopied( anOtherSchemaTypeBuilder.getDefaultSchema().get("referenceFromAnotherSchemaToZeSchema"), titleLength); return this; } public ModificationImpactCalculatorAcceptSetup withComputedTitleSizeCalculatedInAnotherSchema(MetadataTransiency mode) throws Exception { withAReferenceFromAnotherSchemaToZeSchema(); zeDefaultSchemaBuilder.create("titleLength").setType(NUMBER).defineDataEntry().asCalculated(TitleLengthCalculator.class) .setTransiency(mode); anOtherSchemaTypeBuilder.getDefaultSchema().create("calculatedTitleLength").setType(NUMBER).defineDataEntry() .asCalculated(CalculatorCopyingZeSchemaTitleLengthPlusTwo.class); return this; } public ModificationImpactCalculatorAcceptSetup withTaxonomyOfZeSchemaAndAnotherSchemaTypes() { MetadataBuilder zeSchemaParent = zeSchemaTypeBuilder.getDefaultSchema().create("zeSchemaParent") .defineReferencesTo(zeSchemaTypeBuilder); MetadataBuilder anotherSchemaAnotherSchemaParent = zeSchemaTypeBuilder.getDefaultSchema() .create("anotherSchemaAnotherSchemaParent").defineReferencesTo(anOtherSchemaTypeBuilder); MetadataBuilder anotherSchemaZeSchemaParent = anOtherSchemaTypeBuilder.getDefaultSchema() .create("anotherSchemaZeSchemaParent").defineReferencesTo(zeSchemaTypeBuilder); List<String> relations = Arrays.asList(zeSchemaParent.getCode(), anotherSchemaAnotherSchemaParent.getCode(), anotherSchemaZeSchemaParent.getCode()); List<String> taxonomySchemaTypes = Arrays.asList("zeSchemaType", "anotherSchemaType"); Taxonomy taxonomy = Taxonomy.createPublic("myTaxonomy", "myTaxonomy", "zeCollection", taxonomySchemaTypes); taxonomies = Arrays.asList(taxonomy); return this; } public static class CalculatorCopyingZeSchemaTitleLengthPlusTwo implements MetadataValueCalculator<Double> { ReferenceDependency<Double> reference = ReferenceDependency .toANumber("referenceFromAnotherSchemaToZeSchema", "titleLength").whichIsRequired(); @Override public Double calculate(CalculatorParameters parameters) { Double parameter = parameters.get(reference); return parameter + 2; } @Override public Double getDefaultValue() { return 2.0; } @Override public MetadataValueType getReturnType() { return NUMBER; } @Override public boolean isMultiValue() { return false; } @Override public List<? extends Dependency> getDependencies() { return Arrays.asList(reference); } } public static class CalculatorCopyingZeSchemaTitleLengths implements MetadataValueCalculator<List<Double>> { ReferenceDependency<List<Double>> reference = ReferenceDependency .toANumber("referenceFromAnotherSchemaToZeSchema", "titleLength").whichIsRequired().whichIsMultivalue(); @Override public List<Double> calculate(CalculatorParameters parameters) { List<Double> parameter = parameters.get(reference); return parameter; } @Override public List<Double> getDefaultValue() { return new ArrayList<>(); } @Override public MetadataValueType getReturnType() { return NUMBER; } @Override public boolean isMultiValue() { return true; } @Override public List<? extends Dependency> getDependencies() { return Arrays.asList(reference); } } public static class CalculatorUsingZeSchemaStringMetadata implements MetadataValueCalculator<Double> { ReferenceDependency<String> reference = ReferenceDependency .toAString("reference1ToZeSchema", "stringMetadata"); @Override public Double calculate(CalculatorParameters parameters) { String parameter = parameters.get(reference); return Double.valueOf(parameter.length()); } @Override public Double getDefaultValue() { return null; } @Override public MetadataValueType getReturnType() { return NUMBER; } @Override public boolean isMultiValue() { return false; } @Override public List<? extends Dependency> getDependencies() { return Arrays.asList(reference); } } public SchemasSetup withReferenceFromAnotherSchemaToZeSchemaComputedFromStringMetadata( MetadataTransiency transiency) { anOtherSchemaTypeBuilder.getDefaultSchema().create("aString").setType(STRING); anOtherSchemaTypeBuilder.getDefaultSchema().get("referenceFromAnotherSchemaToZeSchema").setTransiency(TRANSIENT_LAZY) .defineDataEntry().asCalculated(ZeReferenceToZeSchemaCalculator.class); return this; } public SchemasSetup withTransientMultivalueReferenceUsedByCopiedMetadata( MetadataTransiency transiency) throws Exception { withAReferenceFromAnotherSchemaToZeSchema(); MetadataBuilder titleLength = zeDefaultSchemaBuilder.create("titleLength").setType(NUMBER).setTransiency(transiency) .defineDataEntry().asCalculated(TitleLengthCalculator.class); anOtherSchemaTypeBuilder.getDefaultSchema().create("copiedTitleLength").setType(NUMBER).setMultivalue(true) .defineDataEntry() .asCopied(anOtherSchemaTypeBuilder.getDefaultSchema().get("referenceFromAnotherSchemaToZeSchema"), titleLength); anOtherSchemaTypeBuilder.getDefaultSchema().create("aString").setType(STRING).setMultivalue(true); anOtherSchemaTypeBuilder.getDefaultSchema().get("referenceFromAnotherSchemaToZeSchema").setMultivalue(true) .setTransiency(transiency).defineDataEntry().asCalculated(MultivalueZeReferenceToZeSchemaCalculator.class); return this; } public SchemasSetup withTransientMultivalueReferenceUsedByCalculatedMetadata( MetadataTransiency transiency) throws Exception { withAReferenceFromAnotherSchemaToZeSchema(); MetadataBuilder titleLength = zeDefaultSchemaBuilder.create("titleLength").setType(NUMBER).setTransiency(transiency) .defineDataEntry().asCalculated(TitleLengthCalculator.class); anOtherSchemaTypeBuilder.getDefaultSchema().create("calculatedTitleLength").setType(NUMBER).setMultivalue(true) .defineDataEntry() .asCalculated(CalculatorCopyingZeSchemaTitleLengths.class); anOtherSchemaTypeBuilder.getDefaultSchema().create("aString").setType(STRING).setMultivalue(true); anOtherSchemaTypeBuilder.getDefaultSchema().get("referenceFromAnotherSchemaToZeSchema").setMultivalue(true) .setTransiency(transiency).defineDataEntry().asCalculated(MultivalueZeReferenceToZeSchemaCalculator.class); return this; } public class ZeSchemaMetadatas extends TestsSchemasSetup.ZeSchemaMetadatas { public Metadata zeSchemaParent() { return getMetadata(code() + "_zeSchemaParent"); } } public class AnotherSchemaMetadatas extends TestsSchemasSetup.AnotherSchemaMetadatas { public Metadata copiedZeSchemaTitleLength() { return getMetadata(code() + "_copiedTitleLength"); } public Metadata calculatedZeSchemaTitleLengthPlusTwo() { return getMetadata(code() + "_calculatedTitleLength"); } public Metadata calculatedZeSchemaTitlesLength() { return getMetadata(code() + "_calculatedTitleLength"); } public Metadata anotherSchemaParent() { return getMetadata(code() + "_anotherSchemaAnotherSchemaParent"); } public Metadata zeSchemaParent() { return getMetadata(code() + "_anotherSchemaZeSchemaParent"); } public List<Metadata> metadataUsingZeSchemaDateAndString() { return asList(anotherDefaultSchema().getMetadata("calculatedNumberMetadata"), anotherDefaultSchema().getMetadata("copiedDateMetadata")); } public Metadata reference1ToZeSchema() { return anotherDefaultSchema().getMetadata("reference1ToZeSchema"); } public Metadata reference2ToZeSchema() { return anotherDefaultSchema().getMetadata("reference2ToZeSchema"); } } public class ThirdSchemaMetadatas extends TestsSchemasSetup.ThirdSchemaMetadatas { public List<Metadata> metadataUsingZeSchemaDateAndString() { Metadata copiedDate = aThirdDefaultSchema().getMetadata("copiedDate"); Metadata custom1CopiedDate = getSchema("aThirdSchemaType_custom1").getMetadata("custom1CopiedDate"); Metadata custom2CopiedDate = getSchema("aThirdSchemaType_custom2").getMetadata("custom2CopiedDate"); return asList(copiedDate, custom1CopiedDate, custom2CopiedDate); } public Metadata referenceToZeSchema() { return aThirdDefaultSchema().getMetadata("referenceToZeSchema"); } } public static class ZeReferenceToZeSchemaCalculator implements MetadataValueCalculator<String> { LocalDependency<String> aStringDependency = LocalDependency.toAString("aString").whichIsRequired(); @Override public String calculate(CalculatorParameters parameters) { String aString = parameters.get(aStringDependency); return aString; } @Override public String getDefaultValue() { return null; } @Override public MetadataValueType getReturnType() { return REFERENCE; } @Override public boolean isMultiValue() { return false; } @Override public List<? extends Dependency> getDependencies() { return Arrays.asList(aStringDependency); } } public static class MultivalueZeReferenceToZeSchemaCalculator implements MetadataValueCalculator<List<String>> { LocalDependency<List<String>> aStringDependency = LocalDependency.toAString("aString").whichIsRequired() .whichIsMultivalue(); @Override public List<String> calculate(CalculatorParameters parameters) { List<String> aString = parameters.get(aStringDependency); return aString; } @Override public List<String> getDefaultValue() { return null; } @Override public MetadataValueType getReturnType() { return REFERENCE; } @Override public boolean isMultiValue() { return true; } @Override public List<? extends Dependency> getDependencies() { return Arrays.asList(aStringDependency); } } public static class TitleLengthCalculator implements MetadataValueCalculator<Double> { LocalDependency<String> titleDependency = LocalDependency.toAString(Schemas.TITLE_CODE).whichIsRequired(); @Override public Double calculate(CalculatorParameters parameters) { String title = parameters.get(titleDependency); return Double.valueOf(title.length()); } @Override public Double getDefaultValue() { return 0.0; } @Override public MetadataValueType getReturnType() { return NUMBER; } @Override public boolean isMultiValue() { return false; } @Override public List<? extends Dependency> getDependencies() { return Arrays.asList(titleDependency); } } }