mirror of https://github.com/milvus-io/milvus.git
Add test cases of default value (#24891)
Signed-off-by: nico <cheng.yuan@zilliz.com>pull/24998/head
parent
e2782692f1
commit
6b75b8465f
|
@ -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):
|
||||
"""
|
||||
|
|
|
@ -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]"})
|
||||
|
|
|
@ -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):
|
||||
"""
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue