-
Notifications
You must be signed in to change notification settings - Fork 201
/
RecursiveAssociationsTest.java
125 lines (104 loc) · 3.48 KB
/
RecursiveAssociationsTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
* Hibernate OGM, Domain model persistence for NoSQL datastores
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.ogm.backendtck.associations.recursive;
import static org.fest.assertions.Assertions.assertThat;
import java.util.concurrent.atomic.AtomicInteger;
import org.hibernate.Transaction;
import org.hibernate.ogm.OgmSession;
import org.hibernate.ogm.utils.OgmTestCase;
import org.hibernate.ogm.utils.TestForIssue;
import org.junit.Before;
import org.junit.Test;
/**
* Creates a tree where each node has a certain number of children and then executes some CRUD operation on it.
*
* @author Davide D'Alto
*/
@TestForIssue(jiraKey = { "OGM-1284", "OGM-1292" })
public class RecursiveAssociationsTest extends OgmTestCase {
int DEPTH = 3;
int NUM_CHILDREN = 3;
@Before
public void before() {
createTree();
}
/*
* Simple tree generation.
* The tree will look something like (depth 2, children 2):
*
* -- (NODE: 6)
* -- (NODE: 4) |
* | -- (NODE: 5)
* (ROOT: 0) --
* | -- (NODE: 3)
* -- (NODE: 1) |
* -- (LEAF: 2)
*/
private void createTree() {
try ( OgmSession session = openSession() ) {
AtomicInteger index = new AtomicInteger( 0 );
Transaction tx = session.beginTransaction();
TreeNode root = new TreeNode( name( index.get() ) );
session.persist( root );
createChildren( session, root, 1, index );
tx.commit();
}
}
private void createChildren(OgmSession session, TreeNode parent, int currentDepth, AtomicInteger index) {
for ( int i = 0; i < NUM_CHILDREN; i++ ) {
index.incrementAndGet();
TreeNode child = createNode( parent, index.get() );
session.persist( child );
if ( currentDepth < DEPTH ) {
createChildren( session, child, currentDepth + 1, index );
}
}
}
private String name(int index) {
return "NODE: " + index;
}
private TreeNode createNode(TreeNode parent, int middle) {
TreeNode child = new TreeNode( name( middle ) );
parent.getChildren().add( child );
child.setParent( parent );
return child;
}
@Test
public void test() throws Exception {
try ( OgmSession session = openSession() ) {
Transaction tx = session.beginTransaction();
TreeNode root = session.load( TreeNode.class, name( 0 ) );
assertThat( root.getChildren() ).hasSize( NUM_CHILDREN );
TreeNode node = session.load( TreeNode.class, name( 1 ) );
assertThat( node.getChildren() ).hasSize( NUM_CHILDREN );
TreeNode leaf = session.load( TreeNode.class, name( 3 ) );
assertThat( leaf.getChildren() ).isEmpty();
tx.commit();
}
deleteNode( 2 );
try ( OgmSession session = openSession() ) {
Transaction tx = session.beginTransaction();
TreeNode root = session.load( TreeNode.class, name( 0 ) );
assertThat( root ).isNotNull();
assertThat( root.getChildren() ).hasSize( NUM_CHILDREN );
TreeNode node = session.load( TreeNode.class, name( 1 ) );
assertThat( node.getChildren() ).hasSize( NUM_CHILDREN - 1 );
tx.commit();
}
}
private void deleteNode(int nodeId) {
try ( OgmSession session = openSession() ) {
Transaction tx = session.beginTransaction();
session.delete( session.load( TreeNode.class, name( nodeId ) ) );
tx.commit();
}
}
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[]{ TreeNode.class };
}
}