/*
* 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.sort;
import org.compass.core.CompassHits;
import org.compass.core.CompassQuery;
import org.compass.core.CompassQuery.SortDirection;
import org.compass.core.CompassQuery.SortImplicitType;
import org.compass.core.CompassSession;
import org.compass.core.CompassTransaction;
import org.compass.core.config.CompassSettings;
import org.compass.core.lucene.LuceneEnvironment;
import org.compass.core.test.AbstractTestCase;
public class SortTests extends AbstractTestCase {
protected String[] getMappings() {
return new String[] { "sort/sort.cpm.xml" };
}
@Override
protected void addSettings(CompassSettings settings) {
// set no concurrent operations so sort by id and relevance will worok
settings.setBooleanSetting(LuceneEnvironment.Transaction.Processor.ReadCommitted.CONCURRENT_OPERATIONS, false);
}
protected void setUp() throws Exception {
super.setUp();
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
A a = new A(new Long(1), "aab test testA", 1, 1.1f, new B(new Integer(2), "aab"));
session.save(a);
a = new A(new Long(2), "aac test testA", 2, 1.0f, new B(new Integer(1), "aac"));
session.save(a);
a = new A(new Long(3), "bbc test testB", 10, -1.0f, new B(new Integer(3), "aaa"));
session.save(a);
a = new A(new Long(4), "zx test testB", -10, 1.3f, new B(new Integer(4), "aad"));
session.save(a);
tr.commit();
session.close();
}
public void testSortComponent() {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
CompassHits hits = session.queryBuilder().queryString("test").toQuery()
.addSort("a.id", SortDirection.AUTO).hits();
assertEquals(4, hits.length());
assertAId(1, 0, hits);
assertAId(2, 1, hits);
assertAId(3, 2, hits);
assertAId(4, 3, hits);
hits = session.queryBuilder().queryString("test").toQuery()
.addSort("a.b.id", SortDirection.AUTO).hits();
assertEquals(4, hits.length());
assertAId(2, 0, hits);
assertAId(1, 1, hits);
assertAId(3, 2, hits);
assertAId(4, 3, hits);
hits = session.queryBuilder().queryString("test").toQuery()
.addSort("a.value2", SortDirection.AUTO).hits();
assertEquals(4, hits.length());
assertAId(1, 0, hits);
assertAId(2, 1, hits);
assertAId(3, 2, hits);
assertAId(4, 3, hits);
hits = session.queryBuilder().queryString("test").toQuery()
.addSort("a.b.value2", SortDirection.AUTO).hits();
assertEquals(4, hits.length());
assertAId(3, 0, hits);
assertAId(1, 1, hits);
assertAId(2, 2, hits);
assertAId(4, 3, hits);
tr.commit();
session.close();
}
public void testSortRelevance() {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
CompassQuery query = session.queryBuilder().queryString("test").toQuery();
query.addSort(SortImplicitType.SCORE);
CompassHits hits = query.hits();
assertEquals(4, hits.length());
assertAId(1, 0, hits);
assertAId(2, 1, hits);
assertAId(3, 2, hits);
assertAId(4, 3, hits);
tr.commit();
session.close();
}
public void testSortRelevanceReverse() {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
// TODO WHY is it not reversed?
CompassQuery query = session.queryBuilder().queryString("test").toQuery();
query.addSort(SortImplicitType.SCORE, SortDirection.REVERSE);
CompassHits hits = query.hits();
assertEquals(4, hits.length());
assertAId(1, 0, hits);
assertAId(2, 1, hits);
assertAId(3, 2, hits);
assertAId(4, 3, hits);
tr.commit();
session.close();
}
public void testSortDoc() {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
CompassQuery query = session.queryBuilder().queryString("test").toQuery();
query.addSort(SortImplicitType.DOC);
CompassHits hits = query.hits();
assertEquals(4, hits.length());
assertAId(1, 0, hits);
assertAId(2, 1, hits);
assertAId(3, 2, hits);
assertAId(4, 3, hits);
tr.commit();
session.close();
}
public void testSortDocReverse() {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
CompassQuery query = session.queryBuilder().queryString("test").toQuery();
query.addSort(SortImplicitType.DOC, SortDirection.REVERSE);
CompassHits hits = query.hits();
assertEquals(4, hits.length());
assertAId(4, 0, hits);
assertAId(3, 1, hits);
assertAId(2, 2, hits);
assertAId(1, 3, hits);
tr.commit();
session.close();
}
public void testSortString() {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
CompassQuery query = session.queryBuilder().queryString("test").toQuery();
query.addSort("value", CompassQuery.SortPropertyType.STRING);
CompassHits hits = query.hits();
assertEquals(4, hits.length());
assertAId(1, 0, hits);
assertAId(2, 1, hits);
assertAId(3, 2, hits);
assertAId(4, 3, hits);
tr.commit();
session.close();
}
public void testSortStringReverse() {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
CompassQuery query = session.queryBuilder().queryString("test").toQuery();
query.addSort("value", CompassQuery.SortPropertyType.STRING, CompassQuery.SortDirection.REVERSE);
CompassHits hits = query.hits();
assertEquals(4, hits.length());
assertAId(4, 0, hits);
assertAId(3, 1, hits);
assertAId(2, 2, hits);
assertAId(1, 3, hits);
tr.commit();
session.close();
}
public void testSortInt() {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
CompassQuery query = session.queryBuilder().queryString("test").toQuery();
query.addSort("intValue", CompassQuery.SortPropertyType.INT);
CompassHits hits = query.hits();
assertEquals(4, hits.length());
assertAId(4, 0, hits);
assertAId(1, 1, hits);
assertAId(2, 2, hits);
assertAId(3, 3, hits);
tr.commit();
session.close();
}
public void testSortIntReverse() {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
CompassQuery query = session.queryBuilder().queryString("test").toQuery();
query.addSort("intValue", CompassQuery.SortPropertyType.INT, CompassQuery.SortDirection.REVERSE);
CompassHits hits = query.hits();
assertEquals(4, hits.length());
assertAId(3, 0, hits);
assertAId(2, 1, hits);
assertAId(1, 2, hits);
assertAId(4, 3, hits);
tr.commit();
session.close();
}
public void testSortFloat() {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
CompassQuery query = session.queryBuilder().queryString("test").toQuery();
query.addSort("floatValue", CompassQuery.SortPropertyType.FLOAT);
CompassHits hits = query.hits();
assertEquals(4, hits.length());
assertAId(3, 0, hits);
assertAId(2, 1, hits);
assertAId(1, 2, hits);
assertAId(4, 3, hits);
tr.commit();
session.close();
}
public void testSortFloatReverse() {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
CompassQuery query = session.queryBuilder().queryString("test").toQuery();
query.addSort("floatValue", CompassQuery.SortPropertyType.FLOAT, CompassQuery.SortDirection.REVERSE);
CompassHits hits = query.hits();
assertEquals(4, hits.length());
assertAId(4, 0, hits);
assertAId(1, 1, hits);
assertAId(2, 2, hits);
assertAId(3, 3, hits);
tr.commit();
session.close();
}
private void assertAId(long id, int hitNum, CompassHits hits) {
A a = (A) hits.data(hitNum);
assertEquals(id, a.getId().longValue());
}
}