/*
* Copyright (c) 2017 OBiBa. All rights reserved.
*
* This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.obiba.magma.views;
import com.google.common.collect.Lists;
import org.obiba.magma.*;
import org.obiba.magma.support.UnionTimestamps;
import org.obiba.magma.support.ValueSetBean;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.stream.Collectors;
/**
*
*/
class JoinValueSet extends ValueSetBean {
private final JoinValueSetFetcher fetcher;
private List<ValueSet> innerValueSets;
public JoinValueSet(@NotNull JoinTable table, @NotNull VariableEntity entity) {
super(table, entity);
this.fetcher = new JoinValueSetFetcher(table);
}
@NotNull
@Override
public Timestamps getTimestamps() {
List<Timestamps> timestampses = Lists.newArrayList();
timestampses.addAll(((JoinTable) getValueTable()).getTables().stream() //
.filter(valueTable -> valueTable.hasValueSet(getVariableEntity())) //
.map(valueTable -> valueTable.getValueSetTimestamps(getVariableEntity())) //
.collect(Collectors.toList()));
return new UnionTimestamps(timestampses);
}
public Value getValue(Variable variable) {
// for each inner value sets and get the value (if the inner table has value set and variable defined)
// and wrap result in a value sequence
List<Value> values = getInnerTableValueSets().stream() //
.filter(joinedValueSet -> hasWrappedVariable(joinedValueSet.getValueTable(), variable)) //
.map(joinedValueSet -> joinedValueSet instanceof EmptyValueSet ?
variable.getValueType().nullValue() :
getWrappedVariable(joinedValueSet.getValueTable(), variable).getValue(joinedValueSet))
.collect(Collectors.toList());
if (values.isEmpty()) return variable.isRepeatable() ? variable.getValueType().nullSequence() : variable.getValueType().nullValue();
return values.size() == 1 ? values.get(0) : variable.getValueType().sequenceOf(values);
}
private List<ValueSet> getInnerTableValueSets() {
if (innerValueSets == null) {
innerValueSets = fetcher.getInnerTableValueSets(getVariableEntity());
}
return innerValueSets;
}
public void setInnerValueSets(List<ValueSet> innerValueSets) {
this.innerValueSets = innerValueSets;
}
private boolean hasWrappedVariable(ValueTable table, Variable variable) {
return table.hasVariable(variable.getName());
}
private VariableValueSource getWrappedVariable(ValueTable table, Variable variable) {
return table.getVariableValueSource(variable.getName());
}
}