def test_init(self):
        fts = OmeroTablesFeatureStore.FeatureTableManager(None)
        assert fts.ft_space == 'omero.features/0.1/features'
        assert fts.ann_space == 'omero.features/0.1/source'

        fts = OmeroTablesFeatureStore.FeatureTableManager(None, namespace='x')
        assert fts.ft_space == 'x/features'
        assert fts.ann_space == 'x/source'

        fts = OmeroTablesFeatureStore.FeatureTableManager(None,
                                                          ft_space='y',
                                                          ann_space='z')
        assert fts.ft_space == 'y'
        assert fts.ann_space == 'z'
    def test_create(self):
        ownerid = 123
        session = MockSession(None, None, ownerid)
        fs = MockFeatureTable(None)
        self.mox.StubOutWithMock(OmeroTablesFeatureStore, 'list_tables')
        self.mox.StubOutWithMock(OmeroTablesFeatureStore, 'new_table')
        fsname = 'fsname'
        meta = [('Float', 'f')]
        colnames = ['x1', 'x2']

        OmeroTablesFeatureStore.list_tables(session,
                                            fsname,
                                            'x/features',
                                            ownerid=ownerid).AndReturn([])

        OmeroTablesFeatureStore.new_table(session, fsname, 'x/features',
                                          'x/source', meta,
                                          colnames).AndReturn(fs)

        self.mox.ReplayAll()

        fts = OmeroTablesFeatureStore.FeatureTableManager(session,
                                                          namespace='x')
        assert fts.create(fsname, meta, colnames) == fs

        assert len(fts.fss) == 1
        assert fts.fss.get((fsname, ownerid)) == fs

        self.mox.VerifyAll()
    def test_get(self):
        uid = unwrap(self.user.getId())
        fsname1 = 'fsname-get1'
        fsname2 = 'fsname-get2'
        fts = OmeroTablesFeatureStore.FeatureTableManager(
            self.sess, ft_space=self.ft_space, ann_space=self.ann_space)

        with pytest.raises(OmeroTablesFeatureStore.NoTableMatchException):
            fts.get(fsname1)

        self.test_create(fsname1)

        fs1 = fts.get(fsname1)
        assert fs1 is not None

        assert fs1 == fts.get(fsname1)

        self.test_create(fsname2)
        fs2 = fts.get(fsname2)
        assert fs2 is not None

        assert unwrap(fs1.get_table().getOriginalFile().getId()) != unwrap(
            fs2.get_table().getOriginalFile().getId())

        fts.close()

        user2 = self.create_user_same_group()
        sess2 = self.create_client_session(user2)
        uid2 = unwrap(user2.getId())
        fts2 = OmeroTablesFeatureStore.FeatureTableManager(
            sess2, ft_space=self.ft_space, ann_space=self.ann_space)

        # Check ownerId is respected
        with pytest.raises(OmeroTablesFeatureStore.NoTableMatchException):
            fts2.get(fsname1)
        with pytest.raises(OmeroTablesFeatureStore.NoTableMatchException):
            fts2.get(fsname1, uid2)
        assert fts.get(fsname1, uid) is not None

        fts2.close()
    def test_create(self, fsname='fsname-create'):
        meta = [('Image', 'ImageID'), ('Roi', 'RoiID')]
        colnames = ('x1', 'x2')
        fts = OmeroTablesFeatureStore.FeatureTableManager(
            self.sess, ft_space=self.ft_space, ann_space=self.ann_space)
        fs = fts.create(fsname, meta, colnames)

        expected_cols = [
            omero.grid.ImageColumn('ImageID', '{"columntype": "metadata"}'),
            omero.grid.RoiColumn('RoiID', '{"columntype": "metadata"}'),
            omero.grid.DoubleArrayColumn(
                'x1,x2', '{"columntype": "multifeature"}', 2),
        ]
        h = fs.get_table().getHeaders()
        TableStoreHelper.assert_coltypes_equal(expected_cols, h)
        assert fs.feature_names() == colnames

        with pytest.raises(OmeroTablesFeatureStore.TooManyTablesException):
            fs = fts.create(fsname, meta, colnames)

        fts.close()
    def test_get(self, state):
        ownerid = 123
        session = MockSession(None, None, ownerid)
        fs = MockFeatureTable(session)
        fs.table = object()
        self.mox.StubOutWithMock(OmeroTablesFeatureStore, 'list_tables')
        self.mox.StubOutWithMock(OmeroTablesFeatureStore, 'open_table')
        fsname = 'fsname'
        fts = OmeroTablesFeatureStore.FeatureTableManager(session,
                                                          namespace='x')

        self.mox.StubOutWithMock(fts.fss, 'get')
        self.mox.StubOutWithMock(fts.fss, 'insert')

        k = (fsname, ownerid)

        if state == 'opened':
            fts.fss.get(k).AndReturn(fs)
        else:
            if state == 'unopened':
                fts.fss.get(k).AndReturn(None)
            if state == 'closed':
                fsold = MockFeatureTable(None)
                fts.fss.get(k).AndReturn(fsold)

            r = (1234, None, None, None)
            OmeroTablesFeatureStore.list_tables(session,
                                                fsname,
                                                'x/features',
                                                ownerid=ownerid).AndReturn([r])
            OmeroTablesFeatureStore.open_table(session, r[0],
                                               'x/source').AndReturn(fs)
            fts.fss.insert(k, fs)

        self.mox.ReplayAll()

        assert fts.get(fsname, ownerid) == fs
        self.mox.VerifyAll()