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.api.story.misc;
14 import gnu.trove.set.hash.THashSet;
16 import java.util.ArrayList;
17 import java.util.Random;
19 import org.junit.Test;
20 import org.simantics.db.Resource;
21 import org.simantics.db.Session;
22 import org.simantics.db.WriteGraph;
23 import org.simantics.db.common.request.WriteRequest;
24 import org.simantics.db.exception.DatabaseException;
25 import org.simantics.db.testing.annotation.Fails;
26 import org.simantics.db.testing.base.ExistingDatabaseTest;
27 import org.simantics.db.tests.common.Configuration;
28 import org.simantics.layer0.Layer0;
29 import org.simantics.project.ontology.ProjectResource;
31 public class SyntheticModellingTest extends ExistingDatabaseTest {
33 static int LOOP_COUNT = Configuration.get().modellingLoopCount;
34 static int OP_COUNT = Configuration.get().modellingOpCount;
44 Resource IsConnectedTo;
45 Resource IsConnectedFrom;
47 int componentTypeCount = 0;
48 int componentCount = 0;
49 int connectionCount = 0;
51 static class Component {
56 static class ComponentType {
59 ArrayList<Component> components = new ArrayList<Component>();
60 ArrayList<Resource> connections = new ArrayList<Resource>();
63 ArrayList<ComponentType> componentTypes = new ArrayList<ComponentType>();
65 Random random = new Random(0x12345679);
68 // protected void setUp() throws Exception {
69 // SessionFactory factory = new SessionFactory(Configuration.get().host, Configuration.get().port);
70 // session = factory.create();
74 // protected void tearDown() throws Exception {
75 // LifecycleSupport support = session.getService(LifecycleSupport.class);
79 class SetUp extends WriteRequest {
82 public void perform(WriteGraph g) throws DatabaseException {
84 b = Layer0.getInstance(g);
86 ProjectResource PROJ = ProjectResource.getInstance(g);
88 root = g.newResource();
89 g.claim(root, b.InstanceOf, PROJ.Project);
91 Component = g.getResource("http://www.simantics.org/Structural-1.0/Component");
92 Composite = g.getResource("http://www.simantics.org/Structural-1.0/Composite");
93 IsDefinedBy = g.getResource("http://www.simantics.org/Structural-1.0/IsDefinedBy");
94 Connection = g.getResource("http://www.simantics.org/Structural-1.0/Connection");
95 IsConnected = g.getResource("http://www.simantics.org/Structural-1.0/IsConnected");
96 IsConnectedTo = g.getResource("http://www.simantics.org/Structural-1.0/IsConnectedTo");
97 IsConnectedFrom = g.getResource("http://www.simantics.org/Structural-1.0/IsConnectedFrom");
103 class NewComponentType extends WriteRequest {
106 public void perform(WriteGraph g) throws DatabaseException {
107 ComponentType componentType = new ComponentType();
109 componentType.resource = g.newResource();
110 g.claim(componentType.resource, b.Inherits, Component);
111 g.claim(root, b.ConsistsOf, componentType.resource);
112 g.claimLiteral(componentType.resource, b.HasName, "ComponentType" + componentType.resource.getResourceId());
114 componentType.composite = g.newResource();
115 g.claim(componentType.composite, b.Inherits, Composite);
116 g.claim(componentType.resource, IsDefinedBy, componentType.composite);
118 componentTypes.add(componentType);
120 ++componentTypeCount;
125 class NewComponent extends WriteRequest {
128 public void perform(WriteGraph g) throws DatabaseException {
129 ComponentType componentType = componentTypes.get(random.nextInt(componentTypes.size()));
130 ComponentType containerType = componentTypes.get(random.nextInt(componentTypes.size()));
132 Component component = new Component();
134 component.resource = g.newResource();
135 g.claim(component.resource, b.InstanceOf, componentType.resource);
136 g.claim(containerType.composite, b.ConsistsOf, component.resource);
138 g.claimLiteral(component.resource, b.HasName, "Component" + componentType.resource.getResourceId());
140 containerType.components.add(component);
147 class RemoveComponent extends WriteRequest {
150 public void perform(WriteGraph g) throws DatabaseException {
151 ComponentType containerType = componentTypes.get(random.nextInt(componentTypes.size()));
152 if(containerType.components.isEmpty())
154 int cid = random.nextInt(containerType.components.size());
155 Component component = containerType.components.get(cid);
156 THashSet<Resource> removed = new THashSet<Resource>();
157 for(Resource c : g.getObjects(component.resource, IsConnected))
160 int id = containerType.connections.indexOf(c);
161 int last = containerType.connections.size()-1;
163 containerType.connections.set(id, containerType.connections.remove(last));
165 containerType.connections.remove(last);
168 g.deny(component.resource);
170 int last = containerType.components.size() - 1;
172 containerType.components.set(cid, containerType.components.remove(last));
174 containerType.components.remove(last);
182 class NewConnection extends WriteRequest {
185 public void perform(WriteGraph g) throws DatabaseException {
186 ComponentType containerType = componentTypes.get(random.nextInt(componentTypes.size()));
187 if(containerType.components.isEmpty())
190 Component c1 = containerType.components.get(random.nextInt(containerType.components.size()));
191 Component c2 = containerType.components.get(random.nextInt(containerType.components.size()));
193 Resource connection = g.newResource();
194 g.claim(connection, b.InstanceOf, Connection);
195 g.claim(c1.resource, IsConnectedTo, connection);
196 g.claim(c2.resource, IsConnectedFrom, connection);
198 containerType.connections.add(connection);
205 class RemoveConnection extends WriteRequest {
208 public void perform(WriteGraph g) throws DatabaseException {
209 ComponentType containerType = componentTypes.get(random.nextInt(componentTypes.size()));
210 if(containerType.connections.isEmpty())
213 int id = random.nextInt(containerType.connections.size());
214 g.deny(containerType.connections.get(id));
215 int last = containerType.connections.size()-1;
217 containerType.connections.set(id, containerType.connections.remove(last));
219 containerType.connections.remove(last);
227 @Test public void test() {
229 session = getSession();
230 session.syncRequest(new SetUp());
231 for(int i=0;i<100;++i)
232 session.syncRequest(new NewComponentType());
233 for(int i=0;i<LOOP_COUNT;++i) {
234 long startTime = System.nanoTime();
235 for(int j=0;j<OP_COUNT;++j)
236 switch(random.nextInt(8)) {
238 session.syncRequest(new NewComponent());
241 session.syncRequest(new RemoveComponent());
244 if(componentCount > 1000)
245 session.syncRequest(new RemoveComponent());
247 session.syncRequest(new NewComponent());
250 session.syncRequest(new NewConnection());
253 session.syncRequest(new RemoveConnection());
258 if(connectionCount > 1000)
259 session.syncRequest(new RemoveConnection());
261 session.syncRequest(new NewConnection());
264 long endTime = System.nanoTime();
265 System.out.println((endTime - startTime) * 1e-9 + "s / 1000 operations");
267 componentTypeCount + " user components, " +
268 componentCount + " components, " +
269 connectionCount + " connections"
272 } catch (DatabaseException e) {
275 fail("Test failed with: " + e.getMessage());