]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/genericrelation/combinators/Intersection.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / genericrelation / combinators / Intersection.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 intersection of multiple relations.
26  */
27 public class Intersection extends AbstractRelation {
28
29         GenericRelation realizable = null;
30         Collection<GenericRelation> constraints;
31         
32         public Intersection(Collection<GenericRelation> relations) {
33                 for(GenericRelation relation : relations)
34                         if(realizable == null && relation.isRealizable()) {
35                                 realizable = relation;
36                         }
37                         else
38                                 constraints.add(relation);
39         }
40         
41         public Intersection(GenericRelation realizable, Collection<GenericRelation> constraints) {
42                 assert(realizable.isRealizable());
43                 this.realizable = realizable;
44                 this.constraints = constraints;
45         }
46
47         @Override
48         public boolean contains(ReadGraph g, Object[] tuple) throws DatabaseException {
49                 if(!realizable.contains(g, tuple))
50                         return false;
51                 for(GenericRelation relation : constraints)
52                         if(!relation.contains(g, tuple))
53                                 return false;
54                 return true;
55         }
56
57         @Override
58         public boolean isRealizable() {
59                 return realizable != null;
60         }
61
62         @Override
63         public List<Object[]> realize(ReadGraph g) throws DatabaseException {
64                 ArrayList<Object[]> result = new ArrayList<Object[]>();
65                 loop:
66                 for(Object[] tuple : realizable.realize(g)) {
67                         for(GenericRelation constraint : constraints)
68                                 if(!constraint.contains(g, tuple))
69                                         continue loop;
70                         result.add(tuple);
71                 }
72                 return result;
73         }       
74
75         // TODO optimize select
76         
77         @Override
78         public GenericRelation selectByRelation(String bindingPattern,
79                         GenericRelation constraint) {
80                 if(realizable != null)
81                         return new Intersection(realizable.selectByRelation(bindingPattern, constraint),
82                                         constraints);
83                 else
84                         return super.selectByRelation(bindingPattern, constraint);
85         }
86         
87         @Override
88         public Pair<String, String>[] getFields() {
89                 if(realizable != null)
90                         return realizable.getFields();
91                 for(GenericRelation relation : constraints)
92                         return relation.getFields();
93                 return null;
94         }
95
96 }