use of eu.esdihumboldt.hale.common.align.model.functions.join.JoinParameter.JoinCondition in project hale by halestudio.
the class JoinParameterPage method getConfiguration.
/**
* @see eu.esdihumboldt.hale.ui.function.generic.pages.ParameterPage#getConfiguration()
*/
@Override
public ListMultimap<String, ParameterValue> getConfiguration() {
ListMultimap<String, ParameterValue> result = ArrayListMultimap.create(1, 1);
Set<JoinCondition> conditions = new HashSet<>();
for (ConditionPage page : pages) {
conditions.addAll(page.conditions);
}
JoinParameter param = new JoinParameter(types, conditions);
result.put(PARAMETER_JOIN, new ParameterValue(new ComplexValue(param)));
return result;
}
use of eu.esdihumboldt.hale.common.align.model.functions.join.JoinParameter.JoinCondition in project hale by halestudio.
the class JoinParameterPage method createJoinParameter.
/**
* Creates a join parameter for the types up to <code>upToIndex</code>.
*
* @param upToIndex the type index up to which the parameter should be
* created for
* @return the current join parameter up to the specified index
*/
private JoinParameter createJoinParameter(int upToIndex) {
Set<JoinCondition> conditions = new HashSet<>();
for (int i = 0; i < upToIndex; i++) conditions.addAll(pages.get(i).conditions);
JoinParameter param = new JoinParameter(types.subList(0, upToIndex + 1), conditions);
return param;
}
use of eu.esdihumboldt.hale.common.align.model.functions.join.JoinParameter.JoinCondition in project hale by halestudio.
the class JoinParameterPage method onShowPage.
/**
* @see eu.esdihumboldt.hale.ui.HaleWizardPage#onShowPage(boolean)
*/
@Override
protected void onShowPage(boolean firstShow) {
super.onShowPage(firstShow);
Cell cell = getWizard().getUnfinishedCell();
List<? extends Entity> sourceEntities = cell.getSource().get(JOIN_TYPES);
List<TypeEntityDefinition> types = new ArrayList<TypeEntityDefinition>();
Iterator<? extends Entity> iter = sourceEntities.iterator();
while (iter.hasNext()) {
types.add(AlignmentUtil.getTypeEntity(iter.next().getDefinition()));
}
if (sameTypes(this.types, types)) {
return;
}
if (containsDuplicateType(types)) {
setPageComplete(false);
setErrorMessage("The selected source types contain duplicates.");
this.types.clear();
table.setInput(null);
return;
} else {
setErrorMessage(null);
}
JoinParameter initialValue = null;
if (firstShow && !getInitialValues().get(PARAMETER_JOIN).isEmpty()) {
initialValue = getInitialValues().get(PARAMETER_JOIN).get(0).as(JoinParameter.class);
if (initialValue != null) {
// use ordering of the initial value (needs to be modifiable)
List<TypeEntityDefinition> tmp = new ArrayList<>(initialValue.getTypes());
// append any type that were added, or remove types that were
// removed
tmp.retainAll(types);
List<TypeEntityDefinition> more = new ArrayList<>(types);
more.removeAll(tmp);
tmp.addAll(more);
types = tmp;
// apply potentially changed type list
initialValue = new JoinParameter(types, initialValue.getConditions());
if (initialValue.validate(true) != null) {
// try to fix config
// not recoverable
initialValue = null;
}
}
}
this.types = types;
for (ConditionPage page : pages) {
page.dispose();
}
pages.clear();
if (table != null) {
table.setInput(types);
}
for (int i = 1; i < types.size(); i++) {
ConditionPage conditionPage = new ConditionPage(i);
conditionPage.setWizard(getWizard());
pages.add(conditionPage);
}
if (initialValue != null) {
// add initial conditions
for (JoinCondition condition : initialValue.getConditions()) {
TypeEntityDefinition joinType = AlignmentUtil.getTypeEntity(condition.joinProperty);
int typeIndex = types.indexOf(joinType);
int pageIndex = typeIndex - 1;
pages.get(pageIndex).conditions.add(condition);
pages.get(pageIndex).updateCompletionStatus();
}
}
// order is always valid, will trigger updateButtons
setPageComplete(true);
}
use of eu.esdihumboldt.hale.common.align.model.functions.join.JoinParameter.JoinCondition in project hale by halestudio.
the class IndexJoinIterator method join.
/**
* Joins all direct children of the given type to currentInstances.
*/
@SuppressWarnings("javadoc")
private void join(FamilyInstance[] currentInstances, int currentType) {
// Join all types that are direct children of the last type.
for (int i = currentType + 1; i < joinDefinition.directParent.length; i++) {
if (joinDefinition.directParent[i] == currentType) {
// Get join condition for the direct child type.
Multimap<Integer, JoinCondition> joinConditions = joinDefinition.joinTable.get(i);
// Collect intersection of conditions. null marks beginning
// in contrast to an empty set.
Set<ResolvableInstanceReference> possibleInstances = null;
// ParentType -> JoinConditions
for (Map.Entry<Integer, JoinCondition> joinCondition : joinConditions.entries()) {
PropertyEntityDefinition baseProp = joinCondition.getValue().baseProperty;
QName baseTypeName = baseProp.getType().getName();
List<QName> basePropertyPath = baseProp.getPropertyPath().stream().map(pp -> pp.getChild().getName()).collect(Collectors.toList());
PropertyEntityDefinition joinProp = joinCondition.getValue().joinProperty;
QName joinTypeName = joinProp.getType().getName();
List<QName> joinPropertyPath = joinProp.getPropertyPath().stream().map(pp -> pp.getChild().getName()).collect(Collectors.toList());
List<IndexedPropertyValue> currentValues = index.getInstancePropertyValues(baseTypeName, basePropertyPath, currentInstances[joinCondition.getKey()].getId());
if (currentValues == null || currentValues.isEmpty()) {
possibleInstances = Collections.emptySet();
break;
}
HashSet<ResolvableInstanceReference> matches = new HashSet<ResolvableInstanceReference>();
for (IndexedPropertyValue currentValue : currentValues) {
if (currentValue.getValues() == null || currentValue.getValues().isEmpty()) {
continue;
}
// Find instances that have the current property value
Collection<ResolvableInstanceReference> instancesWithValues = index.getInstancesByValue(joinTypeName, joinPropertyPath, currentValue.getValues());
matches.addAll(instancesWithValues);
}
if (possibleInstances == null) {
possibleInstances = matches;
} else {
// Remove candidates that don't have the current
// property value
Iterator<ResolvableInstanceReference> it = possibleInstances.iterator();
while (it.hasNext()) {
ResolvableInstanceReference cand = it.next();
if (!matches.contains(cand)) {
it.remove();
}
}
}
if (possibleInstances.isEmpty()) {
break;
}
}
if (possibleInstances != null && !possibleInstances.isEmpty()) {
FamilyInstance parent = currentInstances[currentType];
for (ResolvableInstanceReference ref : possibleInstances) {
FamilyInstance child;
child = new FamilyInstanceImpl(ref.resolve());
parent.addChild(child);
currentInstances[i] = child;
join(currentInstances, i);
}
currentInstances[i] = null;
}
}
}
}
use of eu.esdihumboldt.hale.common.align.model.functions.join.JoinParameter.JoinCondition in project hale by halestudio.
the class JoinIterator method join.
// Joins all direct children of the given type to currentInstances.
private void join(FamilyInstance[] currentInstances, int currentType) {
// Join all types that are direct children of the last type.
for (int i = currentType + 1; i < parent.length; i++) {
if (parent[i] == currentType) {
// Get join condition for the direct child type.
Multimap<Integer, JoinCondition> joinConditions = joinTable.get(i);
// Collect intersection of conditions. null marks beginning
// in contrast to an empty set.
Set<InstanceReference> possibleInstances = null;
// ParentType -> JoinConditions
for (Map.Entry<Integer, JoinCondition> joinCondition : joinConditions.entries()) {
Collection<Object> currentValues = AlignmentUtil.getValues(currentInstances[joinCondition.getKey()], joinCondition.getValue().baseProperty, true);
if (currentValues == null) {
possibleInstances = Collections.emptySet();
break;
}
// Allow targets with any of the property values.
HashSet<InstanceReference> matches = new HashSet<InstanceReference>();
for (Object currentValue : currentValues) {
Object keyValue = currentValue;
if (valueProcessor != null) {
keyValue = valueProcessor.processValue(currentValue, joinCondition.getValue().baseProperty);
}
matches.addAll(index.get(joinCondition.getValue().joinProperty).get(keyValue));
}
if (possibleInstances == null)
possibleInstances = matches;
else {
// Intersect!
Iterator<InstanceReference> iter = possibleInstances.iterator();
while (iter.hasNext()) {
InstanceReference ref = iter.next();
if (!matches.contains(ref))
iter.remove();
}
}
// Break if set is empty.
if (possibleInstances.isEmpty())
break;
}
if (possibleInstances != null && !possibleInstances.isEmpty()) {
FamilyInstance parent = currentInstances[currentType];
for (InstanceReference ref : possibleInstances) {
FamilyInstance child;
if (ref instanceof ResolvableInstanceReference) {
child = new FamilyInstanceImpl(((ResolvableInstanceReference) ref).resolve());
} else {
child = new FamilyInstanceImpl(instances.getInstance(ref));
}
parent.addChild(child);
currentInstances[i] = child;
join(currentInstances, i);
}
currentInstances[i] = null;
}
}
}
}
Aggregations