]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/genericrelation/combinators/Union.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / genericrelation / combinators / Union.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management
3  * in Industry THTH ry.
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
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.db.layer0.genericrelation.combinators;
13
14 import java.util.ArrayList;
15 import java.util.Collection;
16 import java.util.List;
17
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;
23
24 /**
25  * Takes the union of multiple relations. Does not remove duplicates.
26  */
27 public class Union extends AbstractRelation {
28
29         Collection<GenericRelation> relations;
30         
31         public Union(Collection<GenericRelation> relations) {
32                 this.relations = relations;
33         }
34
35         @Override
36         public boolean contains(ReadGraph g, Object[] tuple) throws DatabaseException {
37                 for(GenericRelation relation : relations)
38                         if(relation.contains(g, tuple))
39                                 return true;
40                 return false;
41         }
42
43         @Override
44         public boolean isRealizable() {
45                 for(GenericRelation relation : relations)
46                         if(!relation.isRealizable())
47                                 return false;
48                 return true;
49         }
50
51         @Override
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));
56                 int size = 0;
57                 for(List<Object[]> part : results)
58                         size += part.size();
59                 ArrayList<Object[]> result = new ArrayList<Object[]>(size);
60                 for(List<Object[]> part : results)
61                         result.addAll(part);
62                 return result;
63         }
64         
65         @Override
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);
71         }
72         
73         @Override
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);
79         }
80
81         @Override
82         public Pair<String, String>[] getFields() {
83                 for(GenericRelation relation : relations)
84                         return relation.getFields();
85                 return null;
86         }
87
88 }