Skip to content

Commit

Permalink
[savedObjects] generate queries that are aware of root properties
Browse files Browse the repository at this point in the history
  • Loading branch information
spalger committed Apr 4, 2018
1 parent 1f69d8d commit e5307b7
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 184 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,6 @@ describe('searchDsl/queryParams', () => {
simple_query_string: {
query: 'y*',
fields: [
'type.title',
'pending.title',
'saved.title'
]
Expand All @@ -138,7 +137,6 @@ describe('searchDsl/queryParams', () => {
simple_query_string: {
query: 'y*',
fields: [
'type.title^3',
'pending.title^3',
'saved.title^3'
]
Expand All @@ -159,10 +157,8 @@ describe('searchDsl/queryParams', () => {
simple_query_string: {
query: 'y*',
fields: [
'type.title',
'pending.title',
'saved.title',
'type.title.raw',
'pending.title.raw',
'saved.title.raw',
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,81 +57,33 @@ Object {
},
},
Object {
"bool": Object {
"should": Array [
Object {
"range": Object {
"visualize.created": Object {
"gt": undefined,
"gte": 2018-03-02T07:00:00.000Z,
"lt": 2018-03-03T07:00:00.000Z,
"lte": undefined,
},
},
},
Object {
"range": Object {
"dashboard.created": Object {
"gt": undefined,
"gte": 2018-03-02T07:00:00.000Z,
"lt": 2018-03-03T07:00:00.000Z,
"lte": undefined,
},
},
},
],
"range": Object {
"updated_at": Object {
"gt": undefined,
"gte": 2018-03-02T07:00:00.000Z,
"lt": 2018-03-03T07:00:00.000Z,
"lte": undefined,
},
},
},
Object {
"bool": Object {
"should": Array [
Object {
"range": Object {
"visualize.created": Object {
"gt": undefined,
"gte": 2018-02-25T07:00:00.000Z,
"lt": 2018-03-01T07:00:00.000Z,
"lte": undefined,
},
},
},
Object {
"range": Object {
"dashboard.created": Object {
"gt": undefined,
"gte": 2018-02-25T07:00:00.000Z,
"lt": 2018-03-01T07:00:00.000Z,
"lte": undefined,
},
},
},
],
"range": Object {
"updated_at": Object {
"gt": undefined,
"gte": 2018-02-25T07:00:00.000Z,
"lt": 2018-03-01T07:00:00.000Z,
"lte": undefined,
},
},
},
Object {
"bool": Object {
"should": Array [
Object {
"range": Object {
"visualize.created": Object {
"gt": undefined,
"gte": undefined,
"lt": 2012-01-01T07:00:00.000Z,
"lte": undefined,
},
},
},
Object {
"range": Object {
"dashboard.created": Object {
"gt": undefined,
"gte": undefined,
"lt": 2012-01-01T07:00:00.000Z,
"lte": undefined,
},
},
},
],
"range": Object {
"updated_at": Object {
"gt": undefined,
"gte": undefined,
"lt": 2012-01-01T07:00:00.000Z,
"lte": undefined,
},
},
},
Object {
Expand All @@ -157,55 +109,23 @@ Object {
"must_not": Array [],
"should": Array [
Object {
"bool": Object {
"should": Array [
Object {
"range": Object {
"visualize.created": Object {
"gt": undefined,
"gte": 2018-03-02T07:00:00.000Z,
"lt": 2018-03-03T07:00:00.000Z,
"lte": undefined,
},
},
},
Object {
"range": Object {
"dashboard.created": Object {
"gt": undefined,
"gte": 2018-03-02T07:00:00.000Z,
"lt": 2018-03-03T07:00:00.000Z,
"lte": undefined,
},
},
},
],
"range": Object {
"updated_at": Object {
"gt": undefined,
"gte": 2018-03-02T07:00:00.000Z,
"lt": 2018-03-03T07:00:00.000Z,
"lte": undefined,
},
},
},
Object {
"bool": Object {
"should": Array [
Object {
"range": Object {
"visualize.created": Object {
"gt": undefined,
"gte": 2018-03-01T07:00:00.000Z,
"lt": 2018-03-02T07:00:00.000Z,
"lte": undefined,
},
},
},
Object {
"range": Object {
"dashboard.created": Object {
"gt": undefined,
"gte": 2018-03-01T07:00:00.000Z,
"lt": 2018-03-02T07:00:00.000Z,
"lte": undefined,
},
},
},
],
"range": Object {
"updated_at": Object {
"gt": undefined,
"gte": 2018-03-01T07:00:00.000Z,
"lt": 2018-03-02T07:00:00.000Z,
"lte": undefined,
},
},
},
],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,70 +1,71 @@
import { parseAndValidateFromApi } from './parse_and_validate_from_api';

export function convertFilterToEsDsl(types, apiParam) {
return convertFilter(types, parseAndValidateFromApi(apiParam));
function getExpandedFields(savedObjectTypes, rootAttributes, field) {
if (rootAttributes.includes(field)) {
return [field];
}

return savedObjectTypes.reduce((acc, t) => [
...acc,
`${t}.${field}`
], []);
}

function getFilterFields(types, field) {
switch (field) {
case 'type':
case 'updated_at':
return [field];
export function convertFilterToEsDsl(savedObjectTypes, rootAttributes, apiParam) {
const rootFilter = parseAndValidateFromApi(apiParam);

default:
return types.reduce((acc, t) => [
...acc,
`${t}.${field}`
], []);
}
}
function recursivelyConvert(filter) {
const fields = filter.field
? getExpandedFields(savedObjectTypes, rootAttributes, filter.field)
: undefined;

function convertFilter(types, filter) {
switch (filter.type) {
case 'value': {
return {
multi_match: {
type: 'phrase',
query: filter.value,
fields: filter.field
? getFilterFields(types, filter.field)
: undefined,
}
};
}
switch (filter.type) {
case 'value': {
return {
multi_match: {
type: 'phrase',
query: filter.value,
fields,
}
};
}

case 'range': {
const filters = getFilterFields(types, filter.field).map(field => ({
range: {
[field]: {
gt: filter.gt,
gte: filter.gte,
lt: filter.lt,
lte: filter.lte,
case 'range': {
const filters = fields.map(field => ({
range: {
[field]: {
gt: filter.gt,
gte: filter.gte,
lt: filter.lt,
lte: filter.lte,
}
}
}));

if (filters.length > 1) {
return {
bool: {
should: filters
}
};
}
}));

if (filters.length > 1) {
return filters[0];
}

case 'bool':
return {
bool: {
should: filters
must: filter.must.map(recursivelyConvert),
must_not: filter.must_not.map(recursivelyConvert),
should: filter.must_some.map(recursivelyConvert),
}
};
}

return filters[0];
default:
throw new Error(`unexpected filter.type "${filter.type}"`);
}

case 'bool':
return {
bool: {
must: filter.must.map(filter => convertFilter(types, filter)),
must_not: filter.must_not.map(filter => convertFilter(types, filter)),
should: filter.must_some.map(filter => convertFilter(types, filter)),
}
};

default:
throw new Error(`unexpected filter.type "${filter.type}"`);
}

return recursivelyConvert(rootFilter);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ import { convertFilterToEsDsl } from './convert';

describe('SavedObjectsClient/experimentalFilter', () => {
it('properly converts complex example', () => {
expect(convertFilterToEsDsl(['visualize', 'dashboard'], {
expect(convertFilterToEsDsl(['visualize', 'dashboard'], ['type', 'updated_at'], {
must: [
// numeric ranges
{ field: 'stars', gt: 3 },
{ field: 'followers', lte: 5 },

// date ranges
{ field: 'created', gte: '2018-03-02T00:00:00-07:00', lt: '2018-03-03T00:00:00-07:00' },
{ field: 'created', gte: '2018-02-25T00:00:00-07:00', lt: '2018-03-01T00:00:00-07:00' },
{ field: 'created', lt: '2012-01-01T00:00:00-07:00' },
{ field: 'updated_at', gte: '2018-03-02T00:00:00-07:00', lt: '2018-03-03T00:00:00-07:00' },
{ field: 'updated_at', gte: '2018-02-25T00:00:00-07:00', lt: '2018-03-01T00:00:00-07:00' },
{ field: 'updated_at', lt: '2012-01-01T00:00:00-07:00' },

// match, field not required
{ value: 'dashboard' },
Expand All @@ -21,9 +21,9 @@ describe('SavedObjectsClient/experimentalFilter', () => {
{
must_some: [
// today
{ field: 'created', gte: '2018-03-02T00:00:00-07:00', lt: '2018-03-03T00:00:00-07:00' },
{ field: 'updated_at', gte: '2018-03-02T00:00:00-07:00', lt: '2018-03-03T00:00:00-07:00' },
// yesterday
{ field: 'created', gte: '2018-03-01T00:00:00-07:00', lt: '2018-03-02T00:00:00-07:00' }
{ field: 'updated_at', gte: '2018-03-01T00:00:00-07:00', lt: '2018-03-02T00:00:00-07:00' }
]
}
],
Expand Down
Loading

0 comments on commit e5307b7

Please sign in to comment.