2016-05-16 2 views
0

Это расширение на этот вопрос:Как использовать столбцы счетчика Cassandra с 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' & '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 вы можете получить доступ ко всем таблицам, принадлежащим конкретной базе данных, I woul 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 
    }