# $Id$
# $URL$
logger = logging.getLogger('meresco.drilldown')
logger.debug("Starting logger")
drilldownConfig = configs['drilldown']
serverConfig = configs['server']
spy = any.spy()
fieldFeatures = any.getFieldFeatures()
drilldownFields = any.getDrilldownFields( 'drilldownFields')
drilldownFieldsTop = any.getDrilldownFields( 'drilldownFields-top')
drilldownFieldsNoMultiLevel = []
drilldownFieldsNoMultiLevel.extend(drilldownFieldsTop)
drilldownFieldsNoMultiLevel.extend(drilldownFields)
space = "\n "
def fieldAndTermSplit(fieldAndTerm):
return fieldAndTerm.split(':', 1)
def fieldAndTermJoin(field, term):
return '%s:%s' % (field, term)
def shrink(aString, maxLength=160):
if len(aString) > maxLength:
return aString[:maxLength] + '...'
return aString
def createDrilldownQuery(drilldownArgs, sortKeys):
newArguments = [];
if sortKeys: newArguments.append(('sortKeys', sortKeys))
for existing in drilldownArgs:
# make sure to convert the unicode into a native string before calling urlencode
newArguments.append(('drilldown', str(existing)))
# logger.debug(infra.prpt('newArguments',newArguments))
return urlencode(newArguments)
def displayLabel(label):
return '
'
yield '
' + chooseFromTitle +'
'
sortKeys = arguments.get('sortKeys', [''])[0]
if multilevelResults or total < 5000000:
# TP: result set is not too large, multilevel results will be calculated
# or this is already done (multilevelResults)
if not multilevelResults:
# Note: using a UvT version of multiLevelDrilldown
multilevelResults = any.multiLevelDrilldown(docset, (['date', 'author']))
for (fieldName, levelField), termCounts in multilevelResults:
# logger.debug("fieldName: " + fieldName + ', levelField: ' + levelField)
if levelField == None or levelField == '':
logger.error("displayDrilldownFields skipping record: " + fieldName )
continue
yield displayDrilldownExtraLabel(levelField, selectedFieldNames,
language, selectedFacets, sortKeys, total)
label = drilldownConfig.get(levelField, section = 'fieldNames',default='LEEG')
yield displayItemGroup(label, termCounts, selectedFacets, levelField, selectedFieldNames,
arguments, language, sortKeys)
else:
for fieldName in multilevelResults:
result = multilevelResults[fieldName]
levelField = ''
if not 'level' in result:
logger.error("displayDrilldownFields skipping record: " + fieldName )
else: levelField = result['level']
label = drilldownConfig.get(levelField, section = 'fieldNames',default='LEEG')
termCounts = result['termCounts']
yield displayItemGroup(label, termCounts, selectedFacets, levelField, selectedFieldNames,
arguments, language, sortKeys)
fields = drilldownFields
# fields = sortedDrilldownFields
else:
# TP: result set is too large, only one level of the multilevel facests will be calculated.
fields = drilldownFieldsNoMultiLevel
# spy(infra.prpt("fields",fields))
# spy(infra.prpt('------------------------drilldownResults' , drilldownResults))
if not drilldownResults:
drilldownResults = any.drilldown(docset, fields)
drilldownResultsAsDict = dict(drilldownResults)
else: drilldownResultsAsDict = drilldownResults
for fieldName, number, sorted in fields:
termCounts = []
if fieldName in drilldownResults:
termCounts = drilldownResults[fieldName]
else:
termCounts = drilldownResultsAsDict.get(fieldName,[])
label = drilldownConfig.get(fieldName, section = 'fieldNames')
if termCounts == []:
continue
yield displayItemGroup(label, termCounts, selectedFacets, fieldName, selectedFieldNames, arguments, language, sortKeys)
yield """
%(space)s
%(space)s """ % {'space': space}
def main(total, docset, drilldownResults, multilevelResults, arguments, path='', *args, **kwargs):
### forcing english as language
language = 'en'
# language = path.startswith('/en/') and 'en' or 'nl'
drilldownConfig.setDefaults(section='labels', language=language)
yield space + ''
selectedFacets = arguments.get('drilldown', [])
selectedLabel= drilldownConfig.get('limitTo',default='Selected:')
sortKeys = arguments.get('sortKeys', [''])[0]
if selectedFacets:
yield space + '
%s
' % selectedLabel
for drilldownItem in reversed (selectedFacets):
fieldName, value = fieldAndTermSplit(drilldownItem)
drilldownArgs = set(selectedFacets)
drilldownArgs.remove(drilldownItem)
label = drilldownConfig.get(fieldName, section = 'fieldNames')
query = createDrilldownQuery(drilldownArgs, sortKeys)
term = displayTerm(value, fieldName, language)
yield displayFilter(query, value, label, term)
yield space + '
'
if total > 0:
yield displayDrilldownFields(total, docset, drilldownResults, multilevelResults, arguments, language)
yield space + '
'