/*
* Copyright 2004-2009 the original author or authors.
*
* Licensed 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.compass.core.test.component.samechild;
import java.util.ArrayList;
import java.util.List;
import org.compass.core.CompassHits;
import org.compass.core.CompassQuery;
import org.compass.core.CompassSession;
import org.compass.core.CompassTransaction;
import org.compass.core.cache.first.PlainFirstLevelCache;
import org.compass.core.config.CompassEnvironment;
import org.compass.core.config.CompassSettings;
import org.compass.core.test.AbstractTestCase;
/**
* @author kimchy
*/
public class SameChildTests extends AbstractTestCase {
protected String[] getMappings() {
return new String[]{"component/samechild/mapping.cpm.xml"};
}
protected void addSettings(CompassSettings settings) {
settings.setSetting(CompassEnvironment.Cache.FirstLevel.TYPE, PlainFirstLevelCache.class.getName());
}
public void testSameChildSameParent() throws Exception {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
Parent p = createParent(1);
ArrayList<Child> children = new ArrayList<Child>();
children.add(createChild(1)); // 1
children.add(createChild(2)); // 2
children.add(children.get(0)); // 3
children.add(createChild(3)); // 4
children.add(children.get(1)); // 5
children.add(children.get(0)); // 6
children.add(createChild(4)); // 7
p.children = children;
assertIdsMatchNames("All original children", children);
assertIdsMatchNames("Original p children", p.children);
session.save(p);
p = session.load(Parent.class, 1);
assertIdsMatchNames("All fetched children", p.children);
assertEquals(1, p.children.get(0).id);
assertEquals(2, p.children.get(1).id);
assertEquals(1, p.children.get(2).id);
assertEquals(3, p.children.get(3).id);
assertEquals(2, p.children.get(4).id);
assertEquals(1, p.children.get(5).id);
assertEquals(4, p.children.get(6).id);
assertEquals("child1", p.children.get(0).name);
assertEquals("child2", p.children.get(1).name);
assertEquals("child1", p.children.get(2).name);
assertEquals("child3", p.children.get(3).name);
assertEquals("child2", p.children.get(4).name);
assertEquals("child1", p.children.get(5).name);
assertEquals("child4", p.children.get(6).name);
tr.commit();
session.close();
}
public void testSameChildDifferentParents() throws Exception {
Parent p1 = createParent(1);
Parent p2 = createParent(2);
ArrayList<Child> children = new ArrayList<Child>();
children.add(createChild(1));
children.add(createChild(3));
children.add(createChild(2));
p1.children = children.subList(0, 2);
p2.children = children.subList(1, 3);
// initial test
assertIdsMatchNames("All original children", children);
assertIdsMatchNames("Original p1 children", p1.children);
assertIdsMatchNames("Original p2 children", p2.children);
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
for (Child child : children) {
session.save(child);
}
session.save(p1);
session.save(p2);
tr.commit();
session.close();
session = openSession();
tr = session.beginTransaction();
p1 = session.load(Parent.class, "1");
p2 = session.load(Parent.class, "2");
children = new ArrayList<Child>();
CompassQuery query = session.queryBuilder().matchAll().setAliases("child");
CompassHits hits = query.hits();
for (int i = 0, n = hits.length(); i < n; i++) {
children.add((Child) hits.data(i));
}
tr.commit();
session.close();
assertIdsMatchNames("All fetched children", children);
assertIdsMatchNames("Fetched p1 children", p1.children);
assertIdsMatchNames("Fetched p2 children", p2.children);
}
private void assertIdsMatchNames(String header, List<Child> children) {
// System.out.println(header);
for (Child c : children) {
assertEquals("child" + c.id, c.name);
}
}
private Child createChild(int i) {
Child c = new Child();
c.id = i;
c.name = "child" + i;
return c;
}
private Parent createParent(int i) {
Parent p = new Parent();
p.id = i;
p.name = "parent" + i;
return p;
}
}