]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.interop/src/org/simantics/interop/test/TypeComparator.java
Handle asserted property statements
[simantics/interop.git] / org.simantics.interop / src / org / simantics / interop / test / TypeComparator.java
1 package org.simantics.interop.test;
2
3 import java.util.ArrayList;
4 import java.util.Comparator;
5
6 import org.simantics.db.ReadGraph;
7 import org.simantics.db.Resource;
8 import org.simantics.db.Statement;
9 import org.simantics.db.exception.DatabaseException;
10 import org.simantics.layer0.Layer0;
11
12 /**
13  * Object comparator that uses type of objects to check if objects are comparable. 
14  * 
15  * Difference value is amount of properties that have different values. If objects have no properties, the result is 0 (unreliable).
16  * 
17  * 
18  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
19  *
20  */
21 public class TypeComparator extends ResourceComparator {
22
23         
24         ArrayList<Resource> rs1 = new ArrayList<Resource>();
25         ArrayList<Resource> rs2 = new ArrayList<Resource>();
26         
27         @Override
28         public int compare(ReadGraph g, Resource o1, Resource o2, boolean local) throws DatabaseException {
29                 if (o1.equals(o2)) {
30                         return 1;
31                 }
32                 return compare(g, o1, o2);
33         }
34         
35         @Override
36         public int compare(ReadGraph g, Resource o1, Resource o2) throws DatabaseException{
37                 if (!compareType(g,o1, o2)) {
38                         return (Integer.MAX_VALUE);
39                 }
40                 return propsDiffCount(g,o1, o2);
41         }
42         
43         protected boolean compareType(ReadGraph g,Resource r1, Resource r2) throws DatabaseException {
44                 Layer0 l0 = Layer0.getInstance(g);
45                 rs1.addAll(g.getObjects(r1, l0.InstanceOf));
46                 rs2.addAll(g.getObjects(r2, l0.InstanceOf));
47                 if (rs1.size() != rs2.size()) {
48                         rs1.clear();
49                         rs2.clear();
50                         return false;
51                 }
52                 Comparator<Resource> rcomp = getComparator().getResourceComparator();
53                 getComparator().sortResource(rs1, rs2);
54
55                 for (int i = 0; i < rs1.size(); i++) {
56                         int c = rcomp.compare(rs1.get(i), rs2.get(i));
57                         if (c != 0) {
58                                 rs1.clear();
59                                 rs2.clear();
60                                 return false;
61                         }
62                 }
63                 
64                 rs1.clear();
65                 rs2.clear();
66                 
67                 return true;
68         }
69         
70         protected int propsDiffCount(ReadGraph g, Resource r1, Resource r2) throws DatabaseException {
71                 Layer0 l0 = Layer0.getInstance(g);
72                 ArrayList<Statement> ss1 = new ArrayList<Statement>();
73                 ArrayList<Statement> ss2 = new ArrayList<Statement>();
74                 ss1.addAll(g.getStatements(r1, l0.HasProperty));
75                 ss2.addAll(g.getStatements(r2, l0.HasProperty));
76                 
77                 if (ss1.size() == 0 && ss2.size() == 0)
78                         return 0;
79                 
80                 Comparator<Statement> scomp = getComparator().getStatementComparator();
81                 
82                 getComparator().sortStatement(ss1, ss2);
83                 
84                 int count = 1;
85                 
86                 int i1 = 0; 
87                 int i2 = 0;
88                 
89                 while (true) {
90                         if (i1 >= ss1.size()) {
91                                 if (i2 >= ss2.size())
92                                         break;
93                                 else {
94                                         while (i2 < ss2.size()) {
95                                                 count++;
96                                                 i2++;
97                                         }
98                                         break;
99                                 }
100                         } else if (i2 >= ss2.size()) {
101                                 while (i1 < ss1.size()) {
102                                         count++;
103                                         i1++;
104                                 }
105                                 break;
106                         }
107                         Statement s1 = ss1.get(i1);
108                         Statement s2 = ss2.get(i2);
109                         if (s1.isAsserted(r1) && s2.isAsserted(r2)) {
110                                 i1++;
111                                 i2++;
112                                 continue;
113                         }
114                         int c = scomp.compare(s1, s2);
115                         switch (c) {
116                                 case 0:{
117                                         boolean b1 = g.hasValue(s1.getObject());
118                                         boolean b2 = g.hasValue(s2.getObject());
119                                         if (b1 == b2) {
120                                                 if (b1) {
121 //                                                      Object v1 = g.getValue(s1.getObject());
122 //                                                      Object v2 = g.getValue(s2.getObject());
123 //                                                      boolean eq = GraphComparator.compareValue(v1, v2);
124                                                         boolean eq = GraphComparator.compareValue(g, l0 , s1.getObject(), s2.getObject());
125                                                         
126                                                         if (!eq) {
127                                                                 count++;
128                                                         }
129                                                         //System.out.println("Prop count values " + v1 + " " + v2);
130                                                 } else {
131                                                         count += propsDiffCount(g,s1.getObject(), s2.getObject());
132                                                 }
133                                         } else {
134                                                 //System.out.println("Props count structural vs literal");
135                                                 count++;
136                                         }
137                                         i1++;
138                                         i2++;
139                                         break;
140                                 }
141                                 case -1:{
142                                         count++;
143                                         i1++;
144                                         break;
145                                 }
146                                         
147                                 case 1:{
148                                         count++;
149                                         i2++;
150                                         break;
151                                 }
152                         }
153
154                 }
155                 
156                 ss1.clear();
157                 ss2.clear();
158                 return count;
159         }
160
161 }