use of org.openforis.idm.model.Node in project collect by openforis.
the class RecordUpdater method initializeEntity.
protected NodeChangeMap initializeEntity(Entity entity, boolean newEntity) {
Record record = entity.getRecord();
NodeChangeMap changeMap = new NodeChangeMap();
changeMap.addEntityAddChange(entity);
List<NodePointer> entityDescendantPointers = getDescendantNodePointers(entity);
updateMinCount(entityDescendantPointers);
updateMaxCount(entityDescendantPointers);
addEmptyNodes(entity);
applyInitialValues(entity);
// recalculate attributes
// TODO exclude this when exporting for backup (not for Calc)
List<Attribute<?, ?>> calculatedAttributes = recalculateDependentCalculatedAttributes(entity);
changeMap.addValueChanges(calculatedAttributes);
if (validateAfterUpdate) {
// min/max count
entityDescendantPointers = getDescendantNodePointers(entity);
// for root entity there is no node pointer so we iterate over its descendants
Collection<NodePointer> minCountDependentNodes = record.determineMinCountDependentNodes(entityDescendantPointers);
Collection<NodePointer> updatedMinCountPointers = updateMinCount(minCountDependentNodes);
changeMap.addMinCountChanges(updatedMinCountPointers);
Collection<NodePointer> maxCountDependentNodes = record.determineMaxCountDependentNodes(entityDescendantPointers);
Collection<NodePointer> updatedMaxCountPointers = updateMaxCount(maxCountDependentNodes);
changeMap.addMaxCountChanges(updatedMaxCountPointers);
Set<NodePointer> updatedCardinalityPointers = new HashSet<NodePointer>(updatedMinCountPointers);
updatedCardinalityPointers.addAll(updatedMaxCountPointers);
// relevance
Set<NodePointer> pointersToRecalculateRelevanceFor = new HashSet<NodePointer>();
pointersToRecalculateRelevanceFor.addAll(getChildNodePointers(entity));
pointersToRecalculateRelevanceFor.addAll(record.determineRelevanceDependentNodes(calculatedAttributes));
if (entity.getParent() != null) {
pointersToRecalculateRelevanceFor.addAll(record.determineRelevanceDependentNodePointers(Arrays.asList(new NodePointer(entity))));
}
Set<NodePointer> updatedRelevancePointers = new RelevanceUpdater(new ArrayList<NodePointer>(pointersToRecalculateRelevanceFor)).update();
changeMap.addRelevanceChanges(updatedRelevancePointers);
// cardinality
Collection<NodePointer> nodePointersToCheckCardinalityFor = new HashSet<NodePointer>(entityDescendantPointers);
if (entity.getParent() != null) {
nodePointersToCheckCardinalityFor.add(new NodePointer(entity));
}
validateCardinality(record, nodePointersToCheckCardinalityFor, changeMap);
// validate attributes
Set<Node<?>> nodesToCheckValidationFor = new HashSet<Node<?>>();
nodesToCheckValidationFor.add(entity);
nodesToCheckValidationFor.addAll(pointersToNodes(updatedCardinalityPointers));
Set<Attribute<?, ?>> attributesToValidate = record.determineValidationDependentNodes(nodesToCheckValidationFor);
validateAttributes(record, attributesToValidate, changeMap);
}
return changeMap;
}
use of org.openforis.idm.model.Node in project collect by openforis.
the class EntityProxy method getChildrenByDefinitionId.
@ExternalizedProperty
public Map<Integer, List<NodeProxy>> getChildrenByDefinitionId() {
Map<Integer, List<NodeProxy>> result = new HashMap<Integer, List<NodeProxy>>();
for (NodeDefinition childDefinition : availableChildDefinitions) {
List<Node<?>> nodes = this.entity.getChildren(childDefinition);
List<NodeProxy> proxies = NodeProxy.fromList(this, nodes, context);
result.put(childDefinition.getId(), proxies);
}
return result;
}
use of org.openforis.idm.model.Node in project collect by openforis.
the class CSVDataImportProcess method setValuesInAttributes.
private void setValuesInAttributes(Entity ancestorEntity, Map<FieldValueKey, String> fieldValues, Map<FieldValueKey, String> colNameByField, long row) {
Set<Entry<FieldValueKey, String>> entrySet = fieldValues.entrySet();
// delete all multiple attributes
for (Entry<FieldValueKey, String> entry : entrySet) {
FieldValueKey fieldValueKey = entry.getKey();
EntityDefinition ancestorDefn = ancestorEntity.getDefinition();
Schema schema = ancestorDefn.getSchema();
AttributeDefinition attrDefn = (AttributeDefinition) schema.getDefinitionById(fieldValueKey.getAttributeDefinitionId());
Entity parentEntity = getOrCreateParentEntity(ancestorEntity, attrDefn);
if (attrDefn.isMultiple()) {
List<Node<?>> attributes = parentEntity.getChildren(attrDefn);
int tot = attributes.size();
for (int i = 0; i < tot; i++) {
Node<?> node = attributes.get(0);
NodeChangeSet changes = recordUpdater.deleteNode(node);
if (nodeChangeBatchProcessor != null) {
nodeChangeBatchProcessor.add(changes, adminUser.getUsername());
}
}
}
}
// set values
for (Entry<FieldValueKey, String> entry : entrySet) {
FieldValueKey fieldValueKey = entry.getKey();
String strValue = entry.getValue();
EntityDefinition ancestorDefn = ancestorEntity.getDefinition();
Schema schema = ancestorDefn.getSchema();
AttributeDefinition attrDefn = (AttributeDefinition) schema.getDefinitionById(fieldValueKey.getAttributeDefinitionId());
String fieldName = fieldValueKey.getFieldName();
Entity parentEntity = getOrCreateParentEntity(ancestorEntity, attrDefn);
String colName = colNameByField.get(fieldValueKey);
int attrPos = fieldValueKey.getAttributePosition();
setValueInField(parentEntity, attrDefn, attrPos - 1, fieldName, strValue, colName, row);
}
}
use of org.openforis.idm.model.Node in project collect by openforis.
the class DescendantNodeFilter method accept.
@Override
public boolean accept(Node<?> node) {
NodeDefinition nodeDef = node.getDefinition();
if (!(nodeDef instanceof EntityDefinition) || !descendantAttributeDefinition.isDescendantOf((EntityDefinition) nodeDef)) {
return false;
}
Record record = node.getRecord();
SurveyContext surveyContext = record.getSurveyContext();
ExpressionEvaluator expressionEvaluator = surveyContext.getExpressionEvaluator();
List<Node<?>> attributes = record.findNodesByPath(descendantAttributeDefinition.getPath());
for (Node<?> attribute : attributes) {
try {
Entity parentEntity = attribute.getParent();
if (parentEntity == node && expressionEvaluator.evaluateBoolean(parentEntity, attribute, descendantAttributeCondition)) {
return true;
}
} catch (InvalidExpressionException e) {
throw new RuntimeException(e);
}
}
return false;
}
use of org.openforis.idm.model.Node in project collect by openforis.
the class XPathDataQueryEvaluator method evaluate.
@Override
public List<Node<?>> evaluate(CollectRecord record) {
List<Node<?>> result = new ArrayList<Node<?>>();
String condition = query.getConditions();
AttributeDefinition attrDef = query.getAttributeDefinition();
SurveyContext surveyContext = record.getSurveyContext();
ExpressionEvaluator expressionEvaluator = surveyContext.getExpressionEvaluator();
List<Node<?>> nodes = record.findNodesByPath(attrDef.getPath());
for (Node<?> node : nodes) {
try {
if (expressionEvaluator.evaluateBoolean(node.getParent(), node, condition)) {
result.add(node);
}
} catch (InvalidExpressionException e) {
throw new RuntimeException(e);
}
}
return result;
}
Aggregations