helma/modules/jala/tests/IndexManager.js

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;
};