2016-05-16 11 views
0

Dies ist eine Erweiterung auf diese Frage:Wie implementiert man Cassandra Counter Columns mit Phantom-dsl?

How to increment Cassandra Counter Column with phantom-dsl?

Diese Frage auch here gefragt wurde.

In Thiagos example die beiden Tabellen; ‚Songs‘ & ‚songs_by_artist‘ beide haben die gleichen Reihen, aber mit unterschiedlichen Partitionen (Primärschlüssel/Clustering Spalten)

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); 

Das bedeutet, Einfügen, Aktualisieren und über beiden Tabellen innerhalb der SongsService Arbeiten mit den gleichen Basisdaten zu löschen/Reihen.

Wie hätten Sie zum Beispiel eine Tabelle wie 'artist_songs_counts', mit den Spalten 'song_id' (K) und 'num_songs' (++) und stellen Sie sicher, dass 'SongsService' die entsprechende Zeile zu jeder Tabelle hinzufügt; 'songs' & 'songs_by_artist' & 'artist_songs_counts' (wo es verschiedene Zeilennummern gibt, aber Informationen sollten verknüpft werden, wie zum Beispiel die Künstlerinfo).

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

@flavian dies kann eine andere für Sie sein ... –

Antwort

1

SongsService erstreckt ProductionDatabaseProvider, die ein Objekt zu Ihnen gibt database genannt, wo Sie Zugriff auf Tabellen unter einer bestimmten Datenbank haben:

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

Oder noch besser, Umgang mit zwei Tabellen zur gleichen Zeit:

/** 
    * 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 
    } 

Da durch ein database Objekt können Sie auf alle Tabellen zugreifen, die zu einer bestimmten Datenbank gehört, ich würde d einen Zähler für Künstler die folgende Art und Weise implementieren:

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

Dann wird die saveOrUpdate Methode wie unten geschrieben werden könnte:

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 
    } 
Verwandte Themen