def create(self, *args, **kwargs): values = () if self.model: assert len(args) == 1, \ 'Model RT-index can be updated by object instance or queryset' obj = args[0] if isinstance(obj, self.model): # один объект, один документ values = (self._get_values_for_update(obj), ) elif isinstance(obj, QuerySet): # несколько объектов, несколько документов values = map(self._get_values_for_update, obj) else: raise SearchError( 'Can`t `%s` not an instance/queryset of `%s`' % (obj, self.model)) else: raise NotImplementedError( 'Non-model RT-index update not supported yet') if not values: raise SearchError('Empty QuerySet? o_O') query = ['REPLACE' if kwargs.pop('force_update', False) else 'INSERT'] query.append('INTO %s' % self.realtime) query.append('(%s)' % ','.join(self._get_index_fields())) query.append('VALUES') query_args = [] q = [] for v in values: f_list = [] for f in v: if isinstance(f, six.string_types): query_args.append(f) f_list.append('%s') elif isinstance(f, (list, tuple)): f_list.append('(%s)' % ','.join(f)) else: f_list.append(force_unicode(f)) q.append('(%s)' % ','.join(f_list)) query.append(', '.join(q)) cursor = conn_handler.cursor() count = cursor.execute(' '.join(query), query_args) return count
def create(self, *args, **kwargs): values = () if self.model: assert len(args) == 1, \ 'Model RT-index can be updated by object instance or queryset' obj = args[0] if isinstance(obj, self.model): # один объект, один документ values = (self._get_values_for_update(obj),) elif isinstance(obj, QuerySet): # несколько объектов, несколько документов values = map(self._get_values_for_update, obj) else: raise SearchError('Can`t `%s` not an instance/queryset of `%s`' % (obj, self.model)) else: raise NotImplementedError('Non-model RT-index update not supported yet') if not values: raise SearchError('Empty QuerySet? o_O') query = ['REPLACE' if kwargs.pop('force_update', False) else 'INSERT'] query.append('INTO %s' % self.realtime) query.append('(%s)' % ','.join(self._get_index_fields())) query.append('VALUES') query_args = [] q = [] for v in values: f_list = [] for f in v: if isinstance(f, six.string_types): query_args.append(f) f_list.append('%s') elif isinstance(f, (list, tuple)): f_list.append('(%s)' % ','.join(f)) else: f_list.append(force_unicode(f)) q.append('(%s)' % ','.join(f_list)) query.append(', '.join(q)) #print query #print query_args cursor = conn_handler.cursor() count = cursor.execute(' '.join(query), query_args) return count
def create(self, *args, **kwargs): values = () if self.model: assert len(args) == 1, "Model RT-index can be updated by object instance or queryset" obj = args[0] if isinstance(obj, self.model): # один объект, один документ values = (self._get_values_for_update(obj),) elif isinstance(obj, QuerySet): # несколько объектов, несколько документов values = map(self._get_values_for_update, obj) else: raise SearchError("Can`t `%s` not an instance/queryset of `%s`" % (obj, self.model)) else: raise NotImplementedError("Non-model RT-index update not supported yet") if not values: raise SearchError("Empty QuerySet? o_O") query = ["REPLACE" if kwargs.pop("force_update", False) else "INSERT"] query.append("INTO %s" % self.realtime) query.append("(%s)" % ",".join(self._get_index_fields())) query.append("VALUES") query_args = [] q = [] for v in values: f_list = [] for f in v: if isinstance(f, six.string_types): query_args.append(f) f_list.append("%s") elif isinstance(f, (list, tuple)): f_list.append("(%s)" % ",".join(f)) else: f_list.append(force_unicode(f)) q.append("(%s)" % ",".join(f_list)) query.append(", ".join(q)) cursor = conn_handler.cursor() count = cursor.execute(" ".join(query), query_args) return count
def _get_snippets(self, instance): (fields, docs) = zip(*[(f, getattr(instance, f)) for f in self._get_doc_fields(instance) if getattr(instance, f)]) opts = self._get_snippets_string() doc_format = ', '.join('%s' for x in range(0, len(fields))) query = 'CALL SNIPPETS (({0:>s}), \'{1:>s}\', %s {2:>s})'.format(doc_format, instance.__sphinx_indexes__[0], opts) docs += (self._query or '',) c = conn_handler.cursor() c.execute(query, docs) snippets = {} for field in fields: snippets[field] = c.fetchone()[0].decode('utf-8') return snippets
def _get_snippets(self, instance): (fields, docs) = zip(*[(f, getattr(instance, f)) for f in self._get_doc_fields(instance) if getattr(instance, f)]) opts = self._get_snippets_string() doc_format = ', '.join('%s' for x in range(0, len(fields))) query = 'CALL SNIPPETS (({0:>s}), \'{1:>s}\', %s {2:>s})'.format( doc_format, instance.__sphinx_indexes__[0], opts) docs += (self._query or '', ) c = conn_handler.cursor() c.execute(query, docs) snippets = {} for field in fields: snippets[field] = c.fetchone()[0].decode('utf-8') return snippets
def delete(self): """ Удаляет из индекса документы, удовлетворяющие условиям filter """ assert self._can_modify(), "Cannot use 'limit' or 'offset' with delete." q = ["DELETE FROM %s WHERE" % self.realtime] if len(self._doc_ids) == 1: where = "id = %i" % self._doc_ids[0] else: where = "id IN (%s)" % ",".join(str(id) for id in self._doc_ids) q.append(where) query = " ".join(q) cursor = conn_handler.cursor() cursor.execute(query, self._query_args)
def keywords(self, text, index=None, hits=None): """\ Возвращает генератор со списком ключевых слов для переданного текста\ """ if index is None: # пока только для одного индекса index = self._indexes[0] query = 'CALL KEYWORDS (%s)' q = ['%s', '%s'] if hits is not None and hits: q.append('1') query = query % ', '.join(q) cursor = conn_handler.cursor() count = cursor.execute(query, [text, index]) for x in range(0, count): yield cursor.fetchone()
def keywords(self, text, index=None, hits=None): """\ Возвращает генератор со списком ключевых слов для переданного текста\ """ if index is None: # пока только для одного индекса index = self._indexes[0] query = 'CALL KEYWORDS (%s)' q = ['%s', '%s'] if hits is not None and hits: q.append('1') query = query % ', '.join(q) cursor = conn_handler.cursor() count = cursor.execute(query, [text, index]) for x in range(0, count): yield cursor.fetchone()
def delete(self): """ Удаляет из индекса документы, удовлетворяющие условиям filter """ assert self._can_modify(),\ "Cannot use 'limit' or 'offset' with delete." q = ['DELETE FROM %s WHERE' % self.realtime] if len(self._doc_ids) == 1: where = 'id = %i' % self._doc_ids[0] else: where = 'id IN (%s)' % ','.join(str(id) for id in self._doc_ids) q.append(where) query = ' '.join(q) cursor = conn_handler.cursor() cursor.execute(query, self._query_args)