예제 #1
0
    def test_partition_max_description_length(self):
        """
        target: verify create a partition with 255 length name and 1024 length description
        method: 1. create a partition with 255 length name and 1024 length description
        expected: 1. create successfully
        """
        # create collection
        collection_w = self.init_collection_wrap()

        # init partition
        partition_name = cf.gen_str_by_length(255)
        description = cf.gen_str_by_length(2048)
        self.init_partition_wrap(collection_w, partition_name,
                                 description=description,
                                 check_task=CheckTasks.check_partition_property,
                                 check_items={"name": partition_name, "description": description,
                                              "is_empty": True}
                                 )
예제 #2
0
    def test_partition_maxlength_name(self):
        """
        target: verify create a partition with maxlength(256) name
        method: 1. create a partition with max length names
        expected: 1. raise exception
        """
        # create collection
        collection_w = self.init_collection_wrap()

        # create partition
        partition_name = cf.gen_str_by_length(256)
        self.partition_wrap.init_partition(collection_w.collection, partition_name,
                                           check_task=CheckTasks.err_res,
                                           check_items={ct.err_code: 1, 'err_msg': "is illegal"}
                                           )
예제 #3
0
class TestPartitionParams(TestcaseBase):
    """ Test case of partition interface in parameters"""
    @pytest.mark.tags(CaseLabel.L0)
    @pytest.mark.parametrize(
        "partition_name, description",
        [(cf.gen_unique_str(prefix), cf.gen_unique_str("desc_"))])
    def test_partition_default(self, partition_name, description):
        """
        target: verify create a partition
        method: 1. create a partition
        expected: 1. create successfully
        """
        # create collection
        collection_w = self.init_collection_wrap()

        # create partition
        self.init_partition_wrap(
            collection_w,
            partition_name,
            description=description,
            check_task=CheckTasks.check_partition_property,
            check_items={
                "name": partition_name,
                "description": description,
                "is_empty": True,
                "num_entities": 0
            })

        # check that the partition has been created
        assert collection_w.has_partition(partition_name)[0]

    @pytest.mark.tags(CaseLabel.L1)
    @pytest.mark.xfail(reason="issue #5375")
    @pytest.mark.parametrize("partition_name", [""])
    def test_partition_empty_name(self, partition_name):
        """
        target: verify create a partition with empyt name
        method: 1. create a partition empty none name
        expected: 1. raise exception
        """
        # create a collection
        collection_w = self.init_collection_wrap()

        # create partition
        self.partition_wrap.init_partition(
            collection_w.collection,
            partition_name,
            check_task=CheckTasks.err_res,
            check_items={
                ct.err_code: 1,
                ct.err_msg: "Partition name should not be empty"
            })

    @pytest.mark.tags(CaseLabel.L1)
    @pytest.mark.parametrize("partition_name, description",
                             [(cf.gen_unique_str(prefix), "")])
    def test_partition_empty_description(self, partition_name, description):
        """
        target: verify create a partition with empty description
        method: 1. create a partition with empty description
        expected: 1. create successfully
        """
        # create collection
        collection_w = self.init_collection_wrap()

        # init partition
        self.init_partition_wrap(
            collection_w,
            partition_name,
            description=description,
            check_task=CheckTasks.check_partition_property,
            check_items={
                "name": partition_name,
                "description": description,
                "is_empty": True,
                "num_entities": 0
            })

        # check that the partition has been created
        assert collection_w.has_partition(partition_name)[0]

    @pytest.mark.tags(CaseLabel.L1)
    @pytest.mark.parametrize(
        "partition_name, description",
        [(cf.gen_str_by_length(255), cf.gen_str_by_length(2048))])
    def test_partition_max_description_length(self, partition_name,
                                              description):
        """
        target: verify create a partition with 255 length name and 1024 length description
        method: 1. create a partition with 255 length name and 1024 length description
        expected: 1. create successfully
        """
        # create collection
        collection_w = self.init_collection_wrap()

        # init partition
        self.init_partition_wrap(
            collection_w,
            partition_name,
            description=description,
            check_task=CheckTasks.check_partition_property,
            check_items={
                "name": partition_name,
                "description": description,
                "is_empty": True
            })

    @pytest.mark.tags(CaseLabel.L1)
    @pytest.mark.parametrize("collection_name, partition_name, description", [
        (cf.gen_unique_str(), cf.gen_unique_str(prefix), cf.gen_unique_str())
    ])
    def test_partition_dup_name(self, collection_name, partition_name,
                                description):
        """
        target: verify create partitions with duplicate name
        method: 1. create partitions with duplicate name
        expected: 1. create successfully
                  2. the same partition returned with diff object id
        """
        # create a collection
        collection_w = self.init_collection_wrap()

        # create two partitions
        partition_w1 = self.init_partition_wrap(collection_w, partition_name,
                                                description)
        partition_w2 = self.init_partition_wrap(collection_w, partition_name,
                                                description)

        # public check func to be extracted
        assert id(partition_w1.partition) != id(partition_w2.partition)
        assert partition_w1.name == partition_w2.name
        assert partition_w1.description == partition_w2.description

    @pytest.mark.tags(CaseLabel.L1)
    @pytest.mark.parametrize("description", ct.get_invalid_strs)
    @pytest.mark.parametrize("partition_name", [cf.gen_unique_str(prefix)])
    def test_partition_special_chars_description(self, partition_name,
                                                 description):
        """
        target: verify create a partition with special characters in description
        method: 1. create a partition with special characters in description
        expected: 1. create successfully
        """
        # create collection
        collection_w = self.init_collection_wrap()

        # create partition
        self.init_partition_wrap(
            collection_w,
            partition_name,
            description=description,
            check_task=CheckTasks.check_partition_property,
            check_items={
                "name": partition_name,
                "description": description,
                "is_empty": True,
                "num_entities": 0
            })
        assert collection_w.has_partition(partition_name)[0]

    @pytest.mark.tags(CaseLabel.L1)
    def test_partition_default_name(self):
        """
        target: verify create a partition with default name
        method: 1. get the _default partition
                2. create a partition with _default name
        expected: 1. the same partition returned
        """
        # create collection
        collection_w = self.init_collection_wrap()

        # check that the default partition exists
        assert collection_w.has_partition(ct.default_partition_name)[0]

        # check that can get the _default partition
        collection, _ = collection_w.partition(ct.default_partition_name)

        # check that init the _default partition object
        partition_w = self.init_partition_wrap(collection_w,
                                               ct.default_partition_name)
        assert collection.name == partition_w.name

    @pytest.mark.tags(CaseLabel.L1)
    @pytest.mark.parametrize("partition_name", [cf.gen_str_by_length(256)])
    def test_partition_maxlength_name(self, partition_name):
        """
        target: verify create a partition with maxlength(256) name
        method: 1. create a partition with max length names
        expected: 1. raise exception
        """
        # create collection
        collection_w = self.init_collection_wrap()

        # create partition
        self.partition_wrap.init_partition(collection_w.collection,
                                           partition_name,
                                           check_task=CheckTasks.err_res,
                                           check_items={
                                               ct.err_code: 1,
                                               'err_msg': "is illegal"
                                           })

    @pytest.mark.tags(CaseLabel.L1)
    @pytest.mark.parametrize("partition_name", ct.get_invalid_strs)
    def test_partition_invalid_name(self, partition_name):
        """
        target: verify create a partition with invalid name
        method: 1. create a partition with invalid names
        expected: 1. raise exception
        """
        # create collection
        collection_w = self.init_collection_wrap()

        # create partition
        self.partition_wrap.init_partition(collection_w.collection,
                                           partition_name,
                                           check_task=CheckTasks.err_res,
                                           check_items={
                                               ct.err_code: 1,
                                               'err_msg': "is illegal"
                                           })
        # TODO: need an error code issue #5144 and assert independently

    @pytest.mark.tags(CaseLabel.L1)
    @pytest.mark.parametrize("partition_name", [cf.gen_unique_str(prefix)])
    def test_partition_none_collection(self, partition_name):
        """
        target: verify create a partition with none collection
        method: 1. create a partition with none collection
        expected: 1. raise exception
        """
        # create partition with collection is None
        self.partition_wrap.init_partition(
            collection=None,
            name=partition_name,
            check_task=CheckTasks.err_res,
            check_items={
                ct.err_code: 1,
                ct.err_msg: "must be pymilvus_orm.Collection"
            })

    @pytest.mark.tags(CaseLabel.L1)
    @pytest.mark.parametrize("partition_name", [cf.gen_unique_str(prefix)])
    def test_partition_drop(self, partition_name):
        """
        target: verify drop a partition in one collection
        method: 1. create a partition in one collection
                2. drop the partition
        expected: 1. drop successfully
        """
        # create collection
        collection_w = self.init_collection_wrap()

        # create partition
        partition_w = self.init_partition_wrap(collection_w, partition_name)

        # check that the partition exists
        assert collection_w.has_partition(partition_name)[0]

        # drop partition
        partition_w.drop()

        # check that the partition not exists
        assert not collection_w.has_partition(partition_name)[0]

    @pytest.mark.tags(CaseLabel.L1)
    @pytest.mark.parametrize("search_vectors",
                             [cf.gen_vectors(1, ct.default_dim)])
    def test_partition_release(self, search_vectors):
        """
        target: verify release partition
        method: 1. create a collection and several partitions
                2. insert data into each partition
                3. flush and load the partitions
                4. release partition1
                5. release partition1 twice
        expected: 1. the released partition is released
                  2. the other partition is not released
        """
        # create collection
        collection_w = self.init_collection_wrap()

        # create two partitions
        partition_w1 = self.init_partition_wrap(collection_w)
        partition_w2 = self.init_partition_wrap(collection_w)

        # insert data to two partition
        partition_w1.insert(cf.gen_default_list_data())
        partition_w2.insert(cf.gen_default_list_data())

        # load two partitions
        partition_w1.load()
        partition_w2.load()

        # search two partitions
        res1, _ = partition_w1.search(
            data=search_vectors,
            anns_field=ct.default_float_vec_field_name,
            params={"nprobe": 32},
            limit=1)
        res2, _ = partition_w2.search(
            data=search_vectors,
            anns_field=ct.default_float_vec_field_name,
            params={"nprobe": 32},
            limit=1)
        assert len(res1) == 1 and len(res2) == 1

        # release the first partition
        partition_w1.release()

        # check result
        res1, _ = partition_w1.search(
            data=search_vectors,
            anns_field=ct.default_float_vec_field_name,
            params={"nprobe": 32},
            limit=1,
            check_task=ct.CheckTasks.err_res,
            check_items={
                ct.err_code: 1,
                ct.err_msg: "partitions have been released"
            })
        res2, _ = partition_w2.search(
            data=search_vectors,
            anns_field=ct.default_float_vec_field_name,
            params={"nprobe": 32},
            limit=1)
        assert len(res2) == 1

    @pytest.mark.tags(CaseLabel.L1)
    @pytest.mark.parametrize("partition_name", [cf.gen_unique_str(prefix)])
    @pytest.mark.parametrize("data, nums",
                             [(cf.gen_default_dataframe_data(10), 10),
                              (cf.gen_default_list_data(1), 1),
                              (cf.gen_default_tuple_data(10), 10)])
    def test_partition_insert(self, partition_name, data, nums):
        """
        target: verify insert multi entities by dataFrame
        method: 1. create a collection and a partition
                2. partition.insert(data)
                3. insert data again
        expected: 1. insert data successfully
        """
        # create collection
        collection_w = self.init_collection_wrap()

        # create partition
        partition_w = self.init_partition_wrap(
            collection_w,
            partition_name,
            check_task=CheckTasks.check_partition_property,
            check_items={
                "name": partition_name,
                "is_empty": True,
                "num_entities": 0
            })

        # insert data
        partition_w.insert(data)
        self._connect().flush([collection_w.name])
        assert not partition_w.is_empty
        assert partition_w.num_entities == nums

        # insert data
        partition_w.insert(data)
        self._connect().flush([collection_w.name])
        assert not partition_w.is_empty
        assert partition_w.num_entities == (nums + nums)