def __call__(self, dquery): filters = [] catalog = self.catalogtool._catalog idxs = catalog.indexes.keys() query = {'match_all': {}} es_only_indexes = getESOnlyIndexes() for key, value in dquery.items(): if key not in idxs and key not in es_only_indexes: continue index = getIndex(catalog, key) if index is None and key in es_only_indexes: # deleted index for plone performance but still need on ES index = EZCTextIndex(catalog, key) qq = index.get_query(key, value) if qq is None: continue if index is not None and index.filter_query: filters.append(qq) else: query = qq if len(filters) == 0: return query else: return {'filtered': {'filter': {'and': filters}, 'query': query}}
def get_index_data(obj, es): # noqa: C901 catalog = es.catalogtool._catalog wrapped_object = get_wrapped_object(obj, es) index_data = {} for index_name in catalog.indexes.keys(): index = getIndex(catalog, index_name) if index is not None: try: value = index.get_value(wrapped_object) except Exception: logger.error('Error indexing value: %s: %s\n%s' % ('/'.join(obj.getPhysicalPath()), index_name, traceback.format_exc())) value = None if value in (None, 'None'): # yes, we'll index null data... value = None # Ignore errors in converting to unicode, so json.dumps # does not barf when we're trying to send data to ES. if six.PY2: if isinstance(value, str): value = six.text_type(value, 'utf-8', 'ignore') else: if isinstance(value, bytes): value = value.decode('utf-8', 'ignore') index_data[index_name] = value # in case these indexes are deleted # (to increase performance and improve ram usage) for name in getESOnlyIndexes(): if name in index_data: continue indexer = queryMultiAdapter((obj, es.catalogtool), IIndexer, name=name) if indexer is not None: try: val = indexer() if six.PY2: if isinstance(value, str): value = six.text_type(value, 'utf-8', 'ignore') else: if isinstance(value, bytes): value = value.decode('utf-8', 'ignore') index_data[name] = val except Exception: logger.error('Error indexing value: %s: %s\n%s' % ('/'.join( obj.getPhysicalPath()), name, traceback.format_exc())) else: val = getattr(obj, name, None) if callable(val): val = val() index_data[name] = val for _, adapter in getAdapters((obj, ), IAdditionalIndexDataProvider): index_data.update(adapter(es, index_data)) return index_data
def get_index_data(obj, es): catalog = es.catalogtool._catalog wrapped_object = get_wrapped_object(obj, es) index_data = {} for index_name in catalog.indexes.keys(): index = getIndex(catalog, index_name) if index is not None: try: value = index.get_value(wrapped_object) except Exception: logger.error('Error indexing value: %s: %s\n%s' % ( '/'.join(obj.getPhysicalPath()), index_name, traceback.format_exc())) value = None if value in (None, 'None'): # yes, we'll index null data... value = None # Ignore errors in converting to unicode, so json.dumps # does not barf when we're trying to send data to ES. if isinstance(value, str): value = unicode(value, 'utf-8', 'ignore') index_data[index_name] = value # in case these indexes are deleted # (to increase performance and improve ram usage) for name in getESOnlyIndexes(): if name in index_data: continue indexer = queryMultiAdapter((obj, es.catalogtool), IIndexer, name=name) if indexer is not None: try: val = indexer() if isinstance(value, str): val = unicode(val, 'utf-8', 'ignore') index_data[name] = val except Exception: logger.error('Error indexing value: %s: %s\n%s' % ( '/'.join(obj.getPhysicalPath()), name, traceback.format_exc())) else: val = getattr(obj, name, None) if callable(val): val = val() index_data[name] = val for _, adapter in getAdapters((obj,), IAdditionalIndexDataProvider): index_data.update(adapter(es, index_data)) return index_data
def searchResults(self, REQUEST=None, check_perms=False, **kw): enabled = False if self.enabled: # need to also check if it is a search result we care about # using EL for if getESOnlyIndexes().intersection(kw.keys()): enabled = True if not enabled: if check_perms: return self.catalogtool._old_searchResults(REQUEST, **kw) else: return self.catalogtool._old_unrestrictedSearchResults( REQUEST, **kw) if isinstance(REQUEST, dict): query = REQUEST.copy() else: query = {} query.update(kw) if check_perms: show_inactive = query.get('show_inactive', False) if isinstance(REQUEST, dict) and not show_inactive: show_inactive = 'show_inactive' in REQUEST user = _getAuthenticatedUser(self.catalogtool) query['allowedRolesAndUsers'] = \ self.catalogtool._listAllowedRolesAndUsers(user) if not show_inactive and not _checkPermission( AccessInactivePortalContent, self.catalogtool): query['effectiveRange'] = DateTime() orig_query = query.copy() logger.debug('Running query: %s' % repr(orig_query)) try: results = self.search(query) return results except Exception: logger.error( 'Error running Query: {0!r}'.format(orig_query), exc_info=True) return self.catalogtool._old_searchResults(REQUEST, **kw)
def searchResults(self, REQUEST=None, check_perms=False, **kw): enabled = False if self.enabled: # need to also check if it is a search result we care about # using EL for if getESOnlyIndexes().intersection(kw.keys()): enabled = True if not enabled: if check_perms: return self.catalogtool._old_searchResults(REQUEST, **kw) else: return self.catalogtool._old_unrestrictedSearchResults( REQUEST, **kw) if isinstance(REQUEST, dict): query = REQUEST.copy() else: query = {} query.update(kw) if check_perms: show_inactive = query.get('show_inactive', False) if isinstance(REQUEST, dict) and not show_inactive: show_inactive = 'show_inactive' in REQUEST user = _getAuthenticatedUser(self.catalogtool) query['allowedRolesAndUsers'] = \ self.catalogtool._listAllowedRolesAndUsers(user) if not show_inactive and not _checkPermission( AccessInactivePortalContent, self.catalogtool): query['effectiveRange'] = DateTime() orig_query = query.copy() logger.debug('Running query: %s' % repr(orig_query)) try: results = self.search(query) return results except Exception: logger.error( 'Error running Query: {0!r}'.format(orig_query), exc_info=True) return self.catalogtool._old_searchResults(REQUEST, **kw)
def __call__(self, dquery): filters = [] matches = [] catalog = self.catalogtool._catalog idxs = catalog.indexes.keys() query = {'match_all': {}} es_only_indexes = getESOnlyIndexes() for key, value in dquery.items(): if key not in idxs and key not in es_only_indexes: continue index = getIndex(catalog, key) if index is None and key in es_only_indexes: # deleted index for plone performance but still need on ES index = EZCTextIndex(catalog, key) qq = index.get_query(key, value) if qq is None: continue if index is not None and index.filter_query: if isinstance(qq, list): filters.extend(qq) else: filters.append(qq) else: if isinstance(qq, list): matches.extend(qq) else: matches.append(qq) if len(filters) == 0 and len(matches) == 0: return query else: query = {'bool': dict()} if len(filters) > 0: query['bool']['filter'] = filters if len(matches) > 0: query['bool']['should'] = matches query['bool']['minimum_should_match'] = 1 return query
def __call__(self, dquery): filters = [] matches = [] catalog = self.catalogtool._catalog idxs = catalog.indexes.keys() query = {'match_all': {}} es_only_indexes = getESOnlyIndexes() for key, value in dquery.items(): if key not in idxs and key not in es_only_indexes: continue index = getIndex(catalog, key) if index is None and key in es_only_indexes: # deleted index for plone performance but still need on ES index = EZCTextIndex(catalog, key) qq = index.get_query(key, value) if qq is None: continue if index is not None and index.filter_query: if isinstance(qq, list): filters.extend(qq) else: filters.append(qq) else: if isinstance(qq, list): matches.extend(qq) else: matches.append(qq) if len(filters) == 0 and len(matches) == 0: return query else: query = { 'bool': { 'should': matches, 'minimum_should_match': 1, 'filter': filters } } return query