Add test cases of default value (#24891)

Signed-off-by: nico <cheng.yuan@zilliz.com>
pull/24998/head
nico 2023-06-19 15:44:41 +08:00 committed by GitHub
parent e2782692f1
commit 6b75b8465f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 320 additions and 0 deletions

View File

@ -1796,6 +1796,50 @@ class TestCreateCollectionInvalid(TestcaseBase):
check_items={ct.err_code: 1,
ct.err_msg: "default value type mismatches field schema type"})
@pytest.mark.tags(CaseLabel.L2)
def test_create_collection_with_pk_field_using_default_value(self):
"""
target: test create collection with pk field using default value
method: create a pk field and set default value
expected: report error
"""
# 1. pk int64
fields = [
cf.gen_int64_field(name='pk', is_primary=True, default_value=np.int64(1)),
cf.gen_float_vec_field(), cf.gen_string_field(max_length=2)
]
schema = cf.gen_collection_schema(fields)
collection_w = self.init_collection_wrap(schema=schema)
collection_w.insert([[], [vectors[0]], ["a"]],
check_task=CheckTasks.err_res,
check_items={ct.err_code: 1,
ct.err_msg: "pk field schema can not set default value"})
# 2. pk string
fields = [
cf.gen_string_field(name='pk', is_primary=True, default_value="a"),
cf.gen_float_vec_field(), cf.gen_string_field(max_length=2)
]
schema = cf.gen_collection_schema(fields)
collection_w = self.init_collection_wrap(schema=schema)
collection_w.insert([[], [vectors[0]], ["a"]],
check_task=CheckTasks.err_res,
check_items={ct.err_code: 1,
ct.err_msg: "pk field schema can not set default value"})
@pytest.mark.tags(CaseLabel.L2)
def test_create_collection_with_json_field_using_default_value(self):
"""
target: test create collection with json field using default value
method: create a json field and set default value
expected: report error
"""
json_default_value = {"number": 1, "float": 2.0, "string": "abc", "bool": True,
"list": [i for i in range(5)]}
cf.gen_json_field(default_value=json_default_value,
check_task=CheckTasks.err_res,
check_items={ct.err_code: 1,
ct.err_msg: "Default value unsupported data type: 999"})
class TestDropCollection(TestcaseBase):
"""

View File

@ -916,6 +916,28 @@ class TestInsertOperation(TestcaseBase):
assert collection_w.num_entities == ct.default_nb
collection_w.insert(data1)
@pytest.mark.tags(CaseLabel.L2)
def test_insert_dataframe_using_default_value(self):
"""
target: test insert with dataframe
method: insert with invalid dataframe
expected: insert successfully
"""
fields = [cf.gen_int64_field(is_primary=True), cf.gen_float_field(),
cf.gen_string_field(default_value="abc"), cf.gen_float_vec_field()]
schema = cf.gen_collection_schema(fields)
collection_w = self.init_collection_wrap(schema=schema)
vectors = cf.gen_vectors(ct.default_nb, ct.default_dim)
# None/[] is not allowed when using dataframe
# To use default value, delete the whole item
df = pd.DataFrame({
"int64": pd.Series(data=[i for i in range(0, ct.default_nb)]),
"float_vector": vectors,
"float": pd.Series(data=[float(i) for i in range(ct.default_nb)], dtype="float32")
})
collection_w.insert(df)
assert collection_w.num_entities == ct.default_nb
class TestInsertAsync(TestcaseBase):
"""
@ -1160,6 +1182,42 @@ class TestInsertInvalid(TestcaseBase):
"status = StatusCode.RESOURCE_EXHAUSTED"}
collection_w.insert(data=data, check_task=CheckTasks.err_res, check_items=error)
@pytest.mark.tags(CaseLabel.L2)
@pytest.mark.parametrize("default_value", [[], None])
def test_insert_array_using_default_value(self, default_value):
"""
target: test insert with array
method: insert with invalid array
expected: raise exception
"""
fields = [cf.gen_int64_field(is_primary=True), cf.gen_float_field(),
cf.gen_string_field(default_value="abc"), cf.gen_float_vec_field()]
schema = cf.gen_collection_schema(fields)
collection_w = self.init_collection_wrap(schema=schema)
vectors = cf.gen_vectors(ct.default_nb, ct.default_dim)
data = [{"int64": 1, "float_vector": vectors[1], "varchar": default_value, "float": np.float32(1.0)}]
collection_w.insert(data, check_task=CheckTasks.err_res,
check_items={ct.err_code: 1, ct.err_msg: "Field varchar don't match in entities[0]"})
@pytest.mark.tags(CaseLabel.L2)
@pytest.mark.parametrize("default_value", [[], None])
def test_insert_tuple_using_default_value(self, default_value):
"""
target: test insert with tuple
method: insert with invalid tuple
expected: insert successfully
"""
fields = [cf.gen_int64_field(is_primary=True), cf.gen_float_vec_field(),
cf.gen_string_field(), cf.gen_float_field(default_value=np.float32(3.14))]
schema = cf.gen_collection_schema(fields)
collection_w = self.init_collection_wrap(schema=schema)
vectors = cf.gen_vectors(ct.default_nb, ct.default_dim)
int_values = [i for i in range(0, ct.default_nb)]
string_values = ["abc" for i in range(ct.default_nb)]
data = (int_values, vectors, string_values, default_value)
collection_w.insert(data, check_task=CheckTasks.err_res,
check_items={ct.err_code: 1, ct.err_msg: "Field varchar don't match in entities[0]"})
class TestInsertInvalidBinary(TestcaseBase):
"""
@ -1635,6 +1693,102 @@ class TestUpsertValid(TestcaseBase):
res = collection_w.query(expr="", output_fields=["count(*)"])[0]
assert res[0]["count(*)"] == upsert_nb * 10 - step * 9
@pytest.mark.tags(CaseLabel.L1)
@pytest.mark.parametrize("default_value", [[], None])
def test_upsert_one_field_using_default_value(self, default_value):
"""
target: test insert with one field using default value
method: 1. create a collection with one field using default value
2. insert using []/None to replace the field value
expected: insert successfully
"""
fields = [cf.gen_int64_field(is_primary=True), cf.gen_float_field(),
cf.gen_string_field(default_value="abc"), cf.gen_float_vec_field()]
schema = cf.gen_collection_schema(fields)
collection_w = self.init_collection_wrap(schema=schema)
cf.insert_data(collection_w, with_json=False)
data = [
[i for i in range(ct.default_nb)],
[np.float32(i) for i in range(ct.default_nb)],
default_value,
cf.gen_vectors(ct.default_nb, ct.default_dim)
]
collection_w.upsert(data)
@pytest.mark.tags(CaseLabel.L1)
@pytest.mark.parametrize("default_value", [[], None])
def test_upsert_multi_fields_using_default_value(self, default_value):
"""
target: test insert with multi fields using default value
method: 1. default value fields before vector, insert [], None, fail
2. default value fields all after vector field, insert empty, succeed
expected: report error and insert successfully
"""
# 1. default value fields before vector, insert [], None, fail
fields = [
cf.gen_int64_field(is_primary=True),
cf.gen_float_field(default_value=np.float32(1.0)),
cf.gen_string_field(default_value="abc"),
cf.gen_float_vec_field()
]
schema = cf.gen_collection_schema(fields)
collection_w = self.init_collection_wrap(schema=schema)
cf.insert_data(collection_w, with_json=False)
data = [
[i for i in range(ct.default_nb)],
default_value,
# if multi default_value fields before vector field, every field must use []/None
cf.gen_vectors(ct.default_nb, ct.default_dim)
]
collection_w.upsert(data,
check_task=CheckTasks.err_res,
check_items={ct.err_code: 1,
ct.err_msg: "The data type of field varchar doesn't match"})
# 2. default value fields all after vector field, insert empty, succeed
fields = [
cf.gen_int64_field(is_primary=True),
cf.gen_float_vec_field(),
cf.gen_float_field(default_value=np.float32(1.0)),
cf.gen_string_field(default_value="abc")
]
schema = cf.gen_collection_schema(fields)
collection_w = self.init_collection_wrap(schema=schema)
data = [
[i for i in range(ct.default_nb)],
cf.gen_vectors(ct.default_nb, ct.default_dim)
]
data1 = [
[i for i in range(ct.default_nb)],
cf.gen_vectors(ct.default_nb, ct.default_dim),
[np.float32(i) for i in range(ct.default_nb)]
]
collection_w.upsert(data)
assert collection_w.num_entities == ct.default_nb
collection_w.upsert(data1)
@pytest.mark.tags(CaseLabel.L2)
def test_upsert_dataframe_using_default_value(self):
"""
target: test upsert with dataframe
method: upsert with invalid dataframe
expected: upsert successfully
"""
fields = [cf.gen_int64_field(is_primary=True), cf.gen_float_field(),
cf.gen_string_field(default_value="abc"), cf.gen_float_vec_field()]
schema = cf.gen_collection_schema(fields)
collection_w = self.init_collection_wrap(schema=schema)
vectors = cf.gen_vectors(ct.default_nb, ct.default_dim)
# None/[] is not allowed when using dataframe
# To use default value, delete the whole item
df = pd.DataFrame({
"int64": pd.Series(data=[i for i in range(0, ct.default_nb)]),
"float_vector": vectors,
"float": pd.Series(data=[float(i) for i in range(ct.default_nb)], dtype="float32")
})
collection_w.upsert(df)
assert collection_w.num_entities == ct.default_nb
class TestUpsertInvalid(TestcaseBase):
""" Invalid test case of Upsert interface """
@ -1800,3 +1954,39 @@ class TestUpsertInvalid(TestcaseBase):
data = [[np.float32(i) for i in range(ct.default_nb)], [str(i) for i in range(ct.default_nb)],
float_vec_values]
collection_w.upsert(data=data, check_task=CheckTasks.err_res, check_items=error)
@pytest.mark.tags(CaseLabel.L2)
@pytest.mark.parametrize("default_value", [[], None])
def test_upsert_array_using_default_value(self, default_value):
"""
target: test upsert with array
method: upsert with invalid array
expected: raise exception
"""
fields = [cf.gen_int64_field(is_primary=True), cf.gen_float_field(),
cf.gen_string_field(default_value="abc"), cf.gen_float_vec_field()]
schema = cf.gen_collection_schema(fields)
collection_w = self.init_collection_wrap(schema=schema)
vectors = cf.gen_vectors(ct.default_nb, ct.default_dim)
data = [{"int64": 1, "float_vector": vectors[1], "varchar": default_value, "float": np.float32(1.0)}]
collection_w.upsert(data, check_task=CheckTasks.err_res,
check_items={ct.err_code: 1, ct.err_msg: "Field varchar don't match in entities[0]"})
@pytest.mark.tags(CaseLabel.L2)
@pytest.mark.parametrize("default_value", [[], None])
def test_upsert_tuple_using_default_value(self, default_value):
"""
target: test upsert with tuple
method: upsert with invalid tuple
expected: upsert successfully
"""
fields = [cf.gen_int64_field(is_primary=True), cf.gen_float_field(default_value=np.float32(3.14)),
cf.gen_string_field(), cf.gen_float_vec_field()]
schema = cf.gen_collection_schema(fields)
collection_w = self.init_collection_wrap(schema=schema)
vectors = cf.gen_vectors(ct.default_nb, ct.default_dim)
int_values = [i for i in range(0, ct.default_nb)]
string_values = ["abc" for i in range(ct.default_nb)]
data = (int_values, default_value, string_values, vectors)
collection_w.upsert(data, check_task=CheckTasks.err_res,
check_items={ct.err_code: 1, ct.err_msg: "Field varchar don't match in entities[0]"})

View File

@ -1578,6 +1578,46 @@ class TestQueryOperation(TestcaseBase):
collection_w.query(f'{ct.default_int64_field_name} in [1]',
check_task=CheckTasks.check_query_results, check_items={exp_res: res})
@pytest.mark.tags(CaseLabel.L2)
def test_query_using_all_types_of_default_value(self):
"""
target: test create collection with default_value
method: create a schema with all fields using default value and query
expected: query results are as expected
"""
fields = [
cf.gen_int64_field(name='pk', is_primary=True),
cf.gen_float_vec_field(),
cf.gen_int8_field(default_value=np.int8(8)),
cf.gen_int16_field(default_value=np.int16(16)),
cf.gen_int32_field(default_value=np.int32(32)),
cf.gen_int64_field(default_value=np.int64(64)),
cf.gen_float_field(default_value=np.float32(3.14)),
cf.gen_double_field(default_value=np.double(3.1415)),
cf.gen_bool_field(default_value=False),
cf.gen_string_field(default_value="abc")
]
schema = cf.gen_collection_schema(fields)
collection_w = self.init_collection_wrap(schema=schema)
data = [
[i for i in range(ct.default_nb)],
cf.gen_vectors(ct.default_nb, ct.default_dim)
]
collection_w.insert(data)
collection_w.create_index(ct.default_float_vec_field_name)
collection_w.load()
expr = "pk in [0, 1]"
res = collection_w.query(expr, output_fields=["*"])[0][0]
log.info(res)
assert res[ct.default_int8_field_name] == 8
assert res[ct.default_int16_field_name] == 16
assert res[ct.default_int32_field_name] == 32
assert res[ct.default_int64_field_name] == 64
assert res[ct.default_float_field_name] == np.float32(3.14)
assert res[ct.default_double_field_name] == 3.1415
assert res[ct.default_bool_field_name] is False
assert res[ct.default_string_field_name] == "abc"
class TestQueryString(TestcaseBase):
"""

View File

@ -3912,6 +3912,52 @@ class TestCollectionSearch(TestcaseBase):
t.join()
assert [res1[i].ids for i in range(nq)] == [res2[i].ids for i in range(nq)]
@pytest.mark.tags(CaseLabel.L2)
def test_search_using_all_types_of_default_value(self, auto_id):
"""
target: test create collection with default_value
method: create a schema with all fields using default value and search
expected: search results are as expected
"""
fields = [
cf.gen_int64_field(name='pk', is_primary=True),
cf.gen_float_vec_field(),
cf.gen_int8_field(default_value=numpy.int8(8)),
cf.gen_int16_field(default_value=numpy.int16(16)),
cf.gen_int32_field(default_value=numpy.int32(32)),
cf.gen_int64_field(default_value=numpy.int64(64)),
cf.gen_float_field(default_value=numpy.float32(3.14)),
cf.gen_double_field(default_value=numpy.double(3.1415)),
cf.gen_bool_field(default_value=False),
cf.gen_string_field(default_value="abc")
]
schema = cf.gen_collection_schema(fields, auto_id=auto_id)
collection_w = self.init_collection_wrap(schema=schema)
data = [
[i for i in range(ct.default_nb)],
cf.gen_vectors(ct.default_nb, ct.default_dim)
]
if auto_id:
del data[0]
collection_w.insert(data)
collection_w.create_index(field_name, default_index_params)
collection_w.load()
res = collection_w.search(vectors[:1], default_search_field, default_search_params,
default_limit, default_search_exp,
output_fields=["*"],
check_task=CheckTasks.check_search_results,
check_items={"nq": 1,
"limit": default_limit})[0]
res = res[0][0].entity._row_data
assert res[ct.default_int8_field_name] == 8
assert res[ct.default_int16_field_name] == 16
assert res[ct.default_int32_field_name] == 32
assert res[ct.default_int64_field_name] == 64
assert res[ct.default_float_field_name] == numpy.float32(3.14)
assert res[ct.default_double_field_name] == 3.1415
assert res[ct.default_bool_field_name] is False
assert res[ct.default_string_field_name] == "abc"
class TestSearchBase(TestcaseBase):
@pytest.fixture(