1
0

Merge pull request #14 from mixmaxhq/return-character-offsets

Return the character offsets of parsed search parts. The use case is …
This commit is contained in:
Julien Buty
2016-11-02 09:00:03 +08:00
committed by GitHub
3 changed files with 329 additions and 26 deletions

View File

@@ -23,6 +23,12 @@ describe('Search query syntax parser', function () {
parsedSearchQuery.should.be.an.Object;
parsedSearchQuery.should.have.property('from', 'jul@foo.com');
parsedSearchQuery.should.not.have.property('text');
parsedSearchQuery.should.have.property('offsets', [{
keyword: 'from',
value: 'jul@foo.com',
offsetStart: 0,
offsetEnd: 16
}]);
});
@@ -34,10 +40,50 @@ describe('Search query syntax parser', function () {
parsedSearchQuery.should.be.an.Object;
parsedSearchQuery.should.have.property('from', 'jul@foo.com');
parsedSearchQuery.should.have.property('text', 'hey buddy!');
parsedSearchQuery.should.have.property('offsets', [{
keyword: 'from',
value: 'jul@foo.com',
offsetStart: 0,
offsetEnd: 16
}, {
text: 'hey',
offsetStart: 17,
offsetEnd: 20
}, {
text: 'buddy!',
offsetStart: 21,
offsetEnd: 27
}]);
});
it('should parse a single keyword with free text before it', function () {
it('should ignore keywords that are not specified', function() {
var searchQuery = 'test another other:jul@foo.com';
var options = {
keywords: ['from']
};
var parsedSearchQuery = searchquery.parse(searchQuery, options);
parsedSearchQuery.should.be.an.Object;
parsedSearchQuery.should.have.not.have.property('other');
parsedSearchQuery.should.have.property('text', 'test another other:jul@foo.com');
parsedSearchQuery.should.have.property('offsets', [{
text: 'test',
offsetStart: 0,
offsetEnd: 4
}, {
text: 'another',
offsetStart: 5,
offsetEnd: 12
}, {
text: 'other:jul@foo.com',
offsetStart: 13,
offsetEnd: 30
}]);
});
it('should parse a single keyword with free text before it', function() {
var searchQuery = 'hey you! from:jul@foo.com';
var options = {keywords: ['from']};
var parsedSearchQuery = searchquery.parse(searchQuery, options);
@@ -45,6 +91,20 @@ describe('Search query syntax parser', function () {
parsedSearchQuery.should.be.an.Object;
parsedSearchQuery.should.have.property('from', 'jul@foo.com');
parsedSearchQuery.should.have.property('text', 'hey you!');
parsedSearchQuery.should.have.property('offsets', [{
text: 'hey',
offsetStart: 0,
offsetEnd: 3
}, {
text: 'you!',
offsetStart: 4,
offsetEnd: 8
}, {
keyword: 'from',
value: 'jul@foo.com',
offsetStart: 9,
offsetEnd: 25
}]);
});
@@ -56,6 +116,24 @@ describe('Search query syntax parser', function () {
parsedSearchQuery.should.be.an.Object;
parsedSearchQuery.should.have.property('from', 'jul@foo.com');
parsedSearchQuery.should.have.property('text', 'hey you! pouet');
parsedSearchQuery.should.have.property('offsets', [{
text: 'hey',
offsetStart: 0,
offsetEnd: 3
}, {
text: 'you!',
offsetStart: 4,
offsetEnd: 8
}, {
keyword: 'from',
value: 'jul@foo.com',
offsetStart: 9,
offsetEnd: 25
}, {
text: 'pouet',
offsetStart: 26,
offsetEnd: 31
}]);
});
@@ -68,6 +146,24 @@ describe('Search query syntax parser', function () {
parsedSearchQuery.should.be.an.Object;
parsedSearchQuery.should.have.property('from', 'jul@foo.com');
parsedSearchQuery.should.have.property('text', 'hey you! pouet');
parsedSearchQuery.should.have.property('offsets', [{
text: 'hey',
offsetStart: 3,
offsetEnd: 6
}, {
text: 'you!',
offsetStart: 11,
offsetEnd: 15
}, {
keyword: 'from',
value: 'jul@foo.com',
offsetStart: 16,
offsetEnd: 32
}, {
text: 'pouet',
offsetStart: 35,
offsetEnd: 40
}]);
});
@@ -80,6 +176,37 @@ describe('Search query syntax parser', function () {
parsedSearchQuery.should.have.property('from', 'jul@foo.com');
parsedSearchQuery.should.have.property('to', 'bar@hey.ya');
parsedSearchQuery.should.have.property('text', 'hey, so what\'s up gents');
parsedSearchQuery.should.have.property('offsets', [{
text: 'hey,',
offsetStart: 0,
offsetEnd: 4
}, {
keyword: 'from',
value: 'jul@foo.com',
offsetStart: 5,
offsetEnd: 21
}, {
keyword: 'to',
value: 'bar@hey.ya',
offsetStart: 22,
offsetEnd: 35
}, {
text: 'so',
offsetStart: 36,
offsetEnd: 38
}, {
text: 'what\'s',
offsetStart: 39,
offsetEnd: 45
}, {
text: 'up',
offsetStart: 46,
offsetEnd: 48
}, {
text: 'gents',
offsetStart: 49,
offsetEnd: 54
}]);
});
@@ -95,6 +222,21 @@ describe('Search query syntax parser', function () {
parsedSearchQuery.from.length.should.equal(2);
parsedSearchQuery.from.should.containEql('jul@foo.com');
parsedSearchQuery.from.should.containEql('bar@hey.ya');
parsedSearchQuery.should.have.property('offsets', [{
keyword: 'from',
value: 'jul@foo.com',
offsetStart: 0,
offsetEnd: 16
}, {
keyword: 'from',
value: 'bar@hey.ya',
offsetStart: 17,
offsetEnd: 32
}, {
text: 'vaccationessss',
offsetStart: 33,
offsetEnd: 47
}]);
});
@@ -109,6 +251,12 @@ describe('Search query syntax parser', function () {
parsedSearchQuery.from.length.should.equal(2);
parsedSearchQuery.from.should.containEql('jul@foo.com');
parsedSearchQuery.from.should.containEql('bar@hey.ya');
parsedSearchQuery.should.have.property('offsets', [{
keyword: 'from',
value: 'jul@foo.com,bar@hey.ya',
offsetStart: 0,
offsetEnd: 27
}]);
});
@@ -126,6 +274,21 @@ describe('Search query syntax parser', function () {
parsedSearchQuery.from.should.containEql('bar@hey.ya');
parsedSearchQuery.from.should.containEql('a@b.c');
parsedSearchQuery.from.should.containEql('d@e.f');
parsedSearchQuery.should.have.property('offsets', [{
keyword: 'from',
value: 'jul@foo.com,bar@hey.ya',
offsetStart: 0,
offsetEnd: 27
}, {
keyword: 'from',
value: 'a@b.c,d@e.f',
offsetStart: 28,
offsetEnd: 44
}, {
text: 'ouch!#',
offsetStart: 45,
offsetEnd: 51
}]);
});
@@ -139,6 +302,16 @@ describe('Search query syntax parser', function () {
parsedSearchQuery.should.have.property('date');
parsedSearchQuery.date.should.be.an.Object;
parsedSearchQuery.date.from.should.containEql('12/12/2012');
parsedSearchQuery.should.have.property('offsets', [{
keyword: 'date',
value: '12/12/2012',
offsetStart: 0,
offsetEnd: 15
}, {
text: 'ahaha',
offsetStart: 16,
offsetEnd: 21
}]);
});
it('should parse range with 2 ends and free text', function () {
@@ -152,6 +325,16 @@ describe('Search query syntax parser', function () {
parsedSearchQuery.date.should.be.an.Object;
parsedSearchQuery.date.from.should.containEql('12/12/2012');
parsedSearchQuery.date.to.should.containEql('01/01/2014');
parsedSearchQuery.should.have.property('offsets', [{
keyword: 'date',
value: '12/12/2012-01/01/2014',
offsetStart: 0,
offsetEnd: 26
}, {
text: 'ahaha',
offsetStart: 27,
offsetEnd: 32
}]);
});
@@ -198,6 +381,48 @@ describe('Search query syntax parser', function () {
parsedSearchQuery.to.length.should.equal(2);
parsedSearchQuery.to.should.containEql('me@me.com');
parsedSearchQuery.to.should.containEql('toto@hey.co');
parsedSearchQuery.should.have.property('offsets', [{
keyword: 'date',
value: '12/12/2012-01/01/2014',
offsetStart: 3,
offsetEnd: 29
}, {
text: 'ahaha',
offsetStart: 30,
offsetEnd: 35
}, {
keyword: 'from',
value: 'jul@foo.com,bar@hey.ya',
offsetStart: 36,
offsetEnd: 63
}, {
keyword: 'from',
value: 'a@b.c,d@e.f',
offsetStart: 64,
offsetEnd: 80
}, {
text: 'ouch!#',
offsetStart: 81,
offsetEnd: 87
}, {
keyword: 'to',
value: 'me@me.com',
offsetStart: 90,
offsetEnd: 102
}, {
keyword: 'to',
value: 'toto@hey.co',
offsetStart: 103,
offsetEnd: 117
}, {
text: 'about',
offsetStart: 118,
offsetEnd: 123
}, {
text: 'that',
offsetStart: 124,
offsetEnd: 128
}]);
});
@@ -209,6 +434,17 @@ describe('Search query syntax parser', function () {
parsedSearchQuery.should.be.an.Object;
parsedSearchQuery.should.have.property('name', 'Bob Saget');
parsedSearchQuery.should.have.property('description', 'Banana Sandwiche');
parsedSearchQuery.should.have.property('offsets', [{
keyword: 'name',
value: 'Bob Saget',
offsetStart: 0,
offsetEnd: 16
}, {
keyword: 'description',
value: 'Banana Sandwiche',
offsetStart: 17,
offsetEnd: 47
}]);
});
@@ -220,6 +456,17 @@ describe('Search query syntax parser', function () {
parsedSearchQuery.should.be.an.Object;
parsedSearchQuery.should.have.property('case1', 'This "is" \'a\' test');
parsedSearchQuery.should.have.property('case2', 'This "is" \'a\' test');
parsedSearchQuery.should.have.property('offsets', [{
keyword: 'case1',
value: 'This "is" \'a\' test',
offsetStart: 0,
offsetEnd: 28
}, {
keyword: 'case2',
value: 'This "is" \'a\' test',
offsetStart: 29,
offsetEnd: 57
}]);
});
@@ -232,6 +479,12 @@ describe('Search query syntax parser', function () {
parsedSearchQuery.exclude.should.be.an.Object;
parsedSearchQuery.exclude.should.have.property('from', 'jul@foo.com');
parsedSearchQuery.should.not.have.property('text');
parsedSearchQuery.should.have.property('offsets', [{
keyword: 'from',
value: 'jul@foo.com',
offsetStart: 1,
offsetEnd: 17
}]);
});
it('should concatenate a keyword multiple values in exclusion syntax', function() {
@@ -244,11 +497,19 @@ describe('Search query syntax parser', function () {
parsedSearchQuery.exclude.from.should.containEql('jul@foo.com');
parsedSearchQuery.exclude.from.should.containEql('mar@foo.com');
parsedSearchQuery.should.not.have.property('text');
parsedSearchQuery.should.have.property('offsets', [{
keyword: 'from',
value: 'jul@foo.com,mar@foo.com',
offsetStart: 1,
offsetEnd: 29
}]);
});
it('should support keywords which appear multiple times with exclusion syntax', function() {
var searchQuery = '-from:jul@foo.com,mar@foo.com -from:jan@foo.com';
var options = {keywords: ['from']};
var options = {
keywords: ['from']
};
var parsedSearchQuery = searchquery.parse(searchQuery, options);
parsedSearchQuery.should.be.an.Object;
@@ -257,5 +518,16 @@ describe('Search query syntax parser', function () {
parsedSearchQuery.exclude.from.should.containEql('mar@foo.com');
parsedSearchQuery.exclude.from.should.containEql('jan@foo.com');
parsedSearchQuery.should.not.have.property('text');
parsedSearchQuery.should.have.property('offsets', [{
keyword: 'from',
value: 'jul@foo.com,mar@foo.com',
offsetStart: 1,
offsetEnd: 29
}, {
keyword: 'from',
value: 'jan@foo.com',
offsetStart: 31,
offsetEnd: 47
}]);
});
});
});