Author: ppoddar
Date: Mon Mar 16 22:36:50 2009
New Revision: 755031

URL: http://svn.apache.org/viewvc?rev=755031&view=rev
Log:
OPENJPA-981: replicate parent-child relation across slices and not only to root 
slice

Added:
    
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedChild.java
    
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedParent.java
    
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/TestReplication.java
Modified:
    
openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/DistributedBrokerImpl.java
    openjpa/trunk/openjpa-slice/src/test/resources/META-INF/persistence.xml

Modified: 
openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/DistributedBrokerImpl.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/DistributedBrokerImpl.java?rev=755031&r1=755030&r2=755031&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/DistributedBrokerImpl.java
 (original)
+++ 
openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/DistributedBrokerImpl.java
 Mon Mar 16 22:36:50 2009
@@ -69,7 +69,7 @@
                        OpCallbacks call) {
                OpenJPAStateManager sm = getStateManager(pc);
                SliceInfo info = null;
-               boolean replicated = SliceImplHelper.isReplicated(sm);
+               boolean replicated = SliceImplHelper.isReplicated(pc, 
getConfiguration());
                if (getOperatingSet().isEmpty() && 
!SliceImplHelper.isSliceAssigned(sm)) {
                        info = SliceImplHelper.getSlicesByPolicy(pc, 
getConfiguration(), 
                                this);

Added: 
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedChild.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedChild.java?rev=755031&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedChild.java
 (added)
+++ 
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedChild.java
 Mon Mar 16 22:36:50 2009
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.slice;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+import org.apache.openjpa.persistence.Replicated;
+
+...@entity
+...@replicated
+public class ReplicatedChild {
+    @Id 
+    private String name;
+    
+    @ManyToOne
+    private ReplicatedParent parent;
+
+    public String getName() {
+        return name;
+    }
+    
+    public void setName(String name) {
+        this.name = name;
+    }
+    
+    public ReplicatedParent getParent() {
+        return parent;
+    }
+    
+    void setParent(ReplicatedParent parent) {
+        this.parent = parent;
+    }
+
+}

Added: 
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedParent.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedParent.java?rev=755031&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedParent.java
 (added)
+++ 
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedParent.java
 Mon Mar 16 22:36:50 2009
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.slice;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.*;
+
+import org.apache.openjpa.persistence.Replicated;
+
+...@entity
+...@replicated
+public class ReplicatedParent {
+    @Id 
+    private String name;
+    
+    @OneToMany(mappedBy="parent", cascade=CascadeType.ALL)
+    private Set<ReplicatedChild> children;
+    
+    public String getName() {
+        return name;
+    }
+    
+    public void setName(String name) {
+        this.name = name;
+    }
+    
+    public Set<ReplicatedChild> getChildren() {
+        return children;
+    }
+    
+    public void addChild(ReplicatedChild child) {
+        if (children == null)
+            children = new HashSet<ReplicatedChild>();
+        children.add(child);
+        child.setParent(this);
+    }
+}

Added: 
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/TestReplication.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/TestReplication.java?rev=755031&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/TestReplication.java
 (added)
+++ 
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/TestReplication.java
 Mon Mar 16 22:36:50 2009
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.slice;
+
+import java.util.Set;
+
+import javax.persistence.EntityManager;
+
+/**
+ * Tests that parent-child relation both @Repliated are stored in all 
replicated
+ * slices.
+ * 
+ * <A HREF="https://issues.apache.org/jira/browse/OPENJPA-981";>OPENJPA-981</A>
+ * 
+ * @author Pinaki Poddar
+ *
+ */
+public class TestReplication extends SingleEMFTestCase {
+    private static int CHILD_COUNT = 3;
+
+    public void setUp() {
+        super.setUp(CLEAR_TABLES);
+        createData();
+    }
+
+    protected String getPersistenceUnitName() {
+        return "replication";
+    }
+    
+    void createData() {
+        EntityManager em = emf.createEntityManager();
+        em.getTransaction().begin();
+        ReplicatedParent parent = new ReplicatedParent();
+        parent.setName("parent");
+        for (int i = 0; i < CHILD_COUNT; i++) {
+            ReplicatedChild child = new ReplicatedChild();
+            child.setName("child-" + i);
+            parent.addChild(child);
+        }
+        em.persist(parent);
+        em.getTransaction().commit();
+        em.clear();
+    }
+    
+    public void testPersistInReplicatedSlices() {
+        EntityManager em = emf.createEntityManager();
+        em.getTransaction().begin();
+
+        String jpql = "select p from ReplicatedParent p where p.name=:name";
+        ReplicatedParent pOne = (ReplicatedParent) em.createQuery(jpql)
+            .setParameter("name", "parent")
+            .setHint(SlicePersistence.HINT_TARGET, "One")
+            .getSingleResult();
+        assertNotNull(pOne);
+
+        assertEquals("[One, Two]", SlicePersistence.getSlice(pOne));
+
+        ReplicatedParent pTwo = (ReplicatedParent) em.createQuery(jpql)
+            .setParameter("name", "parent")
+            .setHint(SlicePersistence.HINT_TARGET, "Two")
+            .getSingleResult();
+        assertNotNull(pTwo);
+        assertEquals("[One, Two]", SlicePersistence.getSlice(pTwo));
+
+        jpql = "select p from ReplicatedChild p where p.name=:name";
+        ReplicatedChild cOne = (ReplicatedChild) em.createQuery(jpql)
+            .setParameter("name", "child-0")
+            .setHint(SlicePersistence.HINT_TARGET, "One")
+            .getSingleResult();
+        assertNotNull(cOne);
+        ReplicatedChild cTwo = (ReplicatedChild) em.createQuery(jpql)
+            .setParameter("name", "child-0")
+            .setHint(SlicePersistence.HINT_TARGET, "Two")
+            .getSingleResult();
+        assertNotNull(cTwo);
+    }
+    
+    public void testQuery() {
+        EntityManager em = emf.createEntityManager();
+        String jpql = "select p from ReplicatedParent p where p.name=:name";
+        ReplicatedParent parent = (ReplicatedParent) em.createQuery(jpql)
+            .setParameter("name", "parent")
+            .setHint(SlicePersistence.HINT_TARGET, "One")
+            .getSingleResult();
+        assertNotNull(parent);
+        Set<ReplicatedChild> children = parent.getChildren();
+        assertNotNull(children);
+        assertEquals(CHILD_COUNT, children.size());
+    }
+    
+    public void testAggregateQuery() {
+        EntityManager em = emf.createEntityManager();
+        String jpql = "select count(p) from ReplicatedParent p";
+        long pCount = (Long) em.createQuery(jpql).getSingleResult();
+        assertEquals(1, pCount);
+        
+        jpql = "select count(p) from ReplicatedChild p";
+        long cCount = (Long) em.createQuery(jpql).getSingleResult();
+        assertEquals(CHILD_COUNT, cCount);
+    }
+    
+}

Modified: 
openjpa/trunk/openjpa-slice/src/test/resources/META-INF/persistence.xml
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-slice/src/test/resources/META-INF/persistence.xml?rev=755031&r1=755030&r2=755031&view=diff
==============================================================================
--- openjpa/trunk/openjpa-slice/src/test/resources/META-INF/persistence.xml 
(original)
+++ openjpa/trunk/openjpa-slice/src/test/resources/META-INF/persistence.xml Mon 
Mar 16 22:36:50 2009
@@ -151,4 +151,29 @@
       </properties>
    </persistence-unit>
    
+   <persistence-unit name="replication">
+         <class>org.apache.openjpa.slice.ReplicatedParent</class>
+         <class>org.apache.openjpa.slice.ReplicatedChild</class>
+         
+      <properties>
+         <property name="openjpa.BrokerFactory" value="slice"/>
+         <property name="openjpa.ConnectionDriverName" 
value="org.apache.derby.jdbc.EmbeddedDriver"/>
+
+         <property name="openjpa.slice.Names" value="One,Two"/>
+         <property name="openjpa.slice.DistributionPolicy" 
value="org.apache.openjpa.slice.policy.UserDistributionPolicy"/>
+         
+         <property name="openjpa.ConnectionUserName" value=""/>
+         <property name="openjpa.ConnectionPassword" value=""/>
+         
+         <property name="openjpa.slice.One.ConnectionURL" 
value="jdbc:derby:target/database/openjpa-slice1;create=true"/>
+         <property name="openjpa.slice.Two.ConnectionURL" 
value="jdbc:derby:target/database/openjpa-slice2;create=true"/>
+         
+         <property name="openjpa.Multithreaded" value="false"/>
+         <property name="openjpa.Log" value="DefaultLevel=INFO, Enhance=TRACE, 
SQL=TRACE"/>
+         <property name="openjpa.jdbc.SynchronizeMappings" value="refresh"/>
+         <property name="openjpa.jdbc.MappingDefaults" 
value="DefaultMissingInfo=true"/>
+         <property name="openjpa.RuntimeUnenhancedClasses" value="supported"/>
+      </properties>
+   </persistence-unit>
+   
 </persistence>


Reply via email to