| /* |
| * 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.List; |
| |
| import javax.persistence.EntityManager; |
| import javax.persistence.Query; |
| |
| /** |
| * Tests query ordering. |
| * |
| * @author Pinaki Poddar |
| * |
| */ |
| public class TestQueryTargetPolicy extends SliceTestCase { |
| |
| private int POBJECT_COUNT = 2; |
| private int VALUE_MIN = 100; |
| |
| protected String getPersistenceUnitName() { |
| return "ordering"; |
| } |
| |
| public void setUp() throws Exception { |
| super.setUp(PObject.class, Person.class, Address.class, Country.class, |
| Car.class, Manufacturer.class, |
| "openjpa.slice.QueryTargetPolicy", |
| "org.apache.openjpa.slice.policy.SampleQueryTargetPolicy", |
| CLEAR_TABLES); |
| int count = count(PObject.class); |
| if (count == 0) { |
| create(POBJECT_COUNT); |
| } |
| } |
| |
| |
| |
| void create(int N) { |
| EntityManager em = emf.createEntityManager(); |
| em.getTransaction().begin(); |
| for (int i=0;i < POBJECT_COUNT;i++) { |
| PObject pc = new PObject(); |
| pc.setValue(VALUE_MIN + i); |
| em.persist(pc); |
| String slice = SlicePersistence.getSlice(pc); |
| String expected = (pc.getValue()%2 == 0) ? "Even" : "Odd"; |
| assertEquals(expected, slice); |
| } |
| Person p1 = new Person(); |
| Person p2 = new Person(); |
| Address a1 = new Address(); |
| Address a2 = new Address(); |
| p1.setName("Even"); |
| p2.setName("Odd"); |
| a1.setCity("San Francisco"); |
| a2.setCity("Rome"); |
| p1.setAddress(a1); |
| p2.setAddress(a2); |
| em.persist(p1); |
| em.persist(p2); |
| assertEquals("Even", SlicePersistence.getSlice(p1)); |
| assertEquals("Odd", SlicePersistence.getSlice(p2)); |
| |
| em.getTransaction().commit(); |
| } |
| |
| public static final String QueryPersonByName = "select p from Person p where p.name=:name"; |
| public static final String QueryPersonByNameSwap = "select q from Person q where q.name=:name"; |
| |
| public void testTargetSingleSlice() { |
| EntityManager em = emf.createEntityManager(); |
| em.getTransaction().begin(); |
| Query q1 = em.createQuery(QueryPersonByName); |
| List<?> result1 = q1.setParameter("name", "Even").getResultList(); |
| String[] targets1 = getTargetSlices(q1); |
| assertArrayEquals(new String[]{"Even"}, targets1); |
| assertFalse(result1.isEmpty()); |
| |
| Query q2 = em.createQuery(QueryPersonByNameSwap); |
| List<?> result2 = q2.setParameter("name", "Even").getResultList(); |
| String[] targets2 = getTargetSlices(q2); |
| assertArrayEquals(new String[]{"Odd"}, targets2); |
| assertTrue(result2.isEmpty()); |
| } |
| |
| <T> void assertArrayEquals(T[] a, T[] b) { |
| assertEquals(a.length, b.length); |
| for (int i = 0; i < a.length; i++) |
| assertEquals(a[i], b[i]); |
| } |
| |
| |
| /** |
| * Gets the slice names on which the given query is targeted. |
| * @param q |
| */ |
| public static String[] getTargetSlices(Query q) { |
| Object targets = q.unwrap(org.apache.openjpa.kernel.Query.class) |
| .getFetchConfiguration() |
| .getHint(SlicePersistence.HINT_TARGET); |
| if (targets == null) |
| return null; |
| if (targets instanceof String) |
| return new String[]{targets.toString()}; |
| if (targets instanceof String[]) { |
| return (String[])targets; |
| } |
| return null; |
| } |
| |
| } |