Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
benjreinhart committed Jun 17, 2014
1 parent 887e2b3 commit 1be5bde
Show file tree
Hide file tree
Showing 10 changed files with 52 additions and 18 deletions.
7 changes: 4 additions & 3 deletions components/search/middleware/build_query.js
Expand Up @@ -11,14 +11,15 @@ var toQuery = requireRoot('components/search/query');
*/ */


exports.buildQuery = function *(next) { exports.buildQuery = function *(next) {
var query = this.request.body.query var body = this.request.body
, query = body.query
, sort = query.sort , sort = query.sort
, qualifier = query.qualifier.qualifier; , qualifier = query.qualifier.qualifier;


this.request.body.reverse = 'last' === qualifier body.reverse = 'last' === qualifier
? 'asc' === sort ? 'asc' === sort
: 'desc' === sort; : 'desc' === sort;


this.request.body.query = toQuery(query); body.query = toQuery(query, body.page);
yield next; yield next;
} }
1 change: 1 addition & 0 deletions components/search/middleware/index.js
Expand Up @@ -3,5 +3,6 @@ var compose = require('koa-compose');
module.exports = compose([ module.exports = compose([
requireRoot('components/search/middleware/enforce_query').enforceQuery, requireRoot('components/search/middleware/enforce_query').enforceQuery,
requireRoot('components/search/middleware/parse_query').parseQuery, requireRoot('components/search/middleware/parse_query').parseQuery,
requireRoot('components/search/middleware/parse_page').parsePage,
requireRoot('components/search/middleware/build_query').buildQuery requireRoot('components/search/middleware/build_query').buildQuery
]); ]);
15 changes: 15 additions & 0 deletions components/search/middleware/parse_page.js
@@ -0,0 +1,15 @@
var number = /^\d+$/;

/**
* Validates the request `page` param, defaults
* to 0 in the event that the param is anything but
* a valid number. Also parses the number from a
* string to a number.
*/

exports.parsePage = function *(next) {
var page = 0, reqPage = this.request.body.page;
if (number.test(reqPage)) page = Math.abs(+reqPage);
this.request.body.page = page;
yield next;
}
11 changes: 9 additions & 2 deletions components/search/query.js
@@ -1,18 +1,21 @@
module.exports = toQuery; module.exports = toQuery;


const DEFAULT_PAGE_SIZE = requireRoot('core/config').search.DEFAULT_SIZE;

var extend = require('underscore').extend var extend = require('underscore').extend
, QueryBuilder = requireRoot('core/lib/elasticsearch/query_builders'); , QueryBuilder = requireRoot('core/lib/elasticsearch/query_builders');


function toQuery(search) { function toQuery(search, page) {
var at = search.at var at = search.at
, from = getFrom(page)
, range = search.dateRange , range = search.dateRange
, qualifier = search.qualifier , qualifier = search.qualifier
, sort = 'last' === qualifier.qualifier ? 'desc' : 'asc' , sort = 'last' === qualifier.qualifier ? 'desc' : 'asc'
, query; , query;


query = extend( query = extend(
QueryBuilder.buildSort('date', sort), QueryBuilder.buildSort('date', sort),
QueryBuilder.buildSize(qualifier.arguments[0]), QueryBuilder.buildSize({size: qualifier.arguments[0], from: from}),
QueryBuilder.buildFilter( QueryBuilder.buildFilter(
QueryBuilder.buildDateRange(range.from, range.to) QueryBuilder.buildDateRange(range.from, range.to)
) )
Expand All @@ -27,3 +30,7 @@ function toQuery(search) {
function buildVenueQuery(at) { function buildVenueQuery(at) {
return QueryBuilder.buildFuzzyLikeThis(["venue.name"], at); return QueryBuilder.buildFuzzyLikeThis(["venue.name"], at);
} }

function getFrom(page) {
return page * DEFAULT_PAGE_SIZE;
}
5 changes: 3 additions & 2 deletions components/search/results.client.js
Expand Up @@ -16,9 +16,10 @@ module.exports = Collection.extend({
return response.hits; return response.hits;
}, },


fetch: function(search) { fetch: function(search, page) {
page = Math.abs(page || 0);
return fetch.call(this, { return fetch.call(this, {
data: {query: search}, data: {query: search, page: page},
reset: true, reset: true,
type: 'POST' type: 'POST'
}); });
Expand Down
4 changes: 2 additions & 2 deletions components/search/router.client.js
Expand Up @@ -18,11 +18,11 @@ module.exports = Backbone.Router.extend({
}); });
}, },


onSearchSubmit: function(search) { onSearchSubmit: function(search, page) {
var results = new Results({model: Result}); var results = new Results({model: Result});
results.on('error', this.onSearchError, this); results.on('error', this.onSearchError, this);
results.on('success', this.onSearchSuccess, this); results.on('success', this.onSearchSuccess, this);
results.fetch(search); results.fetch(search, page);
}, },


onSearchError: function(results, xhr) { onSearchError: function(results, xhr) {
Expand Down
6 changes: 3 additions & 3 deletions components/search/views/form.js
Expand Up @@ -11,11 +11,11 @@ module.exports = Backbone.View.extend({
React.renderComponent(Form({onSubmit: this.onSubmit.bind(this)}), this.$el[0]); React.renderComponent(Form({onSubmit: this.onSubmit.bind(this)}), this.$el[0]);
}, },


onSubmit: function(value) { onSubmit: function(search, page) {
if (isEmpty(value)) if (isEmpty(search))
console.log('empty'); console.log('empty');
else else
this.trigger('submit', value); this.trigger('submit', search, page);
}, },


onError: function() { onError: function() {
Expand Down
3 changes: 2 additions & 1 deletion components/search/views/react/form.jsx
Expand Up @@ -4,7 +4,7 @@ module.exports = React.createClass({
handleKeyPress: function(e){ handleKeyPress: function(e){
if ('Enter' !== e.key) return; if ('Enter' !== e.key) return;
e.preventDefault(); e.preventDefault();
this.props.onSubmit(e.target.value); this.props.onSubmit(e.target.value, +$("#search-page").val());
}, },


render: function() { render: function() {
Expand All @@ -13,6 +13,7 @@ module.exports = React.createClass({
<span className="fui-search search-icon"></span> <span className="fui-search search-icon"></span>
<label htmlFor="search">Search</label> <label htmlFor="search">Search</label>
<input autoFocus autoCapitalize="off" id="search" placeholder="all shows in 1997" type="text" /> <input autoFocus autoCapitalize="off" id="search" placeholder="all shows in 1997" type="text" />
<input type="hidden" value="0" id="search-page" />
</form> </form>
); );
} }
Expand Down
7 changes: 4 additions & 3 deletions core/lib/elasticsearch/query_builders.js
@@ -1,15 +1,16 @@
/** /**
* Builds a size object * Builds a size object
* *
* @param {Number} size * @param {Object} options
* @return {Object} * @return {Object}
* @api public * @api public
*/ */


exports.buildSize = function(size) { exports.buildSize = function(options) {
return {size: size}; return {size: options.size, from: options.from || 0};
} }



/** /**
* Builds a filter object * Builds a filter object
* *
Expand Down
11 changes: 9 additions & 2 deletions test/core/lib/elasticsearch/query_builders_test.js
Expand Up @@ -6,8 +6,15 @@ var expect = require('chai').expect
describe('QueryBuilders', function() { describe('QueryBuilders', function() {
describe('.buildSize', function() { describe('.buildSize', function() {
it('is an elasticsearch size object', function() { it('is an elasticsearch size object', function() {
var actual = QueryBuilders.buildSize(10) var actual = QueryBuilders.buildSize({size: 10})
, expected = {size: 10}; , expected = {size: 10, from: 0};

expect(actual).to.eql(expected);
});

it('is an elasticsearch size object with an explicit `from`', function() {
var actual = QueryBuilders.buildSize({size: 10, from: 2})
, expected = {size: 10, from: 2};


expect(actual).to.eql(expected); expect(actual).to.eql(expected);
}); });
Expand Down

0 comments on commit 1be5bde

Please sign in to comment.