2016-05-16 68 views
0

這是一個擴展到這樣一個問題:如何使用phantom-dsl實現卡桑德拉計數器列?

How to increment Cassandra Counter Column with phantom-dsl?

這個問題也被要求here

Thiagos example這兩個表; 「歌曲」 &「songs_by_artist」都具有相同的行,但用不同的分區(主鍵/集羣列)

CREATE TABLE test.songs (
    song_id timeuuid PRIMARY KEY, 
    album text, 
    artist text, 
    title text 
); 

CREATE TABLE test.songs_by_artist (
    artist text, 
    song_id timeuuid, 
    album text, 
    title text, 
    PRIMARY KEY (artist, song_id) 
) WITH CLUSTERING ORDER BY (song_id ASC); 

這意味着插入,更新和跨越兩個表具有相同的基本數據刪除SongsService作品內/行。

你會舉例如'artist_songs_counts'這樣的表,其中包含'song_id'(K)和'num_songs'(++)列,並確保'SongsService'將相應的行添加到每個表中; '歌曲'&'songs_by_artist'&'artist_songs_counts'(其中有不同數量的行,但應該鏈接信息,例如藝術家信息)。

CREATE TABLE test.artist_songs_counts (
    artist text PRIMARY KEY, 
    num_songs counter); 
+0

@flavian這可能是另一個你... –

回答

1

SongsService延伸ProductionDatabaseProvider,讓你叫database,你有一定的數據庫下對錶的訪問對象:

/** 
    * Find songs by Id 
    * @param id 
    * @return 
    */ 
    def getSongById(id: UUID): Future[Option[Song]] = { 
    database.songsModel.getBySongId(id) 
    } 

甚至更​​好,同時處理兩個表:

/** 
    * Save a song in both tables 
    * 
    * @param songs 
    * @return 
    */ 
    def saveOrUpdate(songs: Song): Future[ResultSet] = { 
    for { 
     byId <- database.songsModel.store(songs) 
     byArtist <- database.songsByArtistsModel.store(songs) 
    } yield byArtist 
    } 

由於通過database對象可以訪問屬於特定數據庫的所有表,所以d落實藝術家計數器方式如下:

def increment(artist: String): Future[ResultSet] = { 
    update 
    .where(_.artist eqs artist) 
    .modify(_.numSongs += 1) 
    .future() 
} 

然後saveOrUpdate方法可以寫成如下:

def saveOrUpdate(song: Song): Future[ResultSet] = { 
    for { 
     byId <- database.songsModel.store(songs) 
     byArtist <- database.songsByArtistsModel.store(songs) 
     counter <- database.artistSongsCounter.increment(song.artist) 
    } yield byArtist 
    }