1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.db.layer0.genericrelation.combinators;
14 import java.util.ArrayList;
15 import java.util.Collection;
16 import java.util.List;
18 import org.simantics.db.ReadGraph;
19 import org.simantics.db.exception.DatabaseException;
20 import org.simantics.db.layer0.adapter.GenericRelation;
21 import org.simantics.db.layer0.genericrelation.AbstractRelation;
22 import org.simantics.utils.datastructures.Pair;
25 * Takes the union of multiple relations. Does not remove duplicates.
27 public class Union extends AbstractRelation {
29 Collection<GenericRelation> relations;
31 public Union(Collection<GenericRelation> relations) {
32 this.relations = relations;
36 public boolean contains(ReadGraph g, Object[] tuple) throws DatabaseException {
37 for(GenericRelation relation : relations)
38 if(relation.contains(g, tuple))
44 public boolean isRealizable() {
45 for(GenericRelation relation : relations)
46 if(!relation.isRealizable())
52 public List<Object[]> realize(ReadGraph g) throws DatabaseException {
53 ArrayList<List<Object[]>> results = new ArrayList<List<Object[]>>(relations.size());
54 for(GenericRelation relation : relations)
55 results.add(relation.realize(g));
57 for(List<Object[]> part : results)
59 ArrayList<Object[]> result = new ArrayList<Object[]>(size);
60 for(List<Object[]> part : results)
66 public GenericRelation selectByRelation(String bindingPattern, GenericRelation constraint) {
67 ArrayList<GenericRelation> semijoinRelations = new ArrayList<GenericRelation>(relations.size());
68 for(GenericRelation relation : relations)
69 semijoinRelations.add(relation.selectByRelation(bindingPattern, constraint));
70 return new Union(semijoinRelations);
74 public GenericRelation select(String bindingPattern, Object[] constants) {
75 ArrayList<GenericRelation> selectedRelations = new ArrayList<GenericRelation>(relations.size());
76 for(GenericRelation relation : relations)
77 selectedRelations.add(relation.select(bindingPattern, constants));
78 return new Union(selectedRelations);
82 public Pair<String, String>[] getFields() {
83 for(GenericRelation relation : relations)
84 return relation.getFields();