Navigation Menu

Skip to content

Commit

Permalink
Support facets of simple case for literal fields
Browse files Browse the repository at this point in the history
Sorts and limits for the facets are not supported.
  • Loading branch information
darashi committed Aug 2, 2012
1 parent f6a59bc commit 7496a8c
Show file tree
Hide file tree
Showing 2 changed files with 148 additions and 27 deletions.
103 changes: 76 additions & 27 deletions lib/api/2011-02-01/search.js
Expand Up @@ -4,6 +4,32 @@ var Domain = require('../../database').Domain;
var nroonga = require('../../wrapped-nroonga');
var BooleanQueryTranslator = require('../../bq-translator').BooleanQueryTranslator;

function formatFacets(data) {
var drilldownRecords = data.slice(1);

return drilldownRecords.map(function(drilldownRecord, index) {
return formatFacet(drilldownRecord);
});
}

function formatFacet(drilldownRecord) {
var columnList = drilldownRecord[1];
var columnNames = columnList.map(function(column) {
return column[0];
});

var constraintEntries = drilldownRecord.slice(2);
var constraints = constraintEntries.map(function(record) {
var object = {};
columnNames.forEach(function(columnName, index) {
object[columnName] = record[index];
});
return {value: object._key, count: object._nsubrecs};
});

return {constraints: constraints};
}

function formatSelectResults(data) {
var columnList = data[0][1];
var columnNames = columnList.map(function(column) {
Expand All @@ -30,7 +56,12 @@ function select(context, options, callback) {
callback(error);
} else {
var numFoundRecords = data[0][0][0];
callback(null, formatSelectResults(data), numFoundRecords);
callback(
null,
formatSelectResults(data),
numFoundRecords,
formatFacets(data)
);
}
});
}
Expand Down Expand Up @@ -59,6 +90,7 @@ exports.createHandler = function(context) {
var query = request.query.q || '';
var booleanQuery = request.query.bq || '';
var filter = null;
var facet = request.query.facet;

if (booleanQuery) {
var translator = new BooleanQueryTranslator();
Expand Down Expand Up @@ -100,33 +132,50 @@ exports.createHandler = function(context) {
options.filter = filter;
}

select(context, options, function(error, data, numFoundRecords) {
var finishedAt = new Date();
var elapsedTime = finishedAt - startedAt;
var info = {
rid: dummyRid,
'time-ms': elapsedTime,
'cpu-time-ms': 0 // TODO
};
if (error) {
var body = createErrorBody({
if (facet) {
options.drilldown = facet;
// TODO support sorting
// TODO support facet-FIELD-top-n parameter
}

select(context, options,
function(error, data, numFoundRecords, facets) {
var finishedAt = new Date();
var elapsedTime = finishedAt - startedAt;
var info = {
rid: dummyRid,
message: error.message,
elapsedTime: elapsedTime
});
return response.send(body, 400); // TODO
'time-ms': elapsedTime,
'cpu-time-ms': 0 // TODO
};
if (error) {
var body = createErrorBody({
rid: dummyRid,
message: error.message,
elapsedTime: elapsedTime
});
return response.send(body, 400); // TODO
}
var result = {
rank: '-text_relevance', // FIXME
'match-expr': '', // FIXME
hits: {
found: numFoundRecords,
start: start,
hit: data
},
info: info
};
if (facets) {
var facetNames = facet.split(',');
var facetsObject = {};
facets.map(function(facet, index) {
var facetName = facetNames[index];
facetsObject[facetName] = facet;
});
result.facets = facetsObject;
}
response.json(result);
}
var result = {
rank: '-text_relevance', // FIXME
'match-expr': '', // FIXME
hits: {
found: numFoundRecords,
start: start,
hit: data
},
info: info
};
response.json(result);
});
);
};
};
72 changes: 72 additions & 0 deletions test/api-search.test.js
Expand Up @@ -151,6 +151,78 @@ suite('Search API', function() {
done();
}
);
testSearch('/2011-02-01/search?q=Tokyo&facet=product',
'with facet "domain"',
'search-companies-00000000000000000000000000.localhost',
function(response, body, done) {
var normalizedBody = normalizeSearchResult(body);
var actual = JSON.parse(normalizedBody);
var expected = {
rank: '-text_relevance',
'match-expr': '',
hits: {
found: 3,
start: 0,
hit: [
{
id: 'id1',
data: {
_id: [1],
_key: ['id1'],
address: ['Shibuya, Tokyo, Japan'],
description: [''],
email_address: ['info@razil.jp'],
name: ['Brazil'],
age: [1],
product: ['groonga']
}
},
{
id: 'id3',
data: {
_id: [3],
_key: ['id3'],
address: ['Hongo, Tokyo, Japan'],
description: [''],
email_address: ['info@clear-code.com'],
name: ['ClearCode Inc.'],
age: [3],
product: ['groonga']
}
},
{
id: 'id9',
data: {
_id: [9],
_key: ['id9'],
address: ['Tokyo, Japan'],
description: [''],
email_address: [''],
name: ['Umbrella Corporation'],
age: [9],
product: ['tyrant']
}
}
]
},
facets: {
product: {
constraints: [
{value: 'groonga', count: 2},
{value: 'tyrant', count: 1}
]
}
},
info: {
rid: '000000000000000000000000000000000000000000000000000000000000000',
'time-ms': 0, // always 0
'cpu-time-ms': 0
}
};
assert.deepEqual(actual, expected);
done();
}
);

testSearch('/2011-02-01/search?q=Tokyo&size=2',
'should return two hit entries',
Expand Down

0 comments on commit 7496a8c

Please sign in to comment.