query: fix bug with computation of date query: periods including the first days of the current months were calculated wrongly
This commit is contained in:
parent
7b378185f7
commit
9c66d39e33
3 changed files with 14 additions and 11 deletions
|
@ -7,7 +7,6 @@ Dependencies
|
||||||
gir1.2-unity-5.0
|
gir1.2-unity-5.0
|
||||||
gir1.2-dee-1.0
|
gir1.2-dee-1.0
|
||||||
recoll
|
recoll
|
||||||
python-recoll
|
|
||||||
|
|
||||||
Trying out the scope
|
Trying out the scope
|
||||||
--------------------
|
--------------------
|
||||||
|
|
|
@ -54,18 +54,18 @@ static inline int bpoffs()
|
||||||
Xapian::Query date_range_filter(int y1, int m1, int d1, int y2, int m2, int d2)
|
Xapian::Query date_range_filter(int y1, int m1, int d1, int y2, int m2, int d2)
|
||||||
{
|
{
|
||||||
// Xapian uses a smallbuf and snprintf. Can't be bothered, we're
|
// Xapian uses a smallbuf and snprintf. Can't be bothered, we're
|
||||||
// only doing %d's !
|
// doing at most 3 %d's !
|
||||||
char buf[200];
|
char buf[200];
|
||||||
bufprefix(buf, 'D');
|
|
||||||
sprintf(buf+bpoffs(), "%04d%02d", y1, m1);
|
|
||||||
vector<Xapian::Query> v;
|
vector<Xapian::Query> v;
|
||||||
|
|
||||||
|
// Deal with days till the end of the first month if any
|
||||||
|
bufprefix(buf, 'D');
|
||||||
|
sprintf(buf + bpoffs(), "%04d%02d", y1, m1);
|
||||||
int d_last = monthdays(m1, y1);
|
int d_last = monthdays(m1, y1);
|
||||||
int d_end = d_last;
|
int d_end = d_last;
|
||||||
if (y1 == y2 && m1 == m2 && d2 < d_last) {
|
if (y1 == y2 && m1 == m2 && d2 < d_last) {
|
||||||
d_end = d2;
|
d_end = d2;
|
||||||
}
|
}
|
||||||
// Deal with any initial partial month
|
|
||||||
if (d1 > 1 || d_end < d_last) {
|
if (d1 > 1 || d_end < d_last) {
|
||||||
for ( ; d1 <= d_end ; d1++) {
|
for ( ; d1 <= d_end ; d1++) {
|
||||||
sprintf(buf + 6 + bpoffs(), "%02d", d1);
|
sprintf(buf + 6 + bpoffs(), "%02d", d1);
|
||||||
|
@ -80,28 +80,31 @@ Xapian::Query date_range_filter(int y1, int m1, int d1, int y2, int m2, int d2)
|
||||||
return Xapian::Query(Xapian::Query::OP_OR, v.begin(), v.end());
|
return Xapian::Query(Xapian::Query::OP_OR, v.begin(), v.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Months till the end of first year
|
||||||
int m_last = (y1 < y2) ? 12 : m2 - 1;
|
int m_last = (y1 < y2) ? 12 : m2 - 1;
|
||||||
|
bufprefix(buf, 'M');
|
||||||
while (++m1 <= m_last) {
|
while (++m1 <= m_last) {
|
||||||
sprintf(buf + 4 + bpoffs(), "%02d", m1);
|
sprintf(buf + 4 + bpoffs(), "%02d", m1);
|
||||||
bufprefix(buf, 'M');
|
|
||||||
v.push_back(Xapian::Query(buf));
|
v.push_back(Xapian::Query(buf));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Years inbetween and first months of the last year
|
||||||
if (y1 < y2) {
|
if (y1 < y2) {
|
||||||
|
bufprefix(buf, 'Y');
|
||||||
while (++y1 < y2) {
|
while (++y1 < y2) {
|
||||||
sprintf(buf + bpoffs(), "%04d", y1);
|
sprintf(buf + bpoffs(), "%04d", y1);
|
||||||
bufprefix(buf, 'Y');
|
|
||||||
v.push_back(Xapian::Query(buf));
|
v.push_back(Xapian::Query(buf));
|
||||||
}
|
}
|
||||||
sprintf(buf + bpoffs(), "%04d", y2);
|
|
||||||
bufprefix(buf, 'M');
|
bufprefix(buf, 'M');
|
||||||
|
sprintf(buf + bpoffs(), "%04d", y2);
|
||||||
for (m1 = 1; m1 < m2; m1++) {
|
for (m1 = 1; m1 < m2; m1++) {
|
||||||
sprintf(buf + 4 + bpoffs(), "%02d", m1);
|
sprintf(buf + 4 + bpoffs(), "%02d", m1);
|
||||||
v.push_back(Xapian::Query(buf));
|
v.push_back(Xapian::Query(buf));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(buf + 2 + bpoffs(), "%02d", m2);
|
// Last month
|
||||||
|
sprintf(buf + 4 + bpoffs(), "%02d", m2);
|
||||||
|
|
||||||
// Deal with any final partial month
|
// Deal with any final partial month
|
||||||
if (d2 < monthdays(m2, y2)) {
|
if (d2 < monthdays(m2, y2)) {
|
||||||
|
|
|
@ -883,6 +883,7 @@ static bool addperiod(DateInterval *dp, DateInterval *pp)
|
||||||
int monthdays(int mon, int year)
|
int monthdays(int mon, int year)
|
||||||
{
|
{
|
||||||
switch (mon) {
|
switch (mon) {
|
||||||
|
// We are returning a few two many 29 days februaries, no problem
|
||||||
case 2: return (year % 4) == 0 ? 29 : 28;
|
case 2: return (year % 4) == 0 ? 29 : 28;
|
||||||
case 1:case 3:case 5:case 7: case 8:case 10:case 12: return 31;
|
case 1:case 3:case 5:case 7: case 8:case 10:case 12: return 31;
|
||||||
default: return 30;
|
default: return 30;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue