File indexing completed on 2026-04-09 07:48:49
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 import os, logging
0023 log = logging.getLogger(__name__)
0024
0025
0026 class OpticksQuery(object):
0027 """
0028 Analogue of okc/OpticksQuery.cc
0029 """
0030 RANGE_ = "range:"
0031
0032 INDEX_ = "index:"
0033 DEPTH_ = "depth:"
0034
0035 NONE = 0
0036 RANGE = 1
0037 INDEX = 2
0038
0039 def __init__(self, query):
0040 elem = query.split(",")
0041
0042 self.type_ = self.NONE
0043 self.range_ = []
0044 self.index = 0
0045 self.index_depth = 0
0046 self.depth = 0
0047
0048 for q in elem:
0049 self.parseQueryElement(q)
0050 pass
0051 self.query = query
0052
0053 if self.type_ == self.RANGE:
0054 self.expect = self.expected_range_count()
0055 else:
0056 self.expect = None
0057 pass
0058
0059 def __repr__(self):
0060 return "OpticksQuery %s range %r index %s depth %s " % (self.query, self.range_, self.index, self.depth)
0061
0062
0063 def check_selected_count(self, count):
0064 if self.type_ != self.RANGE: return
0065 assert self.expect == count, ( "expect %s count %s " % (self.expect, count))
0066 log.info("count %s matches expectation " % count )
0067
0068 def expected_range_count(self):
0069 """
0070 * slice style range selection 0:10 corresponds to 10 items from 0 to 9 inclusive
0071 """
0072 expected_ = 0
0073 for i in range(len(self.range_)/2):
0074 expected_ += self.range_[i*2+1] - self.range_[i*2+0]
0075 pass
0076 return expected_
0077
0078 def selected(self, name, index, depth, recursive_select_=False):
0079 """
0080 """
0081 selected_ = False
0082 if self.type_ == self.NONE:
0083 selected_ = True
0084 elif self.type_ == self.RANGE and len(self.range_) > 0:
0085 assert len(self.range_) % 2 == 0
0086 for i in range(len(self.range_)/2):
0087 if index >= self.range_[i*2+0] and index < self.range_[i*2+1]:
0088 selected_ = True
0089 pass
0090 pass
0091 elif self.type_ == self.INDEX and self.index > 0:
0092 if index == self.index:
0093 self.index_depth = depth
0094 log.info("index found at depth %s " % self.index_depth )
0095 selected_ = True
0096 recursive_select_ = True
0097 elif recursive_select_:
0098 if self.index_depth > 0 and depth < self.index_depth + self.depth:
0099 selected_ = True
0100 pass
0101 pass
0102 else:
0103 pass
0104 pass
0105 return selected_, recursive_select_
0106
0107
0108 def __call__(self, index):
0109 return self.selected("dummy", index, -1)
0110
0111
0112 def parseQueryElement(self, q):
0113 if q.startswith(self.RANGE_):
0114 self.type_ = self.RANGE
0115 elem = q[len(self.RANGE_):].split(":")
0116 assert len(elem) == 2
0117 self.range_.append(int(elem[0]))
0118 self.range_.append(int(elem[1]))
0119 elif q.startswith(self.INDEX_):
0120 self.type_ = self.INDEX
0121 self.index = int(q[len(self.INDEX_):])
0122 elif q.startswith(self.DEPTH_):
0123 self.depth = int(q[len(self.DEPTH_):])
0124 else:
0125 pass
0126 pass
0127
0128
0129
0130 def test_multirange():
0131 q_ = "range:3155:3156,range:4448:4449"
0132 q = OpticksQuery(q_)
0133 print(q)
0134 s = filter(lambda i:q(i)[0] == True, range(3000,5000))
0135 print(s)
0136 assert s == [3155, 4448]
0137 assert len(s) == 2, s
0138
0139
0140
0141 if __name__ == '__main__':
0142
0143 logging.basicConfig(level=logging.INFO)
0144
0145
0146
0147 test_multirange()
0148
0149
0150
0151
0152
0153
0154
0155
0156