|
| 1 | +# -*- coding: utf-8 -*- |
| 2 | +import os |
| 3 | +import platform |
| 4 | +import time |
| 5 | +if platform.python_version() < '2.7': |
| 6 | + unittest = __import__('unittest2') |
| 7 | +else: |
| 8 | + import unittest |
| 9 | + |
| 10 | +RUN_YZ = int(os.environ.get('RUN_YZ', '0')) |
| 11 | + |
| 12 | + |
| 13 | +class YZSearchTests(object): |
| 14 | + @unittest.skipUnless(RUN_YZ, 'RUN_YZ is undefined') |
| 15 | + def test_yz_search_from_bucket(self): |
| 16 | + bucket = self.client.bucket('yztest') |
| 17 | + bucket.new("user", {"user_s": "Z"}).store() |
| 18 | + time.sleep(1) |
| 19 | + results = bucket.search("user_s:Z") |
| 20 | + self.assertEquals(1, len(results['docs'])) |
| 21 | + # TODO: check that docs return useful info |
| 22 | + result = results['docs'][0] |
| 23 | + self.assertEquals(True, result.has_key('_yz_rk')) |
| 24 | + self.assertEquals(u'user', result['_yz_rk']) |
| 25 | + self.assertEquals(True, result.has_key('_yz_rb')) |
| 26 | + self.assertEquals(u'yztest', result['_yz_rb']) |
| 27 | + self.assertEquals(True, result.has_key('score')) |
| 28 | + self.assertEquals(True, result.has_key('user_s')) |
| 29 | + self.assertEquals(u'Z', result['user_s']) |
| 30 | + |
| 31 | + @unittest.skipUnless(RUN_YZ, 'RUN_YZ is undefined') |
| 32 | + def test_yz_get_search_index(self): |
| 33 | + index = self.client.get_search_index('yztest') |
| 34 | + self.assertEquals('yztest', index['name']) |
| 35 | + self.assertEquals('_yz_default', index['schema']) |
| 36 | + self.assertRaises(Exception, self.client.get_search_index, 'NOTyztest') |
| 37 | + |
| 38 | + @unittest.skipUnless(RUN_YZ, 'RUN_YZ is undefined') |
| 39 | + def test_yz_delete_search_index(self): |
| 40 | + testrun_yz_bucket = 'yztest' |
| 41 | + # expected to fail, since there's an attached bucket |
| 42 | + self.assertRaises(Exception, |
| 43 | + self.client.delete_search_index, testrun_yz_bucket) |
| 44 | + # detatch bucket from index then delete |
| 45 | + b = self.client.bucket(testrun_yz_bucket) |
| 46 | + b.set_property('yz_index', '') |
| 47 | + resp = self.client.delete_search_index(testrun_yz_bucket) |
| 48 | + self.assertEquals(True, resp) |
| 49 | + # create it again |
| 50 | + self.client.create_search_index(testrun_yz_bucket) |
| 51 | + b = self.client.bucket(testrun_yz_bucket) |
| 52 | + b.set_property('yz_index', testrun_yz_bucket) |
| 53 | + time.sleep(1) # wait for index to apply |
| 54 | + |
| 55 | + @unittest.skipUnless(RUN_YZ, 'RUN_YZ is undefined') |
| 56 | + def test_yz_list_search_indexes(self): |
| 57 | + indexes = self.client.list_search_indexes() |
| 58 | + self.assertEquals(1, len(indexes)) |
| 59 | + |
| 60 | + @unittest.skipUnless(RUN_YZ, 'RUN_YZ is undefined') |
| 61 | + def test_yz_create_schema(self): |
| 62 | + content = """<?xml version="1.0" encoding="UTF-8" ?> |
| 63 | + <schema name="test" version="1.5"> |
| 64 | + <fields> |
| 65 | + <field name="_yz_id" type="_yz_str" indexed="true" stored="true" required="true" /> |
| 66 | + <field name="_yz_ed" type="_yz_str" indexed="true" stored="true"/> |
| 67 | + <field name="_yz_pn" type="_yz_str" indexed="true" stored="true"/> |
| 68 | + <field name="_yz_fpn" type="_yz_str" indexed="true" stored="true"/> |
| 69 | + <field name="_yz_vtag" type="_yz_str" indexed="true" stored="true"/> |
| 70 | + <field name="_yz_node" type="_yz_str" indexed="true" stored="true"/> |
| 71 | + <field name="_yz_rk" type="_yz_str" indexed="true" stored="true"/> |
| 72 | + <field name="_yz_rb" type="_yz_str" indexed="true" stored="true"/> |
| 73 | + </fields> |
| 74 | + <uniqueKey>_yz_id</uniqueKey> |
| 75 | + <types> |
| 76 | + <fieldType name="_yz_str" class="solr.StrField" sortMissingLast="true" /> |
| 77 | + </types> |
| 78 | + </schema>""" |
| 79 | + schema_name = 'yzgoodschema' |
| 80 | + resp = self.client.create_search_schema(schema_name, content) |
| 81 | + self.assertEquals(True, resp) |
| 82 | + schema = self.client.get_search_schema(schema_name) |
| 83 | + self.assertEquals(schema_name, schema['name']) |
| 84 | + self.assertEquals(content, schema['content']) |
| 85 | + |
| 86 | + @unittest.skipUnless(RUN_YZ, 'RUN_YZ is undefined') |
| 87 | + def test_yz_create_bad_schema(self): |
| 88 | + bad_content = """ |
| 89 | + <derp nope nope, how do i computer? |
| 90 | + """ |
| 91 | + self.assertRaises(Exception, self.client.create_search_schema, |
| 92 | + 'yzbadschema', bad_content) |
| 93 | + |
| 94 | + |
| 95 | + @unittest.skipUnless(RUN_YZ, 'RUN_YZ is undefined') |
| 96 | + def test_yz_search_queries(self): |
| 97 | + bucket = self.client.bucket('yztest') |
| 98 | + bucket.new("Z", {"username_s": "Z", "name_s": "ryan", "age_i":30}).store() |
| 99 | + bucket.new("R", {"username_s": "R", "name_s": "eric", "age_i":34}).store() |
| 100 | + bucket.new("F", {"username_s": "F", "name_s": "bryan fink", "age_i":32}).store() |
| 101 | + bucket.new("H", {"username_s": "H", "name_s": "brett", "age_i":14}).store() |
| 102 | + time.sleep(1) |
| 103 | + # multiterm |
| 104 | + results = bucket.search("username_s:(F OR H)") |
| 105 | + self.assertEquals(2, len(results['docs'])) |
| 106 | + # boolean |
| 107 | + results = bucket.search("username_s:Z AND name_s:ryan") |
| 108 | + self.assertEquals(1, len(results['docs'])) |
| 109 | + # range |
| 110 | + results = bucket.search("age_i:[30 TO 33]") |
| 111 | + self.assertEquals(2, len(results['docs'])) |
| 112 | + # phrase |
| 113 | + results = bucket.search('name_s:"bryan fink"') |
| 114 | + self.assertEquals(1, len(results['docs'])) |
| 115 | + # wildcard |
| 116 | + results = bucket.search('name_s:*ryan*') |
| 117 | + self.assertEquals(2, len(results['docs'])) |
| 118 | + # regexp |
| 119 | + results = bucket.search('name_s:/br.*/') |
| 120 | + self.assertEquals(2, len(results['docs'])) |
| 121 | + # Parameters: |
| 122 | + # limit |
| 123 | + results = bucket.search('username_s:*', rows=2) |
| 124 | + self.assertEquals(2, len(results['docs'])) |
| 125 | + # sort |
| 126 | + results = bucket.search('username_s:*', sort="age_i asc") |
| 127 | + self.assertEquals(14, int(results['docs'][0]['age_i'])) |
| 128 | + |
| 129 | + @unittest.skipUnless(RUN_YZ, 'RUN_YZ is undefined') |
| 130 | + def test_yz_search_utf8(self): |
| 131 | + bucket = self.client.bucket('yztest') |
| 132 | + body = {"text_ja" : u"私はハイビスカスを食べるのが 大好き"} |
| 133 | + bucket.new("shift_jis", body).store() |
| 134 | + # TODO: fails due to lack of direct PB unicode support |
| 135 | + # results = bucket.search(u"text_ja:大好き") |
| 136 | + # self.assertEquals(1, len(results['docs'])) |
0 commit comments