def test_gtlt(): schema = fields.Schema(a=fields.KEYWORD, b=fields.NUMERIC, c=fields.KEYWORD, d=fields.NUMERIC(float), e=fields.DATETIME) qp = qparser.QueryParser("a", schema) qp.add_plugin(plugins.GtLtPlugin()) qp.add_plugin(dateparse.DateParserPlugin()) q = qp.parse(u("a:hello b:>100 c:<=z there")) assert_equal(q.__class__, query.And) assert_equal(len(q), 4) assert_equal(q[0], query.Term("a", "hello")) assert_equal(q[1], query.NumericRange("b", 100, None, startexcl=True)) assert_equal(q[2], query.TermRange("c", None, 'z')) assert_equal(q[3], query.Term("a", "there")) q = qp.parse(u("hello e:>'29 mar 2001' there")) assert_equal(q.__class__, query.And) assert_equal(len(q), 3) assert_equal(q[0], query.Term("a", "hello")) # As of this writing, date ranges don't support startexcl/endexcl assert_equal(q[1], query.DateRange("e", datetime(2001, 3, 29, 0, 0), None)) assert_equal(q[2], query.Term("a", "there")) q = qp.parse(u("a:> alfa c:<= bravo")) assert_equal(text_type(q), "(a:a: AND a:alfa AND a:c: AND a:bravo)") qp.remove_plugin_class(plugins.FieldsPlugin) qp.remove_plugin_class(plugins.RangePlugin) q = qp.parse(u("hello a:>500 there")) assert_equal(text_type(q), "(a:hello AND a:a: AND a:500 AND a:there)")
def test_date_range(): schema = fields.Schema(text=fields.TEXT, date=fields.DATETIME) qp = qparser.QueryParser("text", schema) basedate = datetime(2010, 9, 20, 15, 16, 6, 454000) qp.add_plugin(dateparse.DateParserPlugin(basedate)) q = qp.parse(u("date:['30 march' to 'next wednesday']")) assert q.__class__ == query.DateRange assert q.startdate == adatetime(2010, 3, 30).floor() assert q.enddate == adatetime(2010, 9, 22).ceil() q = qp.parse(u("date:[to 'next wednesday']")) assert q.__class__ == query.DateRange assert q.startdate is None assert q.enddate == adatetime(2010, 9, 22).ceil() q = qp.parse(u("date:['30 march' to]")) assert q.__class__ == query.DateRange assert q.startdate == adatetime(2010, 3, 30).floor() assert q.enddate is None q = qp.parse(u("date:[30 march to next wednesday]")) assert q.__class__ == query.DateRange assert q.startdate == adatetime(2010, 3, 30).floor() assert q.enddate == adatetime(2010, 9, 22).ceil() q = qp.parse(u("date:[to next wednesday]")) assert q.__class__ == query.DateRange assert q.startdate is None assert q.enddate == adatetime(2010, 9, 22).ceil() q = qp.parse(u("date:[30 march to]")) assert q.__class__ == query.DateRange assert q.startdate == adatetime(2010, 3, 30).floor() assert q.enddate is None
def test_free_dates(): a = analysis.StandardAnalyzer(stoplist=None) schema = fields.Schema(text=fields.TEXT(analyzer=a), date=fields.DATETIME) qp = qparser.QueryParser("text", schema) basedate = datetime(2010, 9, 20, 15, 16, 6, 454000) qp.add_plugin(dateparse.DateParserPlugin(basedate, free=True)) q = qp.parse(u("hello date:last tuesday")) assert_equal(q.__class__, query.And) assert_equal(len(q), 2) assert_equal(q[0].__class__, query.Term) assert_equal(q[0].text, "hello") assert_equal(q[1].__class__, query.DateRange) assert_equal(q[1].startdate, adatetime(2010, 9, 14).floor()) assert_equal(q[1].enddate, adatetime(2010, 9, 14).ceil()) q = qp.parse(u("date:mar 29 1972 hello")) assert_equal(q.__class__, query.And) assert_equal(len(q), 2) assert_equal(q[0].__class__, query.DateRange) assert_equal(q[0].startdate, adatetime(1972, 3, 29).floor()) assert_equal(q[0].enddate, adatetime(1972, 3, 29).ceil()) assert_equal(q[1].__class__, query.Term) assert_equal(q[1].text, "hello") q = qp.parse(u("date:2005 march 2")) assert_equal(q.__class__, query.DateRange) assert_equal(q.startdate, adatetime(2005, 3, 2).floor()) assert_equal(q.enddate, adatetime(2005, 3, 2).ceil()) q = qp.parse(u("date:'2005' march 2")) assert_equal(q.__class__, query.And) assert_equal(len(q), 3) assert_equal(q[0].__class__, query.DateRange) assert_equal(q[0].startdate, adatetime(2005).floor()) assert_equal(q[0].enddate, adatetime(2005).ceil()) assert_equal(q[1].__class__, query.Term) assert_equal(q[1].fieldname, "text") assert_equal(q[1].text, "march") q = qp.parse(u("date:march 24 to dec 12")) assert_equal(q.__class__, query.DateRange) assert_equal(q.startdate, adatetime(2010, 3, 24).floor()) assert_equal(q.enddate, adatetime(2010, 12, 12).ceil()) q = qp.parse(u("date:5:10pm")) assert_equal(q.__class__, query.DateRange) assert_equal(q.startdate, adatetime(2010, 9, 20, 17, 10).floor()) assert_equal(q.enddate, adatetime(2010, 9, 20, 17, 10).ceil()) q = qp.parse(u("(date:30 june OR date:10 july) quick")) assert_equal(q.__class__, query.And) assert_equal(len(q), 2) assert_equal(q[0].__class__, query.Or) assert_equal(q[0][0].__class__, query.DateRange) assert_equal(q[0][1].__class__, query.DateRange)
def test_dateparser(): schema = fields.Schema(text=fields.TEXT, date=fields.DATETIME) qp = default.QueryParser("text", schema) errs = [] def cb(arg): errs.append(arg) basedate = datetime(2010, 9, 20, 15, 16, 6, 454000) qp.add_plugin(dateparse.DateParserPlugin(basedate, callback=cb)) q = qp.parse(u("hello date:'last tuesday'")) assert q.__class__ == query.And assert q[1].__class__ == query.DateRange assert q[1].startdate == adatetime(2010, 9, 14).floor() assert q[1].enddate == adatetime(2010, 9, 14).ceil() q = qp.parse(u("date:'3am to 5pm'")) assert q.__class__ == query.DateRange assert q.startdate == adatetime(2010, 9, 20, 3).floor() assert q.enddate == adatetime(2010, 9, 20, 17).ceil() q = qp.parse(u("date:blah")) assert q == query.NullQuery assert errs[0] == "blah" q = qp.parse(u("hello date:blarg")) assert q.__unicode__() == "(text:hello AND <_NullQuery>)" assert q[1].error == "blarg" assert errs[1] == "blarg" q = qp.parse(u("hello date:20055x10")) assert q.__unicode__() == "(text:hello AND <_NullQuery>)" assert q[1].error == "20055x10" assert errs[2] == "20055x10" q = qp.parse(u("hello date:'2005 19 32'")) assert q.__unicode__() == "(text:hello AND <_NullQuery>)" assert q[1].error == "2005 19 32" assert errs[3] == "2005 19 32" q = qp.parse(u("date:'march 24 to dec 12'")) assert q.__class__ == query.DateRange assert q.startdate == adatetime(2010, 3, 24).floor() assert q.enddate == adatetime(2010, 12, 12).ceil() q = qp.parse(u("date:('30 june' OR '10 july') quick")) assert q.__class__ == query.And assert len(q) == 2 assert q[0].__class__ == query.Or assert q[0][0].__class__ == query.DateRange assert q[0][1].__class__ == query.DateRange
def test_daterange_multi(): schema = fields.Schema(text=fields.TEXT, start=fields.DATETIME, end=fields.DATETIME) qp = qparser.QueryParser("text", schema) basedate = datetime(2010, 9, 20, 15, 16, 6, 454000) qp.add_plugin(dateparse.DateParserPlugin(basedate)) q = qp.parse("start:[2008 to] AND end:[2011 to 2011]") assert q.__class__ == query.And assert q[0].__class__ == query.DateRange assert q[1].__class__ == query.DateRange assert q[0].startdate == adatetime(2008).floor() assert q[0].enddate is None assert q[1].startdate == adatetime(2011).floor() assert q[1].enddate == adatetime(2011).ceil()