Search in sources :

Example 11 with Attribute

use of org.openforis.idm.model.Attribute in project collect by openforis.

the class RecordIndexManager method index.

protected void index(final IndexWriter indexWriter, CollectRecord record) throws RecordIndexException {
    try {
        Entity rootEntity = record.getRootEntity();
        rootEntity.traverse(new NodeVisitor() {

            @Override
            public void visit(Node<? extends NodeDefinition> node, int idx) {
                NodeDefinition defn = node.getDefinition();
                if (defn instanceof AttributeDefinition) {
                    index(indexWriter, (Attribute<?, ?>) node);
                }
            }
        });
    } catch (Exception e) {
        throw new RecordIndexException(e);
    }
}
Also used : Entity(org.openforis.idm.model.Entity) Attribute(org.openforis.idm.model.Attribute) NodeDefinition(org.openforis.idm.metamodel.NodeDefinition) AttributeDefinition(org.openforis.idm.metamodel.AttributeDefinition) ParseException(org.apache.lucene.queryParser.ParseException) IOException(java.io.IOException) NodeVisitor(org.openforis.idm.model.NodeVisitor)

Example 12 with Attribute

use of org.openforis.idm.model.Attribute in project collect by openforis.

the class RecordUpdater method recalculateDependentCalculatedAttributes.

private List<Attribute<?, ?>> recalculateDependentCalculatedAttributes(Node<?> node) {
    Record record = node.getRecord();
    List<Attribute<?, ?>> attributesToRecalculate = record.determineCalculatedAttributes(node);
    return recalculateValues(attributesToRecalculate);
}
Also used : CodeAttribute(org.openforis.idm.model.CodeAttribute) Attribute(org.openforis.idm.model.Attribute) BooleanAttribute(org.openforis.idm.model.BooleanAttribute) Record(org.openforis.idm.model.Record)

Example 13 with Attribute

use of org.openforis.idm.model.Attribute in project collect by openforis.

the class RecordUpdater method applyInitialValues.

private List<Attribute<?, ?>> applyInitialValues(Entity entity) {
    final List<Attribute<?, ?>> updatedAttributes = new ArrayList<Attribute<?, ?>>();
    entity.traverse(new NodeVisitor() {

        public void visit(Node<?> node, int idx) {
            if (node instanceof Attribute && node.isEmpty()) {
                Attribute<?, ?> attr = (Attribute<?, ?>) node;
                Value value = applyInitialValue(attr);
                if (value != null) {
                    updatedAttributes.add(attr);
                }
            }
        }
    });
    return updatedAttributes;
}
Also used : CodeAttribute(org.openforis.idm.model.CodeAttribute) Attribute(org.openforis.idm.model.Attribute) BooleanAttribute(org.openforis.idm.model.BooleanAttribute) ArrayList(java.util.ArrayList) Value(org.openforis.idm.model.Value) BooleanValue(org.openforis.idm.model.BooleanValue) NodeVisitor(org.openforis.idm.model.NodeVisitor)

Example 14 with Attribute

use of org.openforis.idm.model.Attribute in project collect by openforis.

the class RecordUpdater method recalculateValues.

@SuppressWarnings({ "rawtypes", "unchecked" })
private List<Attribute<?, ?>> recalculateValues(List<Attribute<?, ?>> attributesToRecalculate) {
    List<Attribute<?, ?>> updatedAttributes = new ArrayList<Attribute<?, ?>>();
    for (Attribute calcAttr : attributesToRecalculate) {
        Value previousValue = calcAttr.getValue();
        Value newValue = recalculateValue(calcAttr);
        if (!((previousValue == newValue) || (previousValue != null && previousValue.equals(newValue)))) {
            calcAttr.setValue(newValue);
            calcAttr.updateSummaryInfo();
            updatedAttributes.add(calcAttr);
        }
    }
    return updatedAttributes;
}
Also used : CodeAttribute(org.openforis.idm.model.CodeAttribute) Attribute(org.openforis.idm.model.Attribute) BooleanAttribute(org.openforis.idm.model.BooleanAttribute) ArrayList(java.util.ArrayList) Value(org.openforis.idm.model.Value) BooleanValue(org.openforis.idm.model.BooleanValue)

Example 15 with Attribute

use of org.openforis.idm.model.Attribute in project collect by openforis.

the class RecordUpdater method afterAttributeInsertOrUpdate.

private NodeChangeSet afterAttributeInsertOrUpdate(NodeChangeMap changeMap, Attribute<?, ?> attribute) {
    attribute.updateSummaryInfo();
    Record record = attribute.getRecord();
    NodePointer attributeNodePointer = new NodePointer(attribute);
    List<Attribute<?, ?>> updatedAttributes = new ArrayList<Attribute<?, ?>>();
    // calculated attributes
    List<Attribute<?, ?>> updatedCalculatedAttributes = recalculateDependentCalculatedAttributes(attribute);
    updatedAttributes.addAll(updatedCalculatedAttributes);
    changeMap.addValueChanges(updatedCalculatedAttributes);
    // dependent code attributes
    if (attribute instanceof CodeAttribute && clearDependentCodeAttributes) {
        Set<CodeAttribute> updatedCodeAttributes = clearDependentCodeAttributes(attribute);
        updatedAttributes.addAll(updatedCodeAttributes);
        changeMap.addValueChanges(updatedCodeAttributes);
    }
    if (validateAfterUpdate) {
        // relevance
        Collection<Node<?>> nodesToCheckRelevanceFor = new ArrayList<Node<?>>(updatedAttributes);
        nodesToCheckRelevanceFor.add(attribute);
        List<NodePointer> relevanceToUpdate = record.determineRelevanceDependentNodes(nodesToCheckRelevanceFor);
        RelevanceUpdater relevanceUpdater = new RelevanceUpdater(relevanceToUpdate);
        Set<NodePointer> updatedRelevancePointers = relevanceUpdater.update();
        Set<Node<?>> updatedRelevanceNodes = pointersToNodes(updatedRelevancePointers);
        // apply default values to relevant nodes (if not applied yet)
        for (Node<?> updatedRelevanceNode : updatedRelevanceNodes) {
            if (updatedRelevanceNode instanceof Attribute) {
                Attribute<?, ?> updatedRelevanceAttr = (Attribute<?, ?>) updatedRelevanceNode;
                if (!updatedRelevanceAttr.getDefinition().isCalculated()) {
                    if (updatedRelevanceAttr.isEmpty() || isDefaultValueApplied(updatedRelevanceAttr)) {
                        Value appliedValue = applyInitialValue(updatedRelevanceAttr);
                        if (appliedValue != null) {
                            updatedAttributes.add((Attribute<?, ?>) updatedRelevanceNode);
                        }
                    }
                }
            }
        }
        changeMap.addRelevanceChanges(updatedRelevancePointers);
        if (clearNotRelevantAttributes) {
            Set<Attribute<?, ?>> noMoreRelevantAttributes = retainNotRelevantAttributes(updatedRelevanceNodes);
            Set<Attribute<?, ?>> clearedAttributes = clearUserSpecifiedAttributes(noMoreRelevantAttributes);
            updatedAttributes.addAll(clearedAttributes);
            changeMap.addValueChanges(clearedAttributes);
        }
        // min count
        Collection<NodePointer> pointersToCheckMinCountFor = new HashSet<NodePointer>(updatedRelevancePointers);
        pointersToCheckMinCountFor.add(attributeNodePointer);
        pointersToCheckMinCountFor.addAll(nodesToPointers(updatedAttributes));
        Collection<NodePointer> minCountPointersToUpdate = record.determineMinCountDependentNodes(pointersToCheckMinCountFor);
        Collection<NodePointer> updatedMinCountPointers = updateMinCount(minCountPointersToUpdate);
        changeMap.addMinCountChanges(updatedMinCountPointers);
        // max count
        Collection<NodePointer> pointersToCheckMaxCountFor = new HashSet<NodePointer>(updatedRelevancePointers);
        pointersToCheckMaxCountFor.add(attributeNodePointer);
        pointersToCheckMaxCountFor.addAll(nodesToPointers(updatedAttributes));
        Collection<NodePointer> maxCountPointersToUpdate = record.determineMaxCountDependentNodes(pointersToCheckMaxCountFor);
        Collection<NodePointer> updatedMaxCountPointers = updateMaxCount(maxCountPointersToUpdate);
        changeMap.addMaxCountChanges(updatedMaxCountPointers);
        Set<NodePointer> updatedCardinalityPointers = new HashSet<NodePointer>(updatedMinCountPointers);
        updatedCardinalityPointers.addAll(updatedMaxCountPointers);
        // validate cardinality
        List<NodePointer> ancestorsAndSelfPointers = getAncestorsAndSelfPointers(attribute);
        Set<NodePointer> pointersToValidateCardinalityFor = new HashSet<NodePointer>(updatedMinCountPointers.size() + updatedMaxCountPointers.size() + updatedRelevancePointers.size() + ancestorsAndSelfPointers.size());
        pointersToValidateCardinalityFor.addAll(nodesToPointers(updatedAttributes));
        pointersToValidateCardinalityFor.addAll(updatedMinCountPointers);
        pointersToValidateCardinalityFor.addAll(updatedMaxCountPointers);
        pointersToValidateCardinalityFor.addAll(updatedRelevancePointers);
        // validate cardinality on ancestor node pointers because we are considering empty nodes as missing nodes
        pointersToValidateCardinalityFor.addAll(ancestorsAndSelfPointers);
        validateCardinality(record, pointersToValidateCardinalityFor, changeMap);
        // validate attributes
        Set<Node<?>> nodesToCheckValidationFor = new HashSet<Node<?>>(updatedAttributes);
        nodesToCheckValidationFor.add(attribute);
        nodesToCheckValidationFor.addAll(updatedRelevanceNodes);
        nodesToCheckValidationFor.addAll(pointersToNodes(updatedCardinalityPointers));
        Set<Attribute<?, ?>> attributesToRevalidate = record.determineValidationDependentNodes(nodesToCheckValidationFor);
        validateAttributes(record, attributesToRevalidate, changeMap);
    }
    return changeMap;
}
Also used : CodeAttribute(org.openforis.idm.model.CodeAttribute) Attribute(org.openforis.idm.model.Attribute) BooleanAttribute(org.openforis.idm.model.BooleanAttribute) Node(org.openforis.idm.model.Node) ArrayList(java.util.ArrayList) NodePointer(org.openforis.idm.model.NodePointer) CodeAttribute(org.openforis.idm.model.CodeAttribute) Value(org.openforis.idm.model.Value) BooleanValue(org.openforis.idm.model.BooleanValue) Record(org.openforis.idm.model.Record) HashSet(java.util.HashSet) LinkedHashSet(java.util.LinkedHashSet)

Aggregations

Attribute (org.openforis.idm.model.Attribute)23 ArrayList (java.util.ArrayList)8 Entity (org.openforis.idm.model.Entity)8 BooleanAttribute (org.openforis.idm.model.BooleanAttribute)7 CodeAttribute (org.openforis.idm.model.CodeAttribute)7 Value (org.openforis.idm.model.Value)6 AttributeDefinition (org.openforis.idm.metamodel.AttributeDefinition)5 Node (org.openforis.idm.model.Node)5 Test (org.junit.Test)4 NodeDefinition (org.openforis.idm.metamodel.NodeDefinition)4 Record (org.openforis.idm.model.Record)4 TextAttribute (org.openforis.idm.model.TextAttribute)4 HashSet (java.util.HashSet)3 LinkedHashSet (java.util.LinkedHashSet)3 BooleanValue (org.openforis.idm.model.BooleanValue)3 NodePointer (org.openforis.idm.model.NodePointer)3 NodeVisitor (org.openforis.idm.model.NodeVisitor)3 TextValue (org.openforis.idm.model.TextValue)3 EntityDefinition (org.openforis.idm.metamodel.EntityDefinition)2 FileAttribute (org.openforis.idm.model.FileAttribute)2