260 lines
8 KiB
JavaScript
260 lines
8 KiB
JavaScript
//
|
|
// Jala Project [http://opensvn.csie.org/traccgi/jala]
|
|
//
|
|
// Copyright 2004 ORF Online und Teletext GmbH
|
|
//
|
|
// 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.
|
|
//
|
|
// $Revision$
|
|
// $LastChangedBy$
|
|
// $LastChangedDate$
|
|
// $HeadURL$
|
|
//
|
|
|
|
/**
|
|
* Contains the index manager to test
|
|
* @type jala.IndexManager
|
|
*/
|
|
var index;
|
|
|
|
/**
|
|
* Contains the queue of the index manager
|
|
*/
|
|
var queue;
|
|
|
|
/**
|
|
* A global id "counter"
|
|
*/
|
|
var idCounter;
|
|
|
|
/**
|
|
* Called before running the tests
|
|
*/
|
|
var setup = function() {
|
|
// create the index to test
|
|
var dir = new java.io.File(java.lang.System.getProperty("java.io.tmpdir"));
|
|
index = new jala.IndexManager("test", dir, "de");
|
|
queue = index.getQueue();
|
|
idCounter = 0;
|
|
index.start();
|
|
index.add(createDocumentObject());
|
|
return;
|
|
};
|
|
|
|
/**
|
|
* Called after tests have finished. This method will be called
|
|
* regarless whether the test succeeded or failed.
|
|
*/
|
|
var cleanup = function() {
|
|
if (index) {
|
|
// clear the index before removing the index directory itself
|
|
index.getIndex().create();
|
|
var dir = new java.io.File(java.lang.System.getProperty("java.io.tmpdir"), "test");
|
|
if (dir.exists()) {
|
|
var segments = new java.io.File(dir, "segments");
|
|
if (segments.exists()) {
|
|
segments["delete"]();
|
|
}
|
|
dir["delete"]();
|
|
}
|
|
index.stop();
|
|
}
|
|
return;
|
|
};
|
|
|
|
/**
|
|
* Test adding a document object immediately
|
|
*/
|
|
var testAdd = function() {
|
|
index.add(createDocumentObject());
|
|
// check queue and job
|
|
assertEqual("q size", queue.size(), 2);
|
|
assertEqual("q 0th type", queue.get(0).type, jala.IndexManager.Job.ADD);
|
|
// check if the document was added correctly
|
|
// but give the index manager time to process
|
|
java.lang.Thread.currentThread().sleep(500);
|
|
assertEqual("index size", index.getIndex().size(), 2);
|
|
assertEqual("new q size", queue.size(), 0);
|
|
// check if the index has been optimized
|
|
var reader = null;
|
|
try {
|
|
reader = index.getIndex().getReader();
|
|
assertTrue(reader.isOptimized());
|
|
} finally {
|
|
if (reader !== null) {
|
|
reader.close();
|
|
}
|
|
}
|
|
return;
|
|
};
|
|
|
|
/**
|
|
* Test removing a document object immediately
|
|
*/
|
|
var testRemove = function() {
|
|
var id = 0;
|
|
index.remove(id);
|
|
// check queue and job
|
|
assertEqual("queue size", queue.size(), 2);
|
|
assertEqual("type is remove", queue.get(1).type, jala.IndexManager.Job.REMOVE);
|
|
// check if the document was added correctly
|
|
// but give the index manager time to process
|
|
java.lang.Thread.currentThread().sleep(500);
|
|
assertEqual("empty index", index.getIndex().size(), 0);
|
|
assertEqual("empty queue", queue.size(), 0);
|
|
// check if the index has been optimized
|
|
var reader = null;
|
|
try {
|
|
reader = index.getIndex().getReader();
|
|
assertTrue("is optimized", reader.isOptimized());
|
|
} finally {
|
|
if (reader !== null) {
|
|
reader.close();
|
|
}
|
|
}
|
|
return;
|
|
};
|
|
|
|
/**
|
|
* Test immediate index optimization
|
|
*/
|
|
var testOptimize = function() {
|
|
index.optimize();
|
|
// check queue and job
|
|
assertEqual(queue.size(), 2);
|
|
assertEqual(queue.get(1).type, jala.IndexManager.Job.OPTIMIZE);
|
|
// give the index manager time to process
|
|
java.lang.Thread.currentThread().sleep(300);
|
|
assertFalse(index.hasOptimizingJob());
|
|
// check if the index has been optimized
|
|
var reader = null;
|
|
try {
|
|
reader = index.getIndex().getReader();
|
|
assertTrue(reader.isOptimized());
|
|
} finally {
|
|
if (reader !== null) {
|
|
reader.close();
|
|
}
|
|
}
|
|
return;
|
|
};
|
|
|
|
/**
|
|
* Creates a new document object to be put into the index
|
|
* @returns A newly created document object containing test data
|
|
* @type helma.Search.Document
|
|
*/
|
|
var createDocumentObject = function() {
|
|
var id = idCounter;
|
|
var doc = new helma.Search.Document();
|
|
doc.addField("id", id, {store: "yes", index: "unTokenized"});
|
|
doc.addField("name", "Document " + id, {store: "yes", index: "tokenized"});
|
|
doc.addField("createtime", (new Date()).format("yyyyMMddHHmm"), {store: "yes", index: "unTokenized"});
|
|
idCounter += 1;
|
|
return doc;
|
|
};
|
|
|
|
/**
|
|
* Test query parsing
|
|
*/
|
|
var testParseQuery = function() {
|
|
assertThrows(function() {
|
|
index.parseQuery();
|
|
});
|
|
assertThrows(function() {
|
|
index.parseQuery("test");
|
|
});
|
|
var query;
|
|
query = index.parseQuery("test", ["title"]);
|
|
assertTrue(query instanceof Packages.org.apache.lucene.search.TermQuery);
|
|
assertEqual(query.getTerm().field(), "title");
|
|
query = index.parseQuery("test again", ["title"]);
|
|
assertTrue(query instanceof Packages.org.apache.lucene.search.BooleanQuery);
|
|
assertEqual(query.getClauses().length, 2);
|
|
|
|
// test with more than one field
|
|
query = index.parseQuery("test", ["title", "body"]);
|
|
assertTrue(query instanceof Packages.org.apache.lucene.search.BooleanQuery);
|
|
assertEqual(query.getClauses().length, 2);
|
|
assertEqual(query.getClauses()[0].getQuery().getTerm().field(), "title");
|
|
assertEqual(query.getClauses()[1].getQuery().getTerm().field(), "body");
|
|
|
|
// test boostmap
|
|
query = index.parseQuery("test", ["title", "body", "creator"], {title: 10, body: 5});
|
|
assertEqual(query.getClauses()[0].getQuery().getBoost(), 10);
|
|
assertEqual(query.getClauses()[1].getQuery().getBoost(), 5);
|
|
// default boost factor is 1
|
|
assertEqual(query.getClauses()[2].getQuery().getBoost(), 1);
|
|
return;
|
|
};
|
|
|
|
/**
|
|
* Test query filter parsing
|
|
*/
|
|
var testParseQueryFilter = function() {
|
|
assertNull(index.parseQueryFilter());
|
|
var query;
|
|
query = index.parseQueryFilter("title:test");
|
|
assertTrue(query instanceof Packages.org.apache.lucene.search.CachingWrapperFilter);
|
|
// FIXME: can't reach the wrapped query filter, therefor this stupid assertion
|
|
assertEqual(query.toString(), "CachingWrapperFilter(QueryWrapperFilter(title:test))");
|
|
query = index.parseQueryFilter(["title:test", "body:test"]);
|
|
assertTrue(query instanceof Packages.org.apache.lucene.search.CachingWrapperFilter);
|
|
assertEqual(query.toString(), "CachingWrapperFilter(QueryWrapperFilter(+title:test +body:test))");
|
|
return;
|
|
};
|
|
|
|
/**
|
|
* Test searching the index
|
|
*/
|
|
var testSearch = function() {
|
|
for (var i = 0; i < 10; i += 1) {
|
|
index.add(createDocumentObject());
|
|
}
|
|
// check if the documents was added correctly
|
|
// but give the index manager time to process
|
|
java.lang.Thread.currentThread().sleep(300);
|
|
// check if the index has been optimized
|
|
var reader = null;
|
|
try {
|
|
reader = index.getIndex().getReader();
|
|
assertTrue("is optimized", reader.isOptimized());
|
|
} finally {
|
|
if (reader !== null) {
|
|
reader.close();
|
|
}
|
|
}
|
|
|
|
var query = index.parseQuery("doc*", ["name"]);
|
|
var hits, filter, sortFields;
|
|
// test basic search
|
|
hits = index.search(query);
|
|
assertNotNull("non null hits", hits);
|
|
assertEqual("hit count", hits.size(), 11);
|
|
// test (stupid) filtering
|
|
filter = index.parseQueryFilter("id:1");
|
|
hits = index.search(query, filter);
|
|
assertEqual("1 hit", hits.size(), 1);
|
|
assertEqual("first hit id", parseInt(hits.get(0).getField("id").value, 10), 1);
|
|
// test range filtering
|
|
filter = index.parseQueryFilter("id:[2 TO 6]");
|
|
hits = index.search(query, filter);
|
|
assertEqual("5 hits", hits.size(), 5);
|
|
// test sorting
|
|
sortFields = [new Packages.org.apache.lucene.search.SortField("id", true)];
|
|
hits = index.search(query, null, sortFields);
|
|
assertEqual("new hit count", hits.size(), 11);
|
|
assertEqual("first hit id", parseInt(hits.get(0).getField("id").value, 10), 10);
|
|
assertEqual("last hit id", parseInt(hits.get(9).getField("id").value, 10), 1);
|
|
return;
|
|
};
|