merge result set grouping from hplattner
This commit is contained in:
commit
d6a1816d54
2 changed files with 24 additions and 20 deletions
|
@ -134,8 +134,8 @@ class Report(Template):
|
||||||
def getPresentationFormats(self):
|
def getPresentationFormats(self):
|
||||||
return [dict(renderer='default', title='Default')]
|
return [dict(renderer='default', title='Default')]
|
||||||
|
|
||||||
def getCategoryFields(self):
|
def getGroupFields(self):
|
||||||
return [f for f in self.fields if 'category' in f.executionSteps]
|
return [f for f in self.fields if 'group' in f.executionSteps]
|
||||||
|
|
||||||
|
|
||||||
class BaseQueryCriteria(Component):
|
class BaseQueryCriteria(Component):
|
||||||
|
|
|
@ -54,39 +54,43 @@ class Row(BaseRow):
|
||||||
def getContextAttr(obj, attr):
|
def getContextAttr(obj, attr):
|
||||||
return getattr(obj.context, attr)
|
return getattr(obj.context, attr)
|
||||||
|
|
||||||
def getCategories(self):
|
def getGroupFields(self):
|
||||||
return [self.getRawValue(f.name) for f in
|
return [self.getRawValue(f.name) for f in
|
||||||
self.parent.context.fields if 'category' in f.executionSteps]
|
self.parent.context.fields if 'group' in f.executionSteps]
|
||||||
|
|
||||||
|
|
||||||
class ResultSet(object):
|
class ResultSet(object):
|
||||||
|
|
||||||
def __init__(self, context, data, rowFactory=Row,
|
def __init__(self, context, data, rowFactory=Row, headerRowFactory=Row,
|
||||||
sortCriteria=None, queryCriteria=BaseQueryCriteria(),
|
sortCriteria=None, queryCriteria=BaseQueryCriteria()):
|
||||||
filterDuplicates=False):
|
|
||||||
self.context = context # the report or report instance
|
self.context = context # the report or report instance
|
||||||
self.data = data
|
self.data = data
|
||||||
self.rowFactory = rowFactory
|
self.rowFactory = rowFactory
|
||||||
|
self.headerRowFactory = headerRowFactory
|
||||||
self.sortCriteria = sortCriteria
|
self.sortCriteria = sortCriteria
|
||||||
self.queryCriteria = queryCriteria
|
self.queryCriteria = queryCriteria
|
||||||
self.filterDuplicates = filterDuplicates
|
|
||||||
self.totals = BaseRow(None, self)
|
self.totals = BaseRow(None, self)
|
||||||
|
|
||||||
def filterDuplicateRows(self, result):
|
def insertHeaderRow(self, idx, result):
|
||||||
seen = set()
|
result.insert(idx, self.headerRowFactory(result[idx].context, self))
|
||||||
for row in result:
|
|
||||||
cats = tuple(row.getRawValue(f.name) for f in self.categoryColumns)
|
|
||||||
if cats not in seen:
|
|
||||||
seen.add(cats)
|
|
||||||
yield row
|
|
||||||
|
|
||||||
def getResult(self):
|
def getResult(self):
|
||||||
result = [self.rowFactory(item, self) for item in self.data]
|
result = [self.rowFactory(item, self) for item in self.data]
|
||||||
if self.filterDuplicates:
|
|
||||||
result = self.filterDuplicateRows(result)
|
|
||||||
result = [row for row in result if self.queryCriteria.check(row)]
|
result = [row for row in result if self.queryCriteria.check(row)]
|
||||||
if self.sortCriteria:
|
if self.sortCriteria:
|
||||||
result.sort(key=lambda x: [f.getSortValue(x) for f in self.sortCriteria])
|
result.sort(key=lambda x: [f.getSortValue(x) for f in self.sortCriteria])
|
||||||
|
if self.groupColumns:
|
||||||
|
for idx, row in enumerate(result):
|
||||||
|
insert = False
|
||||||
|
for f in self.groupColumns:
|
||||||
|
if idx == 0:
|
||||||
|
insert = True
|
||||||
|
else:
|
||||||
|
if (result[idx].getRawValue(f.name) !=
|
||||||
|
result[idx-1].getRawValue(f.name)):
|
||||||
|
insert = True
|
||||||
|
if insert:
|
||||||
|
self.insertHeaderRow(idx, result)
|
||||||
for idx, row in enumerate(result):
|
for idx, row in enumerate(result):
|
||||||
row.sequenceNumber = idx + 1
|
row.sequenceNumber = idx + 1
|
||||||
return result
|
return result
|
||||||
|
@ -99,8 +103,8 @@ class ResultSet(object):
|
||||||
return self.context.getActiveOutputFields()
|
return self.context.getActiveOutputFields()
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def categoryColumns(self):
|
def groupColumns(self):
|
||||||
return self.context.getCategoryFields()
|
return self.context.getGroupFields()
|
||||||
|
|
||||||
|
|
||||||
class CombinedResultSet(ResultSet):
|
class CombinedResultSet(ResultSet):
|
||||||
|
|
Loading…
Add table
Reference in a new issue