/*******************************************************************************
* Copyright 2014 University of Southern California
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This code was developed by the Information Integration Group as part
* of the Karma project at the Information Sciences Institute of the
* University of Southern California. For more information, publications,
* and related projects, please see: http://www.isi.edu/integration
******************************************************************************/
package edu.isi.karma.kr2rml.template;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import edu.isi.karma.controller.command.selection.SuperSelection;
import edu.isi.karma.rep.HNodePath;
import edu.isi.karma.rep.Node;
import edu.isi.karma.rep.Row;
public class DoublyAnchoredTemplateTermSetPopulator extends
SinglyAnchoredTemplateTermSetPopulatorPlan {
public DoublyAnchoredTemplateTermSetPopulator(
Map<ColumnTemplateTerm, HNodePath> termToPath,
LinkedList<ColumnTemplateTerm> columnTerms,
List<ColumnTemplateTerm> comparisonTerms,
SuperSelection sel) {
super(termToPath, columnTerms, comparisonTerms, sel);
}
public List<PartiallyPopulatedTermSet> execute(Row topRow, PopulatedTemplateTermSet subject, PopulatedTemplateTermSet object)
{
if(columnTerms == null || columnTerms.isEmpty())
{
List<PartiallyPopulatedTermSet> predicates = new LinkedList<>();
predicates.add(new PartiallyPopulatedTermSet());
return predicates;
}
List<PartiallyPopulatedTermSet> independentResults = this.execute(topRow);
List<List<PartiallyPopulatedTermSet>> toMerge = new LinkedList<>();
if(!independentResults.isEmpty())
{
toMerge.add(independentResults);
}
executeForReference(topRow, toMerge, subject.getReferences());
executeForReference(topRow, toMerge, object.getReferences());
return TemplateTermSetPopulatorWorker.combinePartialResults(toMerge);
}
private void executeForReference(Row topRow,
List<List<PartiallyPopulatedTermSet>> toMerge,
Map<ColumnTemplateTerm, Node> references) {
for(Entry<ColumnTemplateTerm, Node> reference : references.entrySet())
{
TemplateTermSetPopulatorPlan plan = nestedPlans.get(reference.getKey());
if(plan != null)
{
toMerge.add(plan.executeComplicated(topRow, reference.getValue()));
}
}
}
}