Search in sources :

Example 6 with MultiValue

use of eu.esdihumboldt.cst.MultiValue in project hale by halestudio.

the class TargetCollector method toMultiValue.

/**
 * Transforms the closures added to this collector to a {@link MultiValue}
 * using the supplied builder.
 *
 * @param builder the instance builder for creating target instances
 * @param type the type of the instance to create
 * @param log the log
 * @return a result value for all closures added to this collector
 * @throws TransformationException if some of the collected targets do not
 *             match the specified type
 */
public MultiValue toMultiValue(InstanceBuilder builder, TypeDefinition type, SimpleLog log) throws TransformationException {
    MultiValue result = new MultiValue(size());
    // a) closures not allowed if the target is no instance
    if (containsClosures && type.getChildren().isEmpty()) {
        throw new TransformationException("An instance is not applicable for the target.");
    }
    // b) values not allowed if the target may not have a value
    if (containsValues && !type.getConstraint(HasValueFlag.class).isEnabled() && !type.getConstraint(AugmentedValueFlag.class).isEnabled()) {
        // this may be desired, e.g. when producing geometries for GML
        if (containsGeometries) {
            // only warning message for geometries
            log.warn("Value provided for target that does not allow a value according to the schema, contains geometries");
        } else {
            // instead of a hard error, we just log an error
            log.error("Value provided for target that does not allow a value according to the schema");
        }
    }
    for (TargetData data : targetData) {
        Object value;
        if (data.instance != null) {
            Instance instance = data.instance;
            // value as instance value
            if (data.value != null && instance instanceof MutableInstance) {
                ((MutableInstance) instance).setValue(data.value);
            }
            value = instance;
        } else {
            value = data.value;
        }
        result.add(value);
    }
    return result;
}
Also used : TransformationException(eu.esdihumboldt.hale.common.align.transformation.function.TransformationException) AugmentedValueFlag(eu.esdihumboldt.hale.common.schema.model.constraint.type.AugmentedValueFlag) MutableInstance(eu.esdihumboldt.hale.common.instance.model.MutableInstance) Instance(eu.esdihumboldt.hale.common.instance.model.Instance) MutableInstance(eu.esdihumboldt.hale.common.instance.model.MutableInstance) MultiValue(eu.esdihumboldt.cst.MultiValue)

Example 7 with MultiValue

use of eu.esdihumboldt.cst.MultiValue in project hale by halestudio.

the class AssignFromCollector method evaluate.

/**
 * @see eu.esdihumboldt.hale.common.align.transformation.function.impl.AbstractSingleTargetPropertyTransformation#evaluate(java.lang.String,
 *      eu.esdihumboldt.hale.common.align.transformation.engine.TransformationEngine,
 *      com.google.common.collect.ListMultimap, java.lang.String,
 *      eu.esdihumboldt.hale.common.align.model.impl.PropertyEntityDefinition,
 *      java.util.Map,
 *      eu.esdihumboldt.hale.common.align.transformation.report.TransformationLog)
 */
@Override
protected Object evaluate(String transformationIdentifier, TransformationEngine engine, ListMultimap<String, PropertyValue> variables, String resultName, PropertyEntityDefinition resultProperty, Map<String, String> executionParameters, TransformationLog log) throws TransformationException, NoResultException {
    // XXX check anchor?
    final Collector mainCollector = (Collector) getExecutionContext().getTransformationContext().get(ContextHelpers.KEY_COLLECTOR);
    if (mainCollector == null) {
        throw new TransformationException("Fatal: No collector has been created yet. Check function priority.");
    }
    final ParameterValue collectorName = getParameterChecked(PARAMETER_COLLECTOR);
    if (collectorName == null || collectorName.isEmpty()) {
        throw new TransformationException("Fatal: No collector name was specified.");
    }
    final Collector collector = mainCollector.getAt(collectorName.getValue().toString());
    if (collector == null) {
        throw new TransformationException(MessageFormat.format("Error retrieving collector \"{0}\"", collectorName.getValue().toString()));
    } else if (collector.values().isEmpty()) {
        log.warn(new TransformationMessageImpl(getCell(), MessageFormat.format("Collector \"{0}\" contains no values. If this is unexpected, check the spelling of the collector name and the priority of the transformation function.", collectorName.getStringRepresentation()), null));
    }
    // Determine where to assign the collected values
    final TypeDefinition resultPropertyType = resultProperty.getDefinition().getPropertyType();
    final PropertyDefinition targetProperty;
    final ResultStrategy resultStrategy;
    if (resultPropertyType.getConstraint(HasValueFlag.class).isEnabled()) {
        // The result property can take values, therefore assign directly to
        // property
        targetProperty = resultProperty.getDefinition();
        // No instance creation is required in this case
        resultStrategy = ResultStrategy.USE_VALUE;
    } else {
        // Find child element/attribute that can be assigned the reference
        targetProperty = Optional.ofNullable(findReferenceChildProperty(resultPropertyType)).orElseThrow(() -> new TransformationException("Fatal: No child property could be found to assign a reference to."));
        resultStrategy = ResultStrategy.BUILD_INSTANCE;
    }
    List<Object> collectedReferences = helper.extractCollectedValues(collector);
    // Process collected values if target property is a reference, otherwise
    // use plain values
    final Function<Object, Object> referenceStrategy;
    if (targetProperty.getConstraint(Reference.class).isReference()) {
        final Reference referenceConstraint = targetProperty.getConstraint(Reference.class);
        // Use the idToReference method to construct the reference
        referenceStrategy = referenceConstraint::idToReference;
    } else {
        referenceStrategy = Function.identity();
    }
    MultiValue result = new MultiValue();
    collectedReferences.forEach(ref -> result.add(resultStrategy.createResult(resultPropertyType, targetProperty, referenceStrategy.apply(ref))));
    return result;
}
Also used : TransformationException(eu.esdihumboldt.hale.common.align.transformation.function.TransformationException) ParameterValue(eu.esdihumboldt.hale.common.align.model.ParameterValue) Reference(eu.esdihumboldt.hale.common.schema.model.constraint.property.Reference) HasValueFlag(eu.esdihumboldt.hale.common.schema.model.constraint.type.HasValueFlag) PropertyDefinition(eu.esdihumboldt.hale.common.schema.model.PropertyDefinition) TransformationMessageImpl(eu.esdihumboldt.hale.common.align.transformation.report.impl.TransformationMessageImpl) TypeDefinition(eu.esdihumboldt.hale.common.schema.model.TypeDefinition) Collector(eu.esdihumboldt.cst.functions.groovy.helpers.util.Collector) MultiValue(eu.esdihumboldt.cst.MultiValue)

Aggregations

MultiValue (eu.esdihumboldt.cst.MultiValue)7 MutableInstance (eu.esdihumboldt.hale.common.instance.model.MutableInstance)3 TypeDefinition (eu.esdihumboldt.hale.common.schema.model.TypeDefinition)3 TargetNode (eu.esdihumboldt.hale.common.align.model.transformation.tree.TargetNode)2 PropertyValue (eu.esdihumboldt.hale.common.align.transformation.function.PropertyValue)2 TransformationException (eu.esdihumboldt.hale.common.align.transformation.function.TransformationException)2 Instance (eu.esdihumboldt.hale.common.instance.model.Instance)2 DefaultInstance (eu.esdihumboldt.hale.common.instance.model.impl.DefaultInstance)2 Collector (eu.esdihumboldt.cst.functions.groovy.helpers.util.Collector)1 EntityDefinition (eu.esdihumboldt.hale.common.align.model.EntityDefinition)1 ParameterValue (eu.esdihumboldt.hale.common.align.model.ParameterValue)1 PropertyEntityDefinition (eu.esdihumboldt.hale.common.align.model.impl.PropertyEntityDefinition)1 SourceNode (eu.esdihumboldt.hale.common.align.model.transformation.tree.SourceNode)1 TransformationEngine (eu.esdihumboldt.hale.common.align.transformation.engine.TransformationEngine)1 PropertyTransformation (eu.esdihumboldt.hale.common.align.transformation.function.PropertyTransformation)1 PropertyValueImpl (eu.esdihumboldt.hale.common.align.transformation.function.impl.PropertyValueImpl)1 TransformationLog (eu.esdihumboldt.hale.common.align.transformation.report.TransformationLog)1 CellLog (eu.esdihumboldt.hale.common.align.transformation.report.impl.CellLog)1 TransformationMessageImpl (eu.esdihumboldt.hale.common.align.transformation.report.impl.TransformationMessageImpl)1 Value (eu.esdihumboldt.hale.common.core.io.Value)1