123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552 |
- suite('lunr.QueryParser', function () {
- var parse = function (q) {
- var query = new lunr.Query (['title', 'body']),
- parser = new lunr.QueryParser(q, query)
- parser.parse()
- return query.clauses
- }
- suite('#parse', function () {
- suite('single term', function () {
- setup(function () {
- this.clauses = parse('foo')
- })
- test('has 1 clause', function () {
- assert.lengthOf(this.clauses, 1)
- })
- suite('clauses', function () {
- setup(function () {
- this.clause = this.clauses[0]
- })
- test('term', function () {
- assert.equal('foo', this.clause.term)
- })
- test('fields', function () {
- assert.sameMembers(['title', 'body'], this.clause.fields)
- })
- test('presence', function () {
- assert.equal(lunr.Query.presence.OPTIONAL, this.clause.presence)
- })
- test('usePipeline', function () {
- assert.ok(this.clause.usePipeline)
- })
- })
- })
- suite('single term, uppercase', function () {
- setup(function () {
- this.clauses = parse('FOO')
- })
- test('has 1 clause', function () {
- assert.lengthOf(this.clauses, 1)
- })
- suite('clauses', function () {
- setup(function () {
- this.clause = this.clauses[0]
- })
- test('term', function () {
- assert.equal('foo', this.clause.term)
- })
- test('fields', function () {
- assert.sameMembers(['title', 'body'], this.clause.fields)
- })
- test('usePipeline', function () {
- assert.ok(this.clause.usePipeline)
- })
- })
- })
- suite('single term with wildcard', function () {
- setup(function () {
- this.clauses = parse('fo*')
- })
- test('has 1 clause', function () {
- assert.lengthOf(this.clauses, 1)
- })
- suite('clauses', function () {
- setup(function () {
- this.clause = this.clauses[0]
- })
- test('#term', function () {
- assert.equal('fo*', this.clause.term)
- })
- test('#usePipeline', function () {
- assert.ok(!this.clause.usePipeline)
- })
- })
- })
- suite('multiple terms', function () {
- setup(function () {
- this.clauses = parse('foo bar')
- })
- test('has 2 clause', function () {
- assert.lengthOf(this.clauses, 2)
- })
- suite('clauses', function () {
- test('#term', function () {
- assert.equal('foo', this.clauses[0].term)
- assert.equal('bar', this.clauses[1].term)
- })
- })
- })
- suite('multiple terms with presence', function () {
- setup(function () {
- this.clauses = parse('+foo +bar')
- })
- test('has 2 clause', function () {
- assert.lengthOf(this.clauses, 2)
- })
- })
- suite('edit distance followed by presence', function () {
- setup(function () {
- this.clauses = parse('foo~10 +bar')
- })
- test('has 2 clause', function () {
- assert.lengthOf(this.clauses, 2)
- })
- suite('clauses', function () {
- setup(function () {
- this.fooClause = this.clauses[0]
- this.barClause = this.clauses[1]
- })
- test('#term', function () {
- assert.equal('foo', this.fooClause.term)
- assert.equal('bar', this.barClause.term)
- })
- test('#presence', function () {
- assert.equal(lunr.Query.presence.OPTIONAL, this.fooClause.presence)
- assert.equal(lunr.Query.presence.REQUIRED, this.barClause.presence)
- })
- test('#editDistance', function () {
- assert.equal(10, this.fooClause.editDistance)
- // It feels dirty asserting that something is undefined
- // but there is no Optional so this is what we are reduced to
- assert.isUndefined(this.barClause.editDistance)
- })
- })
- })
- suite('boost followed by presence', function () {
- setup(function () {
- this.clauses = parse('foo^10 +bar')
- })
- test('has 2 clause', function () {
- assert.lengthOf(this.clauses, 2)
- })
- suite('clauses', function () {
- setup(function () {
- this.fooClause = this.clauses[0]
- this.barClause = this.clauses[1]
- })
- test('#term', function () {
- assert.equal('foo', this.fooClause.term)
- assert.equal('bar', this.barClause.term)
- })
- test('#presence', function () {
- assert.equal(lunr.Query.presence.OPTIONAL, this.fooClause.presence)
- assert.equal(lunr.Query.presence.REQUIRED, this.barClause.presence)
- })
- test('#boost', function () {
- assert.equal(10, this.fooClause.boost)
- assert.equal(1, this.barClause.boost)
- })
- })
- })
- suite('field without a term', function () {
- test('fails with lunr.QueryParseError', function () {
- assert.throws(function () { parse('title:') }, lunr.QueryParseError)
- })
- })
- suite('unknown field', function () {
- test('fails with lunr.QueryParseError', function () {
- assert.throws(function () { parse('unknown:foo') }, lunr.QueryParseError)
- })
- })
- suite('term with field', function () {
- setup(function () {
- this.clauses = parse('title:foo')
- })
- test('has 1 clause', function () {
- assert.lengthOf(this.clauses, 1)
- })
- test('clause contains only scoped field', function () {
- assert.sameMembers(this.clauses[0].fields, ['title'])
- })
- })
- suite('uppercase field with uppercase term', function () {
- setup(function () {
- // Using a different query to the rest of the tests
- // so that only this test has to worry about an upcase field name
- var query = new lunr.Query (['TITLE']),
- parser = new lunr.QueryParser("TITLE:FOO", query)
- parser.parse()
- this.clauses = query.clauses
- })
- test('has 1 clause', function () {
- assert.lengthOf(this.clauses, 1)
- })
- test('clause contains downcased term', function () {
- assert.equal(this.clauses[0].term, 'foo')
- })
- test('clause contains only scoped field', function () {
- assert.sameMembers(this.clauses[0].fields, ['TITLE'])
- })
- })
- suite('multiple terms scoped to different fields', function () {
- setup(function () {
- this.clauses = parse('title:foo body:bar')
- })
- test('has 2 clauses', function () {
- assert.lengthOf(this.clauses, 2)
- })
- test('fields', function () {
- assert.sameMembers(['title'], this.clauses[0].fields)
- assert.sameMembers(['body'], this.clauses[1].fields)
- })
- test('terms', function () {
- assert.equal('foo', this.clauses[0].term)
- assert.equal('bar', this.clauses[1].term)
- })
- })
- suite('single term with edit distance', function () {
- setup(function () {
- this.clauses = parse('foo~2')
- })
- test('has 1 clause', function () {
- assert.lengthOf(this.clauses, 1)
- })
- test('term', function () {
- assert.equal('foo', this.clauses[0].term)
- })
- test('editDistance', function () {
- assert.equal(2, this.clauses[0].editDistance)
- })
- test('fields', function () {
- assert.sameMembers(['title', 'body'], this.clauses[0].fields)
- })
- })
- suite('multiple terms with edit distance', function () {
- setup(function () {
- this.clauses = parse('foo~2 bar~3')
- })
- test('has 2 clauses', function () {
- assert.lengthOf(this.clauses, 2)
- })
- test('term', function () {
- assert.equal('foo', this.clauses[0].term)
- assert.equal('bar', this.clauses[1].term)
- })
- test('editDistance', function () {
- assert.equal(2, this.clauses[0].editDistance)
- assert.equal(3, this.clauses[1].editDistance)
- })
- test('fields', function () {
- assert.sameMembers(['title', 'body'], this.clauses[0].fields)
- assert.sameMembers(['title', 'body'], this.clauses[1].fields)
- })
- })
- suite('single term scoped to field with edit distance', function () {
- setup(function () {
- this.clauses = parse('title:foo~2')
- })
- test('has 1 clause', function () {
- assert.lengthOf(this.clauses, 1)
- })
- test('term', function () {
- assert.equal('foo', this.clauses[0].term)
- })
- test('editDistance', function () {
- assert.equal(2, this.clauses[0].editDistance)
- })
- test('fields', function () {
- assert.sameMembers(['title'], this.clauses[0].fields)
- })
- })
- suite('non-numeric edit distance', function () {
- test('throws lunr.QueryParseError', function () {
- assert.throws(function () { parse('foo~a') }, lunr.QueryParseError)
- })
- })
- suite('edit distance without a term', function () {
- test('throws lunr.QueryParseError', function () {
- assert.throws(function () { parse('~2') }, lunr.QueryParseError)
- })
- })
- suite('single term with boost', function () {
- setup(function () {
- this.clauses = parse('foo^2')
- })
- test('has 1 clause', function () {
- assert.lengthOf(this.clauses, 1)
- })
- test('term', function () {
- assert.equal('foo', this.clauses[0].term)
- })
- test('boost', function () {
- assert.equal(2, this.clauses[0].boost)
- })
- test('fields', function () {
- assert.sameMembers(['title', 'body'], this.clauses[0].fields)
- })
- })
- suite('non-numeric boost', function () {
- test('throws lunr.QueryParseError', function () {
- assert.throws(function () { parse('foo^a') }, lunr.QueryParseError)
- })
- })
- suite('boost without a term', function () {
- test('throws lunr.QueryParseError', function () {
- assert.throws(function () { parse('^2') }, lunr.QueryParseError)
- })
- })
- suite('multiple terms with boost', function () {
- setup(function () {
- this.clauses = parse('foo^2 bar^3')
- })
- test('has 2 clauses', function () {
- assert.lengthOf(this.clauses, 2)
- })
- test('term', function () {
- assert.equal('foo', this.clauses[0].term)
- assert.equal('bar', this.clauses[1].term)
- })
- test('boost', function () {
- assert.equal(2, this.clauses[0].boost)
- assert.equal(3, this.clauses[1].boost)
- })
- test('fields', function () {
- assert.sameMembers(['title', 'body'], this.clauses[0].fields)
- assert.sameMembers(['title', 'body'], this.clauses[1].fields)
- })
- })
- suite('term scoped by field with boost', function () {
- setup(function () {
- this.clauses = parse('title:foo^2')
- })
- test('has 1 clause', function () {
- assert.lengthOf(this.clauses, 1)
- })
- test('term', function () {
- assert.equal('foo', this.clauses[0].term)
- })
- test('boost', function () {
- assert.equal(2, this.clauses[0].boost)
- })
- test('fields', function () {
- assert.sameMembers(['title'], this.clauses[0].fields)
- })
- })
- suite('term with presence required', function () {
- setup(function () {
- this.clauses = parse('+foo')
- })
- test('has 1 clauses', function () {
- assert.lengthOf(this.clauses, 1)
- })
- test('term', function () {
- assert.equal('foo', this.clauses[0].term)
- })
- test('boost', function () {
- assert.equal(1, this.clauses[0].boost)
- })
- test('fields', function () {
- assert.sameMembers(['title', 'body'], this.clauses[0].fields)
- })
- test('presence', function () {
- assert.equal(lunr.Query.presence.REQUIRED, this.clauses[0].presence)
- })
- })
- suite('term with presence prohibited', function () {
- setup(function () {
- this.clauses = parse('-foo')
- })
- test('has 1 clauses', function () {
- assert.lengthOf(this.clauses, 1)
- })
- test('term', function () {
- assert.equal('foo', this.clauses[0].term)
- })
- test('boost', function () {
- assert.equal(1, this.clauses[0].boost)
- })
- test('fields', function () {
- assert.sameMembers(['title', 'body'], this.clauses[0].fields)
- })
- test('presence', function () {
- assert.equal(lunr.Query.presence.PROHIBITED, this.clauses[0].presence)
- })
- })
- suite('term scoped by field with presence required', function () {
- setup(function () {
- this.clauses = parse('+title:foo')
- })
- test('has 1 clauses', function () {
- assert.lengthOf(this.clauses, 1)
- })
- test('term', function () {
- assert.equal('foo', this.clauses[0].term)
- })
- test('boost', function () {
- assert.equal(1, this.clauses[0].boost)
- })
- test('fields', function () {
- assert.sameMembers(['title'], this.clauses[0].fields)
- })
- test('presence', function () {
- assert.equal(lunr.Query.presence.REQUIRED, this.clauses[0].presence)
- })
- })
- suite('term scoped by field with presence prohibited', function () {
- setup(function () {
- this.clauses = parse('-title:foo')
- })
- test('has 1 clauses', function () {
- assert.lengthOf(this.clauses, 1)
- })
- test('term', function () {
- assert.equal('foo', this.clauses[0].term)
- })
- test('boost', function () {
- assert.equal(1, this.clauses[0].boost)
- })
- test('fields', function () {
- assert.sameMembers(['title'], this.clauses[0].fields)
- })
- test('presence', function () {
- assert.equal(lunr.Query.presence.PROHIBITED, this.clauses[0].presence)
- })
- })
- })
- suite('term with boost and edit distance', function () {
- setup(function () {
- this.clauses = parse('foo^2~3')
- })
- test('has 1 clause', function () {
- assert.lengthOf(this.clauses, 1)
- })
- test('term', function () {
- assert.equal('foo', this.clauses[0].term)
- })
- test('editDistance', function () {
- assert.equal(3, this.clauses[0].editDistance)
- })
- test('boost', function () {
- assert.equal(2, this.clauses[0].boost)
- })
- test('fields', function () {
- assert.sameMembers(['title', 'body'], this.clauses[0].fields)
- })
- })
- })
|