UNPKG

elastic.js

Version:

Javascript API for ElasticSearch DSL

1,407 lines (1,074 loc) 32.1 kB
/*global require:true */ 'use strict'; var ejs = require('../dist/elastic.js'); /* ======== A Handy Little Nodeunit Reference ======== https://github.com/caolan/nodeunit Test methods: test.test.test.expect(numAssertions) test.done() Test assertions: test.test.test.ok(value, [message]) test.equal(actual, expected, [message]) test.notEqual(actual, expected, [message]) test.test.test.deepEqual(actual, expected, [message]) test.nottest.test.deepEqual(actual, expected, [message]) test.test.test.strictEqual(actual, expected, [message]) test.nottest.test.strictEqual(actual, expected, [message]) test.throws(block, [error], [message]) test.doesNotThrow(block, [error], [message]) test.ifError(value) */ exports.search = { setUp: function (done) { done(); }, exists: function (test) { test.expect(15); test.ok(ejs.Request, 'Request'); test.ok(ejs.ScriptField, 'ScriptField'); test.ok(ejs.GeoPoint, 'GeoPoint'); test.ok(ejs.IndexedShape, 'IndexedShape'); test.ok(ejs.Shape, 'Shape'); test.ok(ejs.Sort, 'Sort'); test.ok(ejs.Highlight, 'Highlight'); test.ok(ejs.TermSuggester, 'TermSuggester'); test.ok(ejs.PhraseSuggester, 'PhraseSuggester'); test.ok(ejs.DirectSettingsMixin, 'DirectSettingsMixin'); test.ok(ejs.DirectGenerator, 'DirectGenerator'); test.ok(ejs.SuggesterMixin, 'SuggesterMixin'); test.ok(ejs.SuggestContextMixin, 'SuggestContextMixin'); test.ok(ejs.CompletionSuggester, 'CompletionSuggester'); test.ok(ejs.Rescore, 'Rescore'); test.done(); }, Rescore: function (test) { test.expect(22); var rescore = ejs.Rescore(), termQuery1 = ejs.TermQuery('f1', 't1'), termQuery2 = ejs.TermQuery('f2', 't2'), expected, doTest = function () { test.deepEqual(rescore.toJSON(), expected); }; expected = { query: {} }; test.ok(rescore, 'Rescore exists'); test.ok(rescore.toJSON(), 'toJSON() works'); doTest(); rescore = ejs.Rescore(100); expected.window_size = 100; doTest(); rescore = ejs.Rescore(1000, termQuery1); expected.window_size = 1000; expected.query.rescore_query = termQuery1.toJSON(); doTest(); rescore.windowSize(100); expected.window_size = 100; doTest(); rescore.rescoreQuery(termQuery2); expected.query.rescore_query = termQuery2.toJSON(); doTest(); rescore.queryWeight(2); expected.query.query_weight = 2; doTest(); rescore.rescoreQueryWeight(3); expected.query.rescore_query_weight = 3; doTest(); rescore.scoreMode('total'); expected.query.score_mode = 'total'; doTest(); rescore.scoreMode('INVALID'); doTest(); rescore.scoreMode('MIN'); expected.query.score_mode = 'min'; doTest(); rescore.scoreMode('Max'); expected.query.score_mode = 'max'; doTest(); rescore.scoreMode('AvG'); expected.query.score_mode = 'avg'; doTest(); rescore.scoreMode('multiply'); expected.query.score_mode = 'multiply'; doTest(); test.strictEqual(rescore._type(), 'rescore'); test.throws(function () { ejs.Rescore('invalid'); }, TypeError); test.throws(function () { ejs.Rescore(2, 'invalid'); }, TypeError); test.throws(function () { rescore.rescoreQuery('invalid'); }, TypeError); test.throws(function () { rescore.rescoreQueryWeight('invalid'); }, TypeError); test.throws(function () { rescore.queryWeight('invalid'); }, TypeError); test.throws(function () { rescore.windowSize('invalid'); }, TypeError); test.done(); }, DirectGenerator: function (test) { test.expect(28); var generator = ejs.DirectGenerator(), expected, doTest = function () { test.deepEqual(generator.toJSON(), expected); }; expected = {}; test.ok(generator, 'DirectGenerator exists'); test.ok(generator.toJSON(), 'toJSON() works'); doTest(); generator.preFilter('pre analyzer'); expected.pre_filter = 'pre analyzer'; doTest(); generator.postFilter('post analyzer'); expected.post_filter = 'post analyzer'; doTest(); generator.field('f'); expected.field = 'f'; doTest(); generator.size(5); expected.size = 5; doTest(); generator.accuracy(0.6); expected.accuracy = 0.6; doTest(0.6); generator.suggestMode('missing'); expected.suggest_mode = 'missing'; doTest(); generator.suggestMode('INVALID'); doTest(); generator.suggestMode('POPULAR'); expected.suggest_mode = 'popular'; doTest(); generator.suggestMode('Always'); expected.suggest_mode = 'always'; doTest(); generator.sort('score'); expected.sort = 'score'; doTest(); generator.sort('INVALID'); doTest(); generator.sort('FREQUENCY'); expected.sort = 'frequency'; doTest(); generator.stringDistance('internal'); expected.string_distance = 'internal'; doTest(); generator.stringDistance('INVALID'); doTest(); generator.stringDistance('DAMERAU_LEVENSHTEIN'); expected.string_distance = 'damerau_levenshtein'; doTest(); generator.stringDistance('Levenstein'); expected.string_distance = 'levenstein'; doTest(); generator.stringDistance('jarowinkler'); expected.string_distance = 'jarowinkler'; doTest(); generator.stringDistance('ngram'); expected.string_distance = 'ngram'; doTest(); generator.maxEdits(3); expected.max_edits = 3; doTest(); generator.maxInspections(10); expected.max_inspections = 10; doTest(); generator.maxTermFreq(0.7); expected.max_term_freq = 0.7; doTest(); generator.prefixLen(4); expected.prefix_len = 4; doTest(); generator.minWordLen(3); expected.min_word_len = 3; doTest(); generator.minDocFreq(0.1); expected.min_doc_freq = 0.1; doTest(); test.strictEqual(generator._type(), 'generator'); test.done(); }, TermSuggester: function (test) { test.expect(29); var suggester = ejs.TermSuggester('suggester'), expected, doTest = function () { test.deepEqual(suggester.toJSON(), expected); }; expected = { suggester: { term: {} } }; test.ok(suggester, 'TermSuggester exists'); test.ok(suggester.toJSON(), 'toJSON() works'); doTest(); suggester.text('sugest termz'); expected.suggester.text = 'sugest termz'; doTest(); suggester.analyzer('analyzer'); expected.suggester.term.analyzer = 'analyzer'; doTest(); suggester.field('f'); expected.suggester.term.field = 'f'; doTest(); suggester.size(5); expected.suggester.term.size = 5; doTest(); suggester.shardSize(100); expected.suggester.term.shard_size = 100; doTest(); suggester.accuracy(0.6); expected.suggester.term.accuracy = 0.6; doTest(0.6); suggester.suggestMode('missing'); expected.suggester.term.suggest_mode = 'missing'; doTest(); suggester.suggestMode('INVALID'); doTest(); suggester.suggestMode('POPULAR'); expected.suggester.term.suggest_mode = 'popular'; doTest(); suggester.suggestMode('Always'); expected.suggester.term.suggest_mode = 'always'; doTest(); suggester.sort('score'); expected.suggester.term.sort = 'score'; doTest(); suggester.sort('INVALID'); doTest(); suggester.sort('FREQUENCY'); expected.suggester.term.sort = 'frequency'; doTest(); suggester.stringDistance('internal'); expected.suggester.term.string_distance = 'internal'; doTest(); suggester.stringDistance('INVALID'); doTest(); suggester.stringDistance('DAMERAU_LEVENSHTEIN'); expected.suggester.term.string_distance = 'damerau_levenshtein'; doTest(); suggester.stringDistance('Levenstein'); expected.suggester.term.string_distance = 'levenstein'; doTest(); suggester.stringDistance('jarowinkler'); expected.suggester.term.string_distance = 'jarowinkler'; doTest(); suggester.stringDistance('ngram'); expected.suggester.term.string_distance = 'ngram'; doTest(); suggester.maxEdits(3); expected.suggester.term.max_edits = 3; doTest(); suggester.maxInspections(10); expected.suggester.term.max_inspections = 10; doTest(); suggester.maxTermFreq(0.7); expected.suggester.term.max_term_freq = 0.7; doTest(); suggester.prefixLen(4); expected.suggester.term.prefix_len = 4; doTest(); suggester.minWordLen(3); expected.suggester.term.min_word_len = 3; doTest(); suggester.minDocFreq(0.1); expected.suggester.term.min_doc_freq = 0.1; doTest(); test.strictEqual(suggester._type(), 'suggest'); test.done(); }, PhraseSuggester: function (test) { test.expect(25); var suggester = ejs.PhraseSuggester('suggester'), gen1 = ejs.DirectGenerator().field('body') .suggestMode('always') .minWordLen(1), gen2 = ejs.DirectGenerator().field('reverse') .suggestMode('always') .minWordLen(1) .preFilter('reverse') .postFilter('reverse'), gen3 = ejs.DirectGenerator().field('body') .suggestMode('popular') .minWordLen(2) .prefixLen(3) .size(100), expected, doTest = function () { test.deepEqual(suggester.toJSON(), expected); }; expected = { suggester: { phrase: {} } }; test.ok(suggester, 'PhraseSuggester exists'); test.ok(suggester.toJSON(), 'toJSON() works'); doTest(); suggester.text('sugest termz'); expected.suggester.text = 'sugest termz'; doTest(); suggester.analyzer('analyzer'); expected.suggester.phrase.analyzer = 'analyzer'; doTest(); suggester.field('f'); expected.suggester.phrase.field = 'f'; doTest(); suggester.size(5); expected.suggester.phrase.size = 5; doTest(); suggester.shardSize(100); expected.suggester.phrase.shard_size = 100; doTest(); suggester.realWordErrorLikelihood(0.99); expected.suggester.phrase.real_word_error_likelihood = 0.99; doTest(); suggester.confidence(0.6); expected.suggester.phrase.confidence = 0.6; doTest(); suggester.separator('|'); expected.suggester.phrase.separator = '|'; doTest(); suggester.maxErrors(0.5); expected.suggester.phrase.max_errors = 0.5; doTest(); suggester.gramSize(2); expected.suggester.phrase.gram_size = 2; doTest(); suggester.forceUnigrams(false); expected.suggester.phrase.force_unigrams = false; doTest(); suggester.tokenLimit(10); expected.suggester.phrase.token_limit = 10; doTest(); suggester.linearSmoothing(0.7, 0.2, 0.1); expected.suggester.phrase.smoothing = { linear: { trigram_lambda: 0.7, bigram_lambda: 0.2, unigram_lambda: 0.1 } }; doTest(); suggester.laplaceSmoothing(0.7); expected.suggester.phrase.smoothing = { laplace: { alpha: 0.7 } }; doTest(); suggester.stupidBackoffSmoothing(0.5); expected.suggester.phrase.smoothing = { stupid_backoff: { discount: 0.5 } }; doTest(); suggester.highlight('<b>', '</b>'); expected.suggester.phrase.highlight = { pre_tag: '<b>', post_tag: '</b>' }; doTest(); suggester.directGenerator(gen1); expected.suggester.phrase.direct_generator = [gen1.toJSON()]; doTest(); suggester.directGenerator(gen2); expected.suggester.phrase.direct_generator.push(gen2.toJSON()); doTest(); suggester.directGenerator([gen3, gen1]); expected.suggester.phrase.direct_generator = [gen3.toJSON(), gen1.toJSON()]; doTest(); test.strictEqual(suggester._type(), 'suggest'); test.throws(function () { suggester.directGenerator('invalid'); }, TypeError); test.throws(function () { suggester.directGenerator([gen1, gen2, 'invalid']); }, TypeError); test.done(); }, CompletionSuggester: function (test) { test.expect(17); var suggester = ejs.CompletionSuggester('suggester'), expected, doTest = function () { test.deepEqual(suggester.toJSON(), expected); }; expected = { suggester: { completion: {} } }; test.ok(suggester, 'CompletionSuggester exists'); test.ok(suggester.toJSON(), 'toJSON() works'); doTest(); suggester.text('sugest termz'); expected.suggester.text = 'sugest termz'; doTest(); suggester.analyzer('analyzer'); expected.suggester.completion.analyzer = 'analyzer'; doTest(); suggester.field('f'); expected.suggester.completion.field = 'f'; doTest(); suggester.size(5); expected.suggester.completion.size = 5; doTest(); suggester.shardSize(100); expected.suggester.completion.shard_size = 100; doTest(); suggester.fuzzy(true); expected.suggester.completion.fuzzy = {}; doTest(); suggester.fuzzy(false); delete expected.suggester.completion.fuzzy; doTest(); suggester.transpositions(true); expected.suggester.completion.fuzzy = {transpositions: true}; doTest(); suggester.unicodeAware(false); expected.suggester.completion.fuzzy.unicode_aware = false; doTest(); suggester.editDistance(4); expected.suggester.completion.fuzzy.edit_distance = 4; doTest(); suggester.minLength(4); expected.suggester.completion.fuzzy.min_length = 4; doTest(); suggester.prefixLength(2); expected.suggester.completion.fuzzy.prefix_length = 2; doTest(); suggester.fuzzy(false); delete expected.suggester.completion.fuzzy; doTest(); test.strictEqual(suggester._type(), 'suggest'); test.done(); }, Highlight: function (test) { test.expect(47); var highlight = ejs.Highlight(['title', 'content']), expected, doTest = function () { test.deepEqual(highlight.toJSON(), expected); }; expected = { fields: { title: {}, content: {} } }; test.ok(highlight, 'Highlight exists'); test.ok(highlight.toJSON(), 'toJSON() works'); doTest(); highlight.fields('teaser'); expected.fields.teaser = {}; doTest(); highlight.fields(['body', 'summary']); expected.fields.body = {}; expected.fields.summary = {}; doTest(); highlight.preTags('<em>'); expected.pre_tags = ['<em>']; doTest(); highlight.preTags(['<tag1>', '<tag2>']); expected.pre_tags = ['<tag1>', '<tag2>']; doTest(); highlight.preTags('<em>', 'content'); expected.fields.content.pre_tags = ['<em>']; doTest(); // test adding tags to field that does not exist // it should be added highlight.preTags(['<tag1>', '<tag2>'], 'my_field'); expected.fields.my_field = {pre_tags: ['<tag1>', '<tag2>']}; doTest(); highlight.postTags('<em>'); expected.post_tags = ['<em>']; doTest(); highlight.postTags(['<tag1>', '<tag2>']); expected.post_tags = ['<tag1>', '<tag2>']; doTest(); highlight.postTags('<em>', 'content'); expected.fields.content.post_tags = ['<em>']; doTest(); highlight.postTags(['<tag1>', '<tag2>'], 'my_field'); expected.fields.my_field.post_tags = ['<tag1>', '<tag2>']; doTest(); highlight.order('score'); expected.order = 'score'; doTest(); highlight.order('INVALID'); doTest(); highlight.order('score', 'title'); expected.fields.title.order = 'score'; doTest(); highlight.tagsSchema('styled'); expected.tags_schema = 'styled'; doTest(); highlight.tagsSchema('INVALID'); doTest(); highlight.highlightFilter(true); expected.highlight_filter = true; doTest(); highlight.highlightFilter(false, 'body'); expected.fields.body.highlight_filter = false; doTest(); // addings a field that already exists with options // should not change anything highlight.fields('body'); doTest(); highlight.fragmentSize(500); expected.fragment_size = 500; doTest(); highlight.fragmentSize(300, 'title'); expected.fields.title.fragment_size = 300; doTest(); highlight.numberOfFragments(10); expected.number_of_fragments = 10; doTest(); highlight.numberOfFragments(2, 'content'); expected.fields.content.number_of_fragments = 2; doTest(); highlight.encoder('default'); expected.encoder = 'default'; doTest(); highlight.encoder('INVALID'); doTest(); highlight.encoder('HTML'); expected.encoder = 'html'; doTest(); highlight.requireFieldMatch(true); expected.require_field_match = true; doTest(); highlight.requireFieldMatch(true, 'title'); expected.fields.title.require_field_match = true; doTest(); highlight.boundaryMaxScan(30); expected.boundary_max_scan = 30; doTest(); highlight.boundaryMaxScan(10, 'title'); expected.fields.title.boundary_max_scan = 10; doTest(); highlight.boundaryChars('$#{}'); expected.boundary_chars = '$#{}'; doTest(); highlight.boundaryChars('#', 'content'); expected.fields.content.boundary_chars = '#'; doTest(); highlight.type('highlighter'); expected.type = 'highlighter'; doTest(); highlight.type('INVALID'); doTest(); highlight.type('FAST-VECTOR-HIGHLIGHTER', 'body'); expected.fields.body.type = 'fast-vector-highlighter'; doTest(); highlight.type('Postings'); expected.type = 'postings'; doTest(); highlight.fragmenter('simple'); expected.fragmenter = 'simple'; doTest(); highlight.fragmenter('INVALID'); doTest(); highlight.fragmenter('SPAN', 'title'); expected.fields.title.fragmenter = 'span'; doTest(); highlight.options({a: 1, b: 2}); expected.options = {a: 1, b: 2}; doTest(); highlight.options({c: 3}, 'body'); expected.fields.body.options = {c: 3}; doTest(); test.strictEqual(highlight._type(), 'highlight'); test.throws(function () { highlight.options('invalid'); }, TypeError); test.throws(function () { highlight.options(['invalid']); }, TypeError); test.throws(function () { highlight.options(ejs.GeoPoint()); }, TypeError); test.done(); }, Sort: function (test) { test.expect(36); var sort = ejs.Sort(), termFilter = ejs.TermFilter('tf1', 'tv1'), geoPoint = ejs.GeoPoint([37.7819288, -122.396480]), expected, doTest = function () { test.deepEqual(sort.toJSON(), expected); }; expected = { _score: {} }; test.ok(sort, 'Sort exists'); test.ok(sort.toJSON(), 'toJSON() works'); doTest(); sort.field('title'); expected = { title: {} }; doTest(); sort.order('asc'); expected.title.order = 'asc'; doTest(); sort.order('INVALID'); doTest(); sort.order('DESC'); expected.title.order = 'desc'; doTest(); sort.asc(); expected.title.order = 'asc'; doTest(); sort.desc(); expected.title.order = 'desc'; doTest(); sort.reverse(true); expected.title.reverse = true; doTest(); sort.missing('_last'); expected.title.missing = '_last'; doTest(); sort.ignoreUnmapped(true); expected.title.ignore_unmapped = true; doTest(); sort.mode('min'); expected.title.mode = 'min'; doTest(); sort.mode('INVALID'); doTest(); sort.mode('MAX'); expected.title.mode = 'max'; doTest(); sort.mode('Avg'); expected.title.mode = 'avg'; doTest(); sort.mode('sum'); expected.title.mode = 'sum'; doTest(); sort.nestedPath('nested.path'); expected.title.nested_path = 'nested.path'; doTest(); sort.nestedFilter(termFilter); expected.title.nested_filter = termFilter.toJSON(); doTest(); // geo distance sorting tests sort = ejs.Sort('location').geoDistance(geoPoint); expected = { _geo_distance: { location: geoPoint.toJSON() } }; doTest(); sort.unit('mi'); expected._geo_distance.unit = 'mi'; doTest(); sort.unit('INVALID'); doTest(); sort.unit('KM'); expected._geo_distance.unit = 'km'; doTest(); sort.normalize(true); expected._geo_distance.normalize = true; doTest(); sort.distanceType('arc'); expected._geo_distance.distance_type = 'arc'; doTest(); sort.distanceType('INVALID'); doTest(); sort.distanceType('PLANE'); expected._geo_distance.distance_type = 'plane'; doTest(); // script sorting tests sort = ejs.Sort().script("doc['field_name'].value * factor"); expected = { _script: { script: "doc['field_name'].value * factor" } }; doTest(); sort.lang('mvel'); expected._script.lang = 'mvel'; doTest(); sort.params({p1: true, p2: 'v2'}); expected._script.params = {p1: true, p2: 'v2'}; doTest(); sort.type('string'); expected._script.type = 'string'; doTest(); sort.type('INVALID'); doTest(); sort.type('NUMBER'); expected._script.type = 'number'; doTest(); test.strictEqual(sort._type(), 'sort'); test.throws(function () { sort.geoDistance('invalid'); }, TypeError); test.throws(function () { sort.nestedFilter('invalid'); }, TypeError); test.done(); }, Shape: function (test) { test.expect(15); var shape = ejs.Shape('envelope', [[-45.0, 45.0], [45.0, -45.0]]), expected, doTest = function () { test.deepEqual(shape.toJSON(), expected); }; expected = { type: 'envelope', coordinates: [[-45.0, 45.0], [45.0, -45.0]] }; test.ok(shape, 'Shape exists'); test.ok(shape.toJSON(), 'toJSON() works'); doTest(); shape.type('point'); expected.type = 'point'; doTest(); shape.type('INVALID'); doTest(); shape.type('LINESTRING'); expected.type = 'linestring'; doTest(); shape.type('multipoint'); expected.type = 'multipoint'; doTest(); shape.type('envelope'); expected.type = 'envelope'; doTest(); shape.type('multiPolygon'); expected.type = 'multipolygon'; doTest(); shape.type('polygon'); expected.type = 'polygon'; doTest(); shape.type('circle'); expected.type = 'circle'; doTest(); shape.type('multilinestring'); expected.type = 'multilinestring'; doTest(); shape.radius("20"); expected.radius = "20"; doTest(); shape.coordinates([[-180.0, 10.0], [20.0, 90.0], [180.0, -5.0], [-30.0, -90.0]]); expected.coordinates = [[-180.0, 10.0], [20.0, 90.0], [180.0, -5.0], [-30.0, -90.0]]; doTest(); test.strictEqual(shape._type(), 'shape'); test.done(); }, IndexedShape: function (test) { test.expect(8); var indexedShape = ejs.IndexedShape('countries', 'New Zealand'), expected, doTest = function () { test.deepEqual(indexedShape.toJSON(), expected); }; expected = { type: 'countries', id: 'New Zealand' }; test.ok(indexedShape, 'IndexedShape exists'); test.ok(indexedShape.toJSON(), 'toJSON() works'); doTest(); indexedShape.type('state'); expected.type = 'state'; doTest(); indexedShape.id('CA'); expected.id = 'CA'; doTest(); indexedShape.index('states'); expected.index = 'states'; doTest(); indexedShape.shapeFieldName('stateshape'); expected.shape_field_name = 'stateshape'; doTest(); test.strictEqual(indexedShape._type(), 'indexed shape'); test.done(); }, GeoPoint: function (test) { test.expect(10); var geoPoint = ejs.GeoPoint(), expected, doTest = function () { test.deepEqual(geoPoint.toJSON(), expected); }; expected = [0, 0]; test.ok(geoPoint, 'GeoPoint exists'); test.ok(geoPoint.toJSON(), 'toJSON() works'); doTest(); // [lat, lon] constructor converted to GeoJSON [lon, lat] geoPoint = ejs.GeoPoint([37.7819288, -122.396480]); expected = [-122.396480, 37.7819288]; doTest(); geoPoint.properties({lat: 37.7817289, lon: -122.396181}); expected = {lat: 37.7817289, lon: -122.396181}; doTest(); geoPoint.properties({geohash: "drm3btev3e86"}); expected = {geohash: "drm3btev3e86"}; doTest(); geoPoint.string("37.7819288,-122.396480"); expected = "37.7819288,-122.396480"; doTest(); geoPoint.geohash('drn5x1g8cu2y'); expected = 'drn5x1g8cu2y'; doTest(); // [lat, lon] array converted to GeoJSON [lon, lat] geoPoint.array([37.7817289, -122.396181]); expected = [-122.396181, 37.7817289]; doTest(); test.strictEqual(geoPoint._type(), 'geo point'); test.done(); }, ScriptField: function (test) { test.expect(8); var cp = ejs.ScriptField('f'), expected, doTest = function () { test.deepEqual(cp.toJSON(), expected); }; expected = { f: {} }; test.ok(cp, 'ScriptField exists'); test.ok(cp.toJSON(), 'toJSON() works'); doTest(); cp.lang('mvel'); expected.f.lang = 'mvel'; doTest(); cp.script('script src'); expected.f.script = 'script src'; doTest(); cp.params({param1: 'p1', param2: 2}); expected.f.params = {param1: 'p1', param2: 2}; doTest(); cp.ignoreFailure(true); expected.f.ignore_failure = true; doTest(); test.strictEqual(cp._type(), 'script field'); test.done(); }, Request: function (test) { test.expect(56); var req = ejs.Request(), matchAll = ejs.MatchAllQuery(), termQuery = ejs.TermQuery('t', 'v'), termFilter = ejs.TermFilter('tf', 'vf'), filterFacet = ejs.FilterFacet('my_filter_facet').filter(termFilter), termsFacet = ejs.TermsFacet('my_terms_facet').field('author'), globalAgg = ejs.GlobalAggregation('myglobal'), termsAgg = ejs.TermsAggregation('termsagg').field('afield'), filterAgg = ejs.FilterAggregation('filteragg').filter(termFilter), scriptField = ejs.ScriptField('my_script_field') .script('doc["my_field_name"].value * 2'), scriptField2 = ejs.ScriptField('my_script_field2') .script("doc['my_field_name'].value * factor") .params({'factor': 2.0}), termSuggest = ejs.TermSuggester('my_term_suggester') .text('sugest termsz'), phraseSuggest = ejs.PhraseSuggester('my_phrase_suggester'), rescore = ejs.Rescore(1000, termQuery).queryWeight(3), expected, doTest = function () { test.deepEqual(req.toJSON(), expected); }; expected = {}; req = ejs.Request().query(matchAll); expected = { query: matchAll.toJSON() }; doTest(); req.timeout(5000); expected.timeout = 5000; doTest(); req.sort('field1'); expected.sort = ['field1']; doTest(); req.sort('field2', 'asc'); expected.sort.push({field2: {order: 'asc'}}); doTest(); req.sort('field3', 'invalid'); doTest(); req.sort('field3', 'DESC'); expected.sort.push({field3: {order: 'desc'}}); doTest(); req.sort(ejs.Sort('field4').asc()); expected.sort.push({field4: {order: 'asc'}}); doTest(); var geoSort = ejs.Sort('location') .geoDistance(ejs.GeoPoint([37.7819288, -122.396480])) .unit('mi').normalize(true); req.sort(geoSort); expected.sort.push(geoSort.toJSON()); doTest(); req.sort(['field5', geoSort]); expected.sort = ['field5', geoSort.toJSON()]; doTest(); test.deepEqual(req.sort(), expected.sort); req.trackScores(true); expected.track_scores = true; doTest(); req.fields('field1'); expected.fields = ['field1']; doTest(); req.fields('field2'); expected.fields.push('field2'); doTest(); req.fields(['field3', 'field4']); expected.fields = ['field3', 'field4']; doTest(); req.source('i1', 'e1'); expected._source = { includes: 'i1', excludes: 'e1' }; doTest(); req.source(['i1', 'i2'], ['e1', 'e2']); expected._source = { includes: ['i1', 'i2'], excludes: ['e1', 'e2'] }; doTest(); req.source(['i1', 'i2']); expected._source = { includes: ['i1', 'i2'] }; doTest(); req.source(false); expected._source = false; doTest(); var hlt = ejs.Highlight('body').fragmentSize(500, 'body'); req.highlight(hlt); expected.highlight = hlt.toJSON(); doTest(); req.size(20); expected.size = 20; doTest(); req.from(10); expected.from = 10; doTest(); req.query(termQuery); expected.query = termQuery.toJSON(); doTest(); req.facet(filterFacet); expected.facets = filterFacet.toJSON(); doTest(); req.facet(termsFacet); // extend is not avaiable in tests so just set place the facet // value into the existing facets object expected.facets.my_terms_facet = termsFacet.toJSON().my_terms_facet; doTest(); req.agg(filterAgg); expected.aggs = filterAgg.toJSON(); doTest(); req.aggregation(globalAgg.agg(termsAgg)); expected.aggs.myglobal = globalAgg.toJSON().myglobal; doTest(); req.filter(termFilter); expected.filter = termFilter.toJSON(); doTest(); req.suggest("global suggest text"); expected.suggest = {text: 'global suggest text'}; doTest(); req.suggest(termSuggest); expected.suggest.my_term_suggester = termSuggest.toJSON().my_term_suggester; doTest(); req.suggest(phraseSuggest); expected.suggest.my_phrase_suggester = phraseSuggest.toJSON().my_phrase_suggester; doTest(); req.rescore(rescore); expected.rescore = rescore.toJSON(); doTest(); req.scriptField(scriptField); expected.script_fields = scriptField.toJSON(); doTest(); req.scriptField(scriptField2); expected.script_fields.my_script_field2 = scriptField2.toJSON().my_script_field2; doTest(); req.indexBoost('index', 5.0); expected.indices_boost = {index: 5.0}; doTest(); req.indexBoost('index2', 3.2); expected.indices_boost.index2 = 3.2; doTest(); req.explain(true); expected.explain = true; doTest(); req.version(false); expected.version = false; doTest(); req.minScore(0.5); expected.min_score = 0.5; doTest(); test.strictEqual(req._type(), 'request'); test.throws(function () { req.query('invalid'); }, TypeError); test.throws(function () { req.facet('invalid'); }, TypeError); test.throws(function () { req.agg('invalid'); }, TypeError); test.throws(function () { req.aggregation('invalid'); }, TypeError); test.throws(function () { req.filter('invalid'); }, TypeError); test.throws(function () { req.indices(2); }, TypeError); test.throws(function () { req.types(3); }, TypeError); test.throws(function () { req.scriptField('invalid'); }, TypeError); test.throws(function () { req.sort(2); }, TypeError); test.throws(function () { req.sort(['valid', 3]); }, TypeError); test.throws(function () { req.fields(3); }, TypeError); test.throws(function () { req.highlight('invalid'); }, TypeError); test.throws(function () { req.suggest(3); }, TypeError); test.throws(function () { req.rescore('invalid'); }, TypeError); test.throws(function () { req.source(1, "ok"); }, TypeError); test.throws(function () { req.source("ok", 1); }, TypeError); test.throws(function () { req.source(null, "ok"); }, TypeError); test.done(); } };