this merges the master head of https://github.com/helma-org/apps-modules-mirror into helma
347 lines
No EOL
9.4 KiB
JavaScript
347 lines
No EOL
9.4 KiB
JavaScript
var tests = [
|
|
"testConstructor",
|
|
"testGetDirectory",
|
|
"testGetRAMDirectory",
|
|
"testCreateIndex",
|
|
"testGetReaderWriter",
|
|
"testIndexLock",
|
|
"testDocument",
|
|
"testAddDocuments",
|
|
"testSearch"
|
|
];
|
|
|
|
app.addRepository("modules/helma/Search.js");
|
|
|
|
var indexName = "testindex";
|
|
var basePath = java.lang.System.getProperty("java.io.tmpdir");
|
|
var index;
|
|
|
|
/**
|
|
* Test preliminaries
|
|
*/
|
|
var setup = function() {
|
|
// check if there is a (leftover) directory with the same name
|
|
// in the system's temporary directory - if so throw an exception and stop
|
|
var dir = new helma.File(basePath, indexName);
|
|
if (dir.exists()) {
|
|
throw "There is already a directory '" + dir.getAbsolutePath() +
|
|
"', please remove it before trying to run test again";
|
|
}
|
|
return;
|
|
};
|
|
|
|
/**
|
|
* Test the helma.Search constructor to make sure Lucene is loaded
|
|
*/
|
|
var testConstructor = function() {
|
|
// should not throw an exception
|
|
var s = new helma.Search();
|
|
return;
|
|
};
|
|
|
|
/**
|
|
* Test getDirectory method
|
|
*/
|
|
var testGetDirectory = function() {
|
|
var search = new helma.Search();
|
|
assertThrows(function() {
|
|
search.getDirectory();
|
|
});
|
|
var dirs = [
|
|
new helma.File(basePath, indexName),
|
|
new File(basePath, indexName),
|
|
new java.io.File(basePath, indexName),
|
|
basePath + "/" + indexName
|
|
];
|
|
var dir, fsDir, dirPath;
|
|
for (var i in dirs) {
|
|
dir = dirs[i];
|
|
if (dir.constructor != String) {
|
|
dirPath = dir.getAbsolutePath();
|
|
} else {
|
|
dirPath = dir;
|
|
}
|
|
fsDir = search.getDirectory(dir);
|
|
assertNotNull(fsDir);
|
|
assertEqual(fsDir.getFile().getAbsolutePath(), dirPath);
|
|
}
|
|
return;
|
|
};
|
|
|
|
/**
|
|
* Test getRAMDirectory method
|
|
*/
|
|
var testGetRAMDirectory = function() {
|
|
var search = new helma.Search();
|
|
assertThrows(function() {
|
|
search.getDirectory();
|
|
});
|
|
var dirs = [
|
|
new helma.File(basePath, indexName),
|
|
new File(basePath, indexName),
|
|
new java.io.File(basePath, indexName),
|
|
basePath + "/" + indexName
|
|
];
|
|
var dir, ramDir;
|
|
for (var i in dirs) {
|
|
dir = dirs[i];
|
|
ramDir = search.getRAMDirectory(dir);
|
|
assertNotNull(ramDir);
|
|
}
|
|
return;
|
|
};
|
|
|
|
/**
|
|
* Test index creation - this method creates a RAMDirectory based
|
|
* index for testing and stores it in the global variable "index"
|
|
*/
|
|
var testCreateIndex = function() {
|
|
var search = new helma.Search();
|
|
// test creating a file based index
|
|
var fsDir = search.getDirectory(new helma.File(basePath, indexName));
|
|
index = search.createIndex(fsDir);
|
|
assertNotNull(index);
|
|
// explicitly test index.create(true)
|
|
assertTrue(index.create(true));
|
|
|
|
// test creating a ram based index
|
|
var ramDir = search.getRAMDirectory();
|
|
index = search.createIndex(ramDir);
|
|
assertNotNull(index);
|
|
// explicitly test index.create(true)
|
|
assertTrue(index.create(true));
|
|
assertEqual(index.constructor, helma.Search.Index);
|
|
assertEqual(index.size(), 0);
|
|
return;
|
|
};
|
|
|
|
/**
|
|
* Test getting index reader, writer and modifier
|
|
*/
|
|
var testGetReaderWriter = function() {
|
|
// test getReader
|
|
var reader = index.getReader();
|
|
assertNotNull(reader);
|
|
reader.close();
|
|
// test getWriter
|
|
var writer = index.getWriter();
|
|
assertNotNull(writer);
|
|
writer.close();
|
|
return;
|
|
};
|
|
|
|
/**
|
|
* Test index locking
|
|
*/
|
|
var testIndexLock = function() {
|
|
// test if the index is correctly locked when opening a writer
|
|
var writer = index.getWriter();
|
|
assertTrue(index.isLocked());
|
|
// test if getWriter() throws an exception when trying to open a second writer
|
|
assertThrows(function() {
|
|
index.getWriter();
|
|
});
|
|
writer.close();
|
|
assertFalse(index.isLocked());
|
|
return;
|
|
};
|
|
|
|
/**
|
|
* Test document constructor and methods
|
|
*/
|
|
var testDocument = function() {
|
|
var doc = new helma.Search.Document();
|
|
var f;
|
|
|
|
// test type conversion
|
|
f = new helma.Search.Document.Field("id", 1);
|
|
assertEqual(f.value.constructor, String);
|
|
assertEqual(f.value, "1");
|
|
var now = new Date();
|
|
f = new helma.Search.Document.Field("createtime", now);
|
|
assertEqual(f.dateValue.constructor, Date);
|
|
assertEqual(f.dateValue.getTime(), now.getTime() - (now.getTime() % 60000));
|
|
|
|
// test adding field with default store and index options
|
|
doc.addField(new helma.Search.Document.Field("id", 1));
|
|
f = doc.getField("id");
|
|
assertNotNull(f);
|
|
assertTrue(f.isStored());
|
|
assertTrue(f.isIndexed());
|
|
assertTrue(f.isTokenized());
|
|
|
|
// test adding date field with changed field options
|
|
f = new helma.Search.Document.Field("createtime", new Date(), {
|
|
store: "no",
|
|
index: "tokenized"
|
|
});
|
|
doc.addField(f);
|
|
f = doc.getField("createtime");
|
|
assertNotNull(f);
|
|
assertFalse(f.isStored());
|
|
assertTrue(f.isIndexed());
|
|
assertTrue(f.isTokenized());
|
|
|
|
// test deprecated way of calling addField()
|
|
doc.addField("title", "Just a test", {
|
|
"store": false,
|
|
"index": true,
|
|
"tokenize": false
|
|
});
|
|
f = doc.getField("title");
|
|
assertNotNull(f);
|
|
assertFalse(f.isStored());
|
|
assertTrue(f.isIndexed());
|
|
assertFalse(f.isTokenized());
|
|
|
|
// test getFields()
|
|
var fields = doc.getFields();
|
|
assertEqual(fields.length, 3);
|
|
assertEqual(fields[0].name, "id");
|
|
assertEqual(fields[1].name, "createtime");
|
|
assertEqual(fields[2].name, "title");
|
|
return;
|
|
};
|
|
|
|
/**
|
|
* Test adding documents
|
|
*/
|
|
var testAddDocuments = function() {
|
|
// test addDocument()
|
|
var doc = new helma.Search.Document();
|
|
doc.addField(new helma.Search.Document.Field("id", 1));
|
|
index.addDocument(doc);
|
|
assertEqual(index.size(), 1);
|
|
|
|
// test removeDocument()
|
|
index.removeDocument("id", 1);
|
|
assertEqual(index.size(), 0);
|
|
|
|
// test addDocuments() and removeDocuments() with an array
|
|
doc = new helma.Search.Document();
|
|
doc.addField(new helma.Search.Document.Field("id", 2));
|
|
index.addDocuments([doc]);
|
|
assertEqual(index.size(), 1);
|
|
index.removeDocuments("id", [2]);
|
|
assertEqual(index.size(), 0);
|
|
|
|
// test addDocuments() and removeDocuments() with a Hashtable as argument
|
|
var ht = new java.util.Hashtable();
|
|
ht.put("doc", doc);
|
|
index.addDocuments(ht);
|
|
ht = new java.util.Hashtable();
|
|
ht.put("id", 1);
|
|
ht.put("id", 2);
|
|
index.removeDocuments("id", ht);
|
|
assertEqual(index.size(), 0);
|
|
|
|
// test addDocuments() and removeDocuments() with a Vector as argument
|
|
var v = new java.util.Vector();
|
|
v.add(doc);
|
|
index.addDocuments(v);
|
|
v = new java.util.Vector();
|
|
v.add(1);
|
|
v.add(2);
|
|
index.removeDocuments("id", v);
|
|
assertEqual(index.size(), 0);
|
|
|
|
// test updateDocument
|
|
index.addDocument(doc);
|
|
doc = new helma.Search.Document();
|
|
doc.addField("id", 2);
|
|
index.updateDocument(doc, "id");
|
|
assertEqual(index.size(), 1);
|
|
|
|
// test count()
|
|
doc = new helma.Search.Document();
|
|
doc.addField("id", 3);
|
|
index.addDocument(doc);
|
|
assertEqual(index.count("id", 3), 1);
|
|
|
|
return;
|
|
};
|
|
|
|
/**
|
|
* Test searching the index
|
|
*/
|
|
var testSearch = function() {
|
|
// clear the index
|
|
index.create();
|
|
assertEqual(index.size(), 0);
|
|
|
|
// populate the index with test content
|
|
var names = [
|
|
"foo",
|
|
"bar",
|
|
"baz"
|
|
];
|
|
|
|
var now = new Date();
|
|
var doc;
|
|
names.forEach(function(name, idx) {
|
|
doc = new helma.Search.Document();
|
|
doc.addField("id", idx + 1);
|
|
doc.addField("parent", idx % 2);
|
|
doc.addField("name", name);
|
|
doc.addField("timestamp", new Date(now.getTime() - (idx * 1e6)));
|
|
index.addDocument(doc);
|
|
});
|
|
assertEqual(index.size(), 3);
|
|
|
|
var searcher = index.getSearcher();
|
|
assertNotNull(searcher);
|
|
assertNull(searcher.sortFields);
|
|
assertNotNull(searcher.getSearcher());
|
|
assertTrue(searcher.getSearcher() instanceof Packages.org.apache.lucene.search.IndexSearcher);
|
|
|
|
// test basic search
|
|
var q = new helma.Search.TermQuery("id", 1);
|
|
assertEqual(searcher.search(q), 1);
|
|
assertNotNull(searcher.hits);
|
|
assertEqual(searcher.hits.constructor, helma.Search.HitCollection);
|
|
assertEqual(searcher.hits.size(), 1);
|
|
var hit = searcher.hits.get(0);
|
|
assertNotNull(hit);
|
|
assertEqual(hit.constructor, helma.Search.Document);
|
|
assertEqual(hit.getField("name").constructor, helma.Search.Document.Field);
|
|
assertEqual(hit.getField("name").value, "foo");
|
|
// test date value conversion
|
|
assertEqual(hit.getField("timestamp").value.constructor, String);
|
|
assertEqual(hit.getField("timestamp").dateValue.constructor, Date);
|
|
|
|
// test query filter
|
|
var qf = new helma.Search.QueryFilter(new helma.Search.TermQuery("parent", 0));
|
|
q = new helma.Search.WildcardQuery("name", "ba*");
|
|
assertEqual(searcher.search(q, qf), 1);
|
|
assertEqual(searcher.hits.get(0).getField("name").value, names[2]);
|
|
|
|
// test sorting of hits
|
|
searcher.sortBy("id", true);
|
|
assertEqual(searcher.search(q), 2);
|
|
assertEqual(searcher.hits.get(0).getField("name").value, names[2]);
|
|
assertEqual(searcher.hits.get(1).getField("name").value, names[1]);
|
|
|
|
// test boolean query
|
|
q = new helma.Search.BooleanQuery();
|
|
q.addTerm("parent", "0");
|
|
assertEqual(q.toString(), "[(parent:0)]");
|
|
q = new helma.Search.BooleanQuery();
|
|
q.addTerm("parent", "0", "and");
|
|
assertEqual(q.toString(), "[+(parent:0)]");
|
|
q = new helma.Search.BooleanQuery();
|
|
q.addTerm("parent", "0", "not");
|
|
assertEqual(q.toString(), "[-(parent:0)]");
|
|
|
|
searcher.close();
|
|
return;
|
|
};
|
|
|
|
/**
|
|
* Cleanup
|
|
*/
|
|
var cleanup = function() {
|
|
// remove the directory containing the test index
|
|
var dir = new helma.File(basePath, indexName);
|
|
dir.removeDirectory();
|
|
return;
|
|
} |