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.tests.regression.bugs;
14 import java.util.HashMap;
17 import java.util.TreeSet;
18 import java.util.Vector;
20 import org.junit.Test;
21 import org.simantics.db.ReadGraph;
22 import org.simantics.db.Resource;
23 import org.simantics.db.Session;
24 import org.simantics.db.WriteGraph;
25 import org.simantics.db.WriteOnlyGraph;
26 import org.simantics.db.common.request.DelayedWriteRequest;
27 import org.simantics.db.common.request.ReadRequest;
28 import org.simantics.db.common.request.WriteOnlyRequest;
29 import org.simantics.db.common.request.WriteRequest;
30 import org.simantics.db.exception.ClusterSetExistException;
31 import org.simantics.db.exception.DatabaseException;
32 import org.simantics.db.service.ClusteringSupport;
33 import org.simantics.db.service.XSupport;
34 import org.simantics.db.testing.base.ExistingDatabaseTest;
35 import org.simantics.layer0.Layer0;
38 * Tests that cluster set can be used to explicitly control clustering.
40 public class Issue3420Test1 extends ExistingDatabaseTest {
41 private final boolean DEBUG = false;
42 private final Vector<Resource> clusterSets = new Vector<Resource>();
43 private final Vector<Resource> resources = new Vector<Resource>();
45 public void test() throws DatabaseException {
46 Session session = getSession();
48 session.syncRequest(new Init());
49 session.syncRequest(new InitW());
50 session.syncRequest(new Check());
52 session.syncRequest(new InitWO());
53 session.syncRequest(new Check());
55 session.syncRequest(new InitWD());
56 initDWKraaKraa(session);
57 session.syncRequest(new Check());
58 session.syncRequest(new InitWD2());
59 initDWKraaKraa(session);
60 session.syncRequest(new Check());
65 resources.setSize(1<<17);
66 clusterSets.setSize(14);
68 System.out.println("Resource count=" + resources.size() + " cluster sets=" + clusterSets.size());
70 class Init extends WriteRequest {
72 public void perform(WriteGraph g) throws DatabaseException {
73 Layer0 l0 = Layer0.getInstance(g);
75 g.newClusterSet(l0.InstanceOf);
76 } catch (ClusterSetExistException e) {
77 // Cluster set exist already. No problem.
81 class InitW extends WriteRequest {
83 public void perform(WriteGraph g) throws DatabaseException {
84 Layer0 l0 = Layer0.getInstance(g);
85 Resource oldDefault = g.setClusterSet4NewResource(l0.InstanceOf);
86 assertTrue(null == oldDefault);
87 for (int i=0; i<clusterSets.size(); ++i) {
88 Resource r = g.newResource();
90 clusterSets.set(i, r);
92 assertTrue(l0.InstanceOf == g.setClusterSet4NewResource(oldDefault));
93 for (int i=0; i<resources.size(); ++i) {
94 Resource r = clusterSets.get(i%clusterSets.size());
95 resources.set(i, g.newResource(r));
99 class InitWD extends DelayedWriteRequest {
101 public void perform(WriteGraph g) throws DatabaseException {
102 for (int i=0; i<clusterSets.size(); ++i) {
103 Resource r = g.newResource();
105 clusterSets.set(i, r);
107 for (int i=0; i<resources.size(); ++i) {
108 Resource r = clusterSets.get(i%clusterSets.size());
109 resources.set(i, g.newResource(r));
113 class InitWD2 extends DelayedWriteRequest {
115 public void perform(WriteGraph g) throws DatabaseException {
116 for (int i=0; i<clusterSets.size(); ++i) {
117 Resource r = g.newResource();
119 clusterSets.set(i, r);
121 Layer0 l0 = Layer0.getInstance(g);
122 for (int i=0; i<resources.size(); ++i) {
123 Resource r = clusterSets.get(i%clusterSets.size());
124 Resource rr = g.newResource(r);
125 g.claim(rr, l0.InstanceOf, l0.Entity);
126 g.claimValue(rr, "value");
127 resources.set(i, rr);
131 private void initDWKraaKraa(Session s)
132 throws DatabaseException {
133 XSupport xs = s.getService(XSupport.class);
134 for (int i=0; i<clusterSets.size(); ++i) {
135 Resource r = xs.convertDelayedResourceToResource(clusterSets.get(i));
136 clusterSets.set(i, r);
138 for (int i=0; i<resources.size(); ++i) {
139 Resource r = xs.convertDelayedResourceToResource(resources.get(i));
143 class InitWO extends WriteOnlyRequest {
145 public void perform(WriteOnlyGraph g) throws DatabaseException {
146 for (int i=0; i<clusterSets.size(); ++i) {
147 Resource r = g.newResource();
149 clusterSets.set(i, r);
151 for (int i=0; i<resources.size(); ++i) {
152 Resource r = clusterSets.get(i%clusterSets.size());
153 resources.set(i, g.newResource(r));
157 class Check extends ReadRequest {
159 public void run(ReadGraph g) throws DatabaseException {
160 ClusteringSupport cs = g.getService(ClusteringSupport.class);
161 Map<Long, Integer> clusters = new HashMap<Long, Integer>();
162 for (int i=0; i<resources.size(); ++i){
163 long cluster = cs.getCluster(resources.get(i));
164 Integer count = clusters.get(cluster);
167 clusters.put(cluster, ++count);
169 Set<Long> sortedKeys = new TreeSet<Long>();
170 for (Map.Entry<Long, Integer> i : clusters.entrySet())
171 sortedKeys.add(i.getKey());
173 for (long key : sortedKeys) {
174 int count = clusters.get(key);
176 System.out.println("cluster=" + key + " count=" + count);
179 if (resources.size() != sum) {
180 String msg = "Resource count mismatch. expected=" + resources.size() + " realized=" + sum;
182 System.out.println(msg);