diff --git a/gracedb/query.py b/gracedb/query.py index 26ebf175e61030f986b9834ff3c86e213bcd7397..43f91df22588263cf3a33e82a27c8f5f38f624ad 100644 --- a/gracedb/query.py +++ b/gracedb/query.py @@ -20,11 +20,12 @@ from pyparsing import \ opAssoc, operatorPrecedence, oneOf, \ stringStart, stringEnd, ParseException -def maybeRange(name): +def maybeRange(name, dbname=None): + dbname = dbname or name def f(toks): if len(toks) == 1: - return name, Q(**{name: toks[0]}) - return name, Q(**{name+"__range": toks.asList()}) + return name, Q(**{dbname: toks[0]}) + return name, Q(**{dbname+"__range": toks.asList()}) return f encodeType = dict( @@ -73,6 +74,13 @@ gidRange = gid + Suppress("..") + gid gidQ = Optional(Suppress(Keyword("gid:"))) + (gid^gidRange) gidQ = gidQ.setParseAction(maybeRange("id")) +# hardware injection id +hid = Suppress("H")+Word("0123456789") +hidRange = hid + Suppress("..") + hid +hidQ = Optional(Suppress(Keyword("hid:"))) + (hid^hidRange) +hidQ = hidQ.setParseAction(maybeRange("hid", dbname="id")) + + # Labels labelNames = ["DQV", "INJ", "LUMIN_NO", "LUMIN_GO", "SWIFT_NO", "SWIFT_GO"] label = Or([Literal(n) for n in labelNames]).\ @@ -97,7 +105,7 @@ dateQ = (Optional(Suppress(Keyword("date:"))) + dateTime).\ setParseAction(doDate) -q = (gidQ | groupQ | atypeQ | gpsQ | labelQ ).setName("query term") +q = (gidQ | hidQ | groupQ | atypeQ | gpsQ | labelQ ).setName("query term") def parseQuery(s): d={} @@ -109,5 +117,12 @@ def parseQuery(s): d["group"] &= ~Q(group__name="Test") else: d["group"] = ~Q(group__name="Test") + if "hid" in d: + d["hid"] = d["hid"] & Q(analysisType="HWINJ") + if "id" in d: + d["id"] = d["id"] & ~Q(analysisType="HWINJ") + if "id" in d and "hid" in d: + d["id"] = d["id"] | d["hid"] + del d["hid"] return reduce(Q.__and__, d.values(), Q())