UNPKG

1.77 kBJavaScriptView Raw
1
2function Layout(){
3 this._score = [];
4 this._filter = [];
5 this._sort = [];
6}
7
8Layout.prototype.score = function( view, operator ){
9 this._score.push([ view, ( operator === 'must' || operator === 'must_not' ) ? operator: 'should' ]);
10 return this;
11};
12
13Layout.prototype.filter = function( view ){
14 this._filter.push( view );
15 return this;
16};
17
18Layout.prototype.sort = function( view ){
19 this._sort.push( view );
20 return this;
21};
22
23Layout.prototype.render = function( vs ){
24 var q = Layout.base( vs );
25
26 // handle scoring views under 'query' section (for 'must', 'must_not' & 'should')
27 if( this._score.length ){
28 this._score.forEach( function( condition ){
29 var view = condition[0], operator = condition[1];
30 var rendered = view( vs );
31 if( rendered ){
32 if( !q.query.bool.hasOwnProperty( operator ) ){
33 q.query.bool[ operator ] = [];
34 }
35 q.query.bool[ operator ].push( rendered );
36 }
37 });
38 }
39
40 // handle filter views under 'filter' section (only 'must' is allowed here)
41 if( this._filter.length ){
42 this._filter.forEach( function( view ){
43 var rendered = view( vs );
44 if( rendered ){
45 if( !q.query.bool.hasOwnProperty( 'filter' ) ){
46 q.query.bool.filter = [];
47 }
48 q.query.bool.filter.push( rendered );
49 }
50 });
51 }
52
53 // handle sorting views under 'sort'
54 if( this._sort.length ){
55 this._sort.forEach( function( view ){
56 var rendered = view( vs );
57 if( rendered ){
58 q.sort.push( rendered );
59 }
60 });
61 }
62
63 return q;
64};
65
66Layout.base = function( vs ){
67 return {
68 query: {
69 bool: {}
70 },
71 size: vs.var('size'),
72 track_scores: vs.var('track_scores'),
73 sort: ['_score']
74 };
75};
76
77module.exports = Layout;