hydrus/include/ClientSearch.py

113 lines
3.1 KiB
Python

import ClientData
import HydrusConstants as HC
import HydrusData
import HydrusGlobals
import re
import wx
def SearchEntryMatchesPredicate( search_entry, predicate ):
( predicate_type, value, inclusive ) = predicate.GetInfo()
if predicate_type == HC.PREDICATE_TYPE_TAG: return SearchEntryMatchesTag( search_entry, value, search_siblings = True )
else: return False
def SearchEntryMatchesTag( search_entry, tag, search_siblings = True ):
def compile_re( s ):
regular_parts_of_s = s.split( '*' )
escaped_parts_of_s = [ re.escape( part ) for part in regular_parts_of_s ]
s = '.*'.join( escaped_parts_of_s )
return re.compile( '(\\A|\\s)' + s + '(\\s|\\Z)', flags = re.UNICODE )
if ':' in search_entry:
search_namespace = True
( namespace_entry, search_entry ) = search_entry.split( ':', 1 )
namespace_re_predicate = compile_re( namespace_entry )
else: search_namespace = False
if '*' not in search_entry: search_entry += '*'
re_predicate = compile_re( search_entry )
if search_siblings:
sibling_manager = HydrusGlobals.controller.GetManager( 'tag_siblings' )
tags = sibling_manager.GetAllSiblings( tag )
else: tags = [ tag ]
for tag in tags:
if ':' in tag:
( n, t ) = tag.split( ':', 1 )
if search_namespace and re.search( namespace_re_predicate, n ) is None: continue
comparee = t
else:
if search_namespace: continue
comparee = tag
if re.search( re_predicate, comparee ) is not None: return True
return False
def FilterPredicates( search_entry, predicates, service_key = None, expand_parents = False ):
matches = [ predicate for predicate in predicates if SearchEntryMatchesPredicate( search_entry, predicate ) ]
if service_key is not None and expand_parents:
parents_manager = HydrusGlobals.controller.GetManager( 'tag_parents' )
matches = parents_manager.ExpandPredicates( service_key, matches )
return matches
def SortPredicates( predicates, collapse_siblings = False ):
if collapse_siblings:
siblings_manager = HydrusGlobals.controller.GetManager( 'tag_siblings' )
predicates = siblings_manager.CollapsePredicates( predicates )
def cmp_func( x, y ): return cmp( x.GetCount(), y.GetCount() )
predicates.sort( cmp = cmp_func, reverse = True )
return predicates
SYSTEM_PREDICATE_INBOX = HydrusData.Predicate( HC.PREDICATE_TYPE_SYSTEM_INBOX, None )
SYSTEM_PREDICATE_ARCHIVE = HydrusData.Predicate( HC.PREDICATE_TYPE_SYSTEM_ARCHIVE, None )
SYSTEM_PREDICATE_LOCAL = HydrusData.Predicate( HC.PREDICATE_TYPE_SYSTEM_LOCAL, None )
SYSTEM_PREDICATE_NOT_LOCAL = HydrusData.Predicate( HC.PREDICATE_TYPE_SYSTEM_NOT_LOCAL, None )