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