1 |
|
2 | function Layout(){
|
3 | this._score = [];
|
4 | this._filter = [];
|
5 | this._sort = [];
|
6 | }
|
7 |
|
8 | Layout.prototype.score = function( view, operator ){
|
9 | this._score.push([ view, ( operator === 'must' || operator === 'must_not' ) ? operator: 'should' ]);
|
10 | return this;
|
11 | };
|
12 |
|
13 | Layout.prototype.filter = function( view ){
|
14 | this._filter.push( view );
|
15 | return this;
|
16 | };
|
17 |
|
18 | Layout.prototype.sort = function( view ){
|
19 | this._sort.push( view );
|
20 | return this;
|
21 | };
|
22 |
|
23 | Layout.prototype.render = function( vs ){
|
24 | var q = Layout.base( vs );
|
25 |
|
26 |
|
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 |
|
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 |
|
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 |
|
66 | Layout.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 |
|
77 | module.exports = Layout;
|