]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/genericrelation/combinators/SelectByRelation.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / genericrelation / combinators / SelectByRelation.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 gnu.trove.list.array.TIntArrayList;
15
16 import java.util.ArrayList;
17 import java.util.List;
18
19 import org.simantics.db.ReadGraph;
20 import org.simantics.db.exception.DatabaseException;
21 import org.simantics.db.layer0.adapter.GenericRelation;
22 import org.simantics.db.layer0.genericrelation.AbstractRelation;
23 import org.simantics.utils.datastructures.Pair;
24
25
26 public class SelectByRelation extends AbstractRelation {
27         
28         GenericRelation base;
29         int baseLength;
30         String bindingPattern;
31         int[] boundPositions;
32         GenericRelation constraint;
33         
34         public SelectByRelation(GenericRelation base, String bindingPattern, GenericRelation constraint) {
35                 super();
36                 this.base = base;
37                 this.bindingPattern = bindingPattern;
38                 TIntArrayList boundPositionArray = new TIntArrayList();
39                 baseLength = bindingPattern.length();
40                 for(int i=0;i<baseLength;++i)
41                         if(bindingPattern.charAt(i) == 'b') 
42                                 boundPositionArray.add(i);
43                 boundPositions = boundPositionArray.toArray();
44                 this.constraint = constraint;
45         }
46         
47         private Object[] map(Object[] tuple) {
48                 Object[] result = new Object[boundPositions.length];
49                 for(int i=0;i<result.length;++i)
50                         result[i] = tuple[boundPositions[i]];
51                 return result;
52         }
53         
54         @Override
55         public boolean contains(ReadGraph g, Object[] tuple) throws DatabaseException {
56                 assert tuple.length == baseLength;
57                 return base.contains(g, tuple) && constraint.contains(g, map(tuple));
58         }
59         @Override
60         public Pair<String, String>[] getFields() {
61                 return base.getFields();
62         }
63         @Override
64         public boolean isRealizable() {
65                 return base.isRealizable();
66         }
67         @Override
68         public GenericRelation select(String bindingPattern, Object[] constants) {
69                 return new SelectByRelation(base.select(bindingPattern, constants), bindingPattern, constraint);
70         }
71         @Override
72         public List<Object[]> realize(ReadGraph g) throws DatabaseException {
73                 ArrayList<Object[]> result = new ArrayList<Object[]>();
74                 for(Object[] tuple : base.realize(g))
75                         if(constraint.contains(g, map(tuple)))
76                                 result.add(tuple);
77                 return result;
78         }
79
80 }