예제 #1
0
    def test__process_obj_list_operation(self):
        self._prepare_models()

        model_qs = ds.SphinxQuerySet(model=Search)
        qs = ds.SphinxQuerySet()

        obj = Related.objects.all()[0]
        obj_list = Related.objects.all()

        self.assertListEqual([obj.pk],
                             model_qs._process_obj_list_operation(obj))
        self.assertListEqual([o.pk for o in obj_list],
                             model_qs._process_obj_list_operation(obj_list))
        self.assertRaises(ValueError, qs._process_obj_list_operation, obj)
        self.assertRaises(ValueError, qs._process_obj_list_operation, obj_list)

        self.assertListEqual([1], qs._process_obj_list_operation(1))
        self.assertListEqual([sphinx_d], qs._process_obj_list_operation(d))
        self.assertListEqual([sphinx_dt], qs._process_obj_list_operation(dt))
        self.assertListEqual([4.2], qs._process_obj_list_operation(4.2))
        self.assertListEqual([1, 2, 3],
                             qs._process_obj_list_operation([1, 2, 3]))
        self.assertListEqual([1, 2, 3],
                             qs._process_obj_list_operation((1, 2, 3)))
        self.assertListEqual([1, 2, 3],
                             qs._process_obj_list_operation(iter([1, 2, 3])))

        self.assertRaises(ValueError, qs._process_obj_list_operation,
                          dict(a=1, b=2))
예제 #2
0
    def test__get_snippets_string(self):
        qs = ds.SphinxQuerySet()
        self.assertEqual('', qs._get_snippets_string())

        qs1 = ds.SphinxQuerySet(snippets_options={'option': 1})
        self.assertEqual(', 1 AS option', qs1._get_snippets_string())

        qs1 = ds.SphinxQuerySet(snippets_options={'option': 'str'})
        self.assertEqual(', \'str\' AS option', qs1._get_snippets_string())
예제 #3
0
    def test_remove_index(self):
        qs = ds.SphinxQuerySet(index='one two')

        qs1 = qs.remove_index('one')

        self.assertListEqual(['two'], qs1._indexes)
        self.assertListEqual(['one', 'two'], qs._indexes)
예제 #4
0
    def test_query(self):
        qs = ds.SphinxQuerySet()

        qs1 = qs.query('test')

        self.assertEqual('test', qs1._query)
        self.assertEqual(None, qs._query)
예제 #5
0
    def test_none(self):
        qs = ds.SphinxQuerySet()
        qs1 = qs.none()

        self.assertIsInstance(qs1, EmptySphinxQuerySet)
        self.assertListEqual([], list(qs1))
        self.assertDictEqual(EMPTY_RESULT_SET, qs1.meta)
예제 #6
0
    def test__format_options(self):
        qs = ds.SphinxQuerySet()

        self.assertEqual('', qs._format_options())

        self.assertEqual('OPTION reverse_scan=1',
                         qs._format_options(reverse_scan=True))
        self.assertEqual('OPTION field_weights=(field=100)',
                         qs._format_options(field_weights={'field': 100}))
예제 #7
0
    def test_all(self):
        qs = ds.SphinxQuerySet(maxmatches=SPHINX_MAX_MATCHES - 100)

        qs2 = qs.all()

        self.assertEqual(SPHINX_MAX_MATCHES - 100, qs2._limit)
        self.assertEqual(None, qs2._offset)

        self._is_cloned(qs, qs2)
예제 #8
0
    def test_options(self):
        qs = ds.SphinxQuerySet()

        qs1 = qs.options()
        self.assertEqual(qs, qs1)

        qs2 = qs.options(reverse_scan=True)
        self.assertEqual('OPTION reverse_scan=1', qs2._query_opts)

        self._is_cloned(qs, qs2)
예제 #9
0
    def test_group_by(self):
        qs = ds.SphinxQuerySet()

        qs1 = qs.group_by('title')

        self.assertEqual('GROUP BY `title`', qs1._group_by)
        self.assertEqual('', qs._group_by)

        # группировка только по одному полю или по вычисленному значению
        self.assertRaises(TypeError, qs.group_by, 'field1', 'field2')
예제 #10
0
    def test__process_single_object_operation(self):
        self._prepare_models()

        model_qs = ds.SphinxQuerySet(model=Search)
        qs = ds.SphinxQuerySet()

        obj = Related.objects.all()[0]

        self.assertEqual(obj.pk, model_qs._process_single_obj_operation(obj))
        self.assertRaises(ValueError, qs._process_single_obj_operation, obj)

        self.assertEqual(sphinx_d, model_qs._process_single_obj_operation(d))
        self.assertEqual(sphinx_d, qs._process_single_obj_operation(d))

        self.assertEqual(sphinx_dt, model_qs._process_single_obj_operation(dt))
        self.assertEqual(sphinx_dt, qs._process_single_obj_operation(dt))

        mqs = Related.objects.all()
        for x in [mqs, list(), tuple(), dict()]:
            self.assertRaises(TypeError, qs._process_single_obj_operation, mqs)
예제 #11
0
    def test__filter(self):
        qs = ds.SphinxQuerySet()

        self.assertDictEqual({}, qs._filters)

        qs1 = qs.filter(field=1)

        self.assertDictEqual({'field': 'field = 1'}, qs1._filters)
        self.assertDictEqual({}, qs._filters)

        self._is_cloned(qs, qs1)
예제 #12
0
    def test__exclude(self):
        qs = ds.SphinxQuerySet()

        self.assertDictEqual({}, qs._excludes)

        qs1 = qs.exclude(field=1)

        self.assertDictEqual({'field': 'field != 1'}, qs1._excludes)
        self.assertDictEqual({}, qs._excludes)

        self._is_cloned(qs, qs1)
예제 #13
0
    def test__decode_document_id(self):
        """
        >>> (123 << 52) | 3456
        553942754166574464
        """

        qs = ds.SphinxQuerySet()

        self.assertEqual((3456, 123),
                         qs._decode_document_id(553942754166574464))
        self.assertRaises(AssertionError, qs._decode_document_id, 'str')
예제 #14
0
    def test__parse_indexes(self):
        qs = ds.SphinxQuerySet()

        self.assertListEqual([], qs._parse_indexes(None))

        self.assertListEqual(['one1_-'], qs._parse_indexes('one1_-'))

        self.assertListEqual(['one', 'two'], qs._parse_indexes('one two'))

        self.assertListEqual(
            ['one', 'two'],
            qs._parse_indexes('onE!@#$%^&*(){}?/+=|\\:;tWo!!!'))
예제 #15
0
    def test_set_limits(self):
        qs = ds.SphinxQuerySet()

        self.assertEqual(SPHINX_QUERY_LIMIT, qs._limit)
        self.assertEqual(None, qs._offset)

        qs._set_limits(100)
        self.assertEqual(SPHINX_QUERY_LIMIT, qs._limit)
        self.assertEqual(100, qs._offset)

        qs._set_limits(100, 200)
        self.assertEqual(100, qs._limit)
        self.assertEqual(100, qs._offset)
예제 #16
0
    def test_reset(self):
        qs = ds.SphinxQuerySet(model=Search, using='somedb', index='one, two')

        self.assertEqual(qs.model, Search)
        self.assertEqual('somedb', qs.using)
        #self.assertListEqual(['one', 'two'], qs._indexes)

        qs1 = qs.reset()
        self.assertEqual(qs.model, qs1.model)
        self.assertEqual(qs.using, qs1.using)
        self.assertListEqual(qs._indexes, qs1._indexes)

        self._is_cloned(qs, qs1)
예제 #17
0
    def test_fields(self):
        qs = ds.SphinxQuerySet()

        self.assertEqual('*', qs._fields)
        self.assertDictEqual({}, qs._aliases)

        qs1 = qs.fields('field1', 'field2')
        self.assertEqual('`field1`, `field2`', qs1._fields)

        qs2 = qs.fields(x='karma*100+user_id')
        self.assertDictEqual({'x': 'karma*100+user_id AS `x`'}, qs2._aliases)

        self._is_cloned(qs, qs1)
        self._is_cloned(qs, qs2)
예제 #18
0
    def test_order_by(self):
        qs = ds.SphinxQuerySet()

        qs1 = qs.order_by()
        self.assertEqual(qs, qs1)

        qs2 = qs.order_by('pk')
        self.assertEqual('ORDER BY `id` ASC', qs2._order_by)

        qs3 = qs.order_by('-title')
        self.assertEqual('ORDER BY `title` DESC', qs3._order_by)

        qs4 = qs.order_by('field1', '-field2')
        self.assertEqual('ORDER BY `field1` ASC, `field2` DESC', qs4._order_by)
예제 #19
0
    def test__process_filters(self):
        qs = ds.SphinxQuerySet()

        self.assertDictEqual({}, qs._filters)

        self.assertDictEqual({'field': 'field = 1'},
                             qs._process_filters({}, False, field=1))
        self.assertDictEqual({'field': 'field IN (1,2,3)'},
                             qs._process_filters({},
                                                 False,
                                                 field__in=[1, 2, 3]))
        self.assertDictEqual({'field': 'field > 1'},
                             qs._process_filters({}, False, field__gt=1))
        self.assertDictEqual({'field': 'field >= 1'},
                             qs._process_filters({}, False, field__gte=1))
        self.assertDictEqual({'field': 'field < 1'},
                             qs._process_filters({}, False, field__lt=1))
        self.assertDictEqual({'field': 'field <= 1'},
                             qs._process_filters({}, False, field__lte=1))
        self.assertDictEqual({'field': 'field BETWEEN 1 AND 2'},
                             qs._process_filters({},
                                                 False,
                                                 field__range=[1, 2]))

        self.assertDictEqual({'field': 'field != 1'},
                             qs._process_filters({}, True, field=1))
        self.assertDictEqual({'field': 'field NOT IN (1,2,3)'},
                             qs._process_filters({}, True, field__in=[1, 2,
                                                                      3]))
        self.assertDictEqual({'field': 'field <= 1'},
                             qs._process_filters({}, True, field__gt=1))
        self.assertDictEqual({'field': 'field < 1'},
                             qs._process_filters({}, True, field__gte=1))
        self.assertDictEqual({'field': 'field >= 1'},
                             qs._process_filters({}, True, field__lt=1))
        self.assertDictEqual({'field': 'field > 1'},
                             qs._process_filters({}, True, field__lte=1))
        self.assertDictEqual({'field': 'NOT field BETWEEN 1 AND 2'},
                             qs._process_filters({}, True, field__range=[1,
                                                                         2]))

        self.assertRaises(ValueError,
                          qs._process_filters, {},
                          False,
                          field__range=[1])
        self.assertRaises(ValueError,
                          qs._process_filters, {},
                          False,
                          field__range=[1, 2, 3])
예제 #20
0
    def test_snippets(self):
        qs = ds.SphinxQuerySet()

        qs._snippets = False
        qs1 = qs.snippets(False)

        self.assertEqual(qs1, qs)

        qs2 = qs.snippets()
        self.assertEqual(qs2._snippets, True)

        qs._snippets_opts_string = 'str'
        qs._snippets_opts = dict()

        qs3 = qs.snippets(option=1)
        self.assertEqual(None, qs3._snippets_opts_string)
        self.assertDictEqual({'option': 1}, qs3._snippets_opts)

        self._is_cloned(qs, qs3)
예제 #21
0
    def test__get_index(self):
        qs = ds.SphinxQuerySet()

        qs._indexes = ['one', 'two']
        self.assertEqual('one two', qs._get_index())