2
0
mirror of https://github.com/xcat2/confluent.git synced 2025-08-26 21:20:30 +00:00

Implement noderange pagination

Noderange syntax now has:
<number : skip first number of nodes matching noderange
>number: provide only number of nodes matching noderange

These operators are intended to be at the end of a noderange.  For example:
n1-n8<4>3

That will skip n1-n4 and provide only 3 (n5, n6, n7)
This commit is contained in:
Jarrod Johnson
2015-03-24 17:03:08 -04:00
parent 13962ec69d
commit ca4c1673a5

View File

@@ -28,7 +28,9 @@ _nodeword = pp.Word(pp.alphanums + '~^$/=-:.*+!')
_nodebracket = pp.QuotedString(quoteChar='[', endQuoteChar=']',
unquoteResults=False)
_nodeatom = pp.Group(pp.OneOrMore(_nodeword | _nodebracket))
_grammar = _nodeatom | ',-' | ',' | '@'
_paginationstart = pp.Word('<', pp.nums)
_paginationend = pp.Word('>', pp.nums)
_grammar = _nodeatom | ',-' | ',' | '@' | _paginationstart | _paginationend
_parser = pp.nestedExpr(content=_grammar)
_numextractor = pp.OneOrMore(pp.Word(pp.alphas + '-') | pp.Word(pp.nums))
@@ -43,13 +45,23 @@ class NodeRange(object):
"""
def __init__(self, noderange, config=None):
self.beginpage = None
self.endpage = None
self.cfm = config
elements = _parser.parseString("(" + noderange + ")").asList()[0]
self._noderange = self._evaluate(elements)
@property
def nodes(self):
return self._noderange
if self.beginpage is None and self.endpage is None:
return self._noderange
sortedlist = list(self._noderange)
sortedlist.sort()
if self.beginpage is not None:
sortedlist = sortedlist[self.beginpage:]
if self.endpage is not None:
sortedlist = sortedlist[:self.endpage]
return set(sortedlist)
def _evaluate(self, parsetree, filternodes=None):
current_op = 0 # enum, 0 union, 1 subtract, 2 intersect
@@ -188,6 +200,12 @@ class NodeRange(object):
right += '.' + domain
nrange = left + ':' + right
return self.expandrange(nrange, ':')
elif '<' in element:
self.beginpage = int(element[1:])
return set([])
elif '>' in element:
self.endpage = int(element[1:])
return set([])
if self.cfm is None:
return set([element])
raise Exception(element + ' not a recognized node, group, or alias')