2016-05-18 45 views
0

我需要使用幻像和卡桑德拉实现通知模型的帮助。我已经做了到现在什么:幻影1.25.4与卡桑德拉

import java.util.UUID 

import com.websudos.phantom.dsl._ 
import com.websudos.phantom.connectors.Connector 
import org.joda.time.DateTime 

import scala.concurrent.Future 

case class Notification(
    id:   UUID, 
    userId:  UUID, 
    timestamp: DateTime, 
    read:   Boolean, 
    actionUser: List[String], 
    verb:   String, 
    itemId:  UUID, 
    collectionId: String 
) 

sealed class NotificationTable extends CassandraTable[NotificationTable, Notification] { 

    object id extends UUIDColumn(this) with ClusteringOrder[UUID] with Ascending 

    object userId extends StringColumn(this) with PartitionKey[String] 

    object timestamp extends DateTimeColumn(this) with ClusteringOrder[DateTime] with Descending 

    object read extends BooleanColumn(this) 

    object actionUser extends ListColumn[NotificationTable, Notification, String](this) 

    object verb extends StringColumn(this) 

    object itemId extends UUIDColumn(this) 

    object collectionId extends StringColumn(this) 

    def fromRow(row: Row): Notification = 
    Notification(
     id(row), 
     userId(row), 
     timestamp(row), 
     read(row), 
     actionUser(row), 
     verb(row), 
     itemId(row), 
     collectionId(row) 
    ) 
} 

object NotificationTable extends NotificationTable with Connector { 

    override def keySpace: String = "test" 
    implicit val keyspace: com.websudos.phantom.connectors.KeySpace = com.websudos.phantom.connectors.KeySpace("test") 
    def insertItem(item: Notification): Future[ResultSet] = 
    insert 
     .value(_.id, item.id) 
     .value(_.userId, item.userId) 
     .value(_.timestamp, item.timestamp) 
     .value(_.read, item.read) 
     .value(_.actionUser, item.actionUser) 
     .value(_.verb, item.verb) 
     .value(_.itemId, item.itemId) 
     .value(_.collectionId, item.collectionId) 
     .future() 
} 

不知怎的,我不得不定义两个keyspaces,一个用于RootConnector,一个用于insert声明。这足够接近:this example,。但是,我的代码不能编译。我知道他们在那里使用一个抽象类,因此它编译。

我的问题是我将如何去使用抽象类?我想调用另一个scala源的insert语句。

回答

2

你缺少的事实,你是为了使用,而不是RootConnector随机Connector特质的存在。该类是抽象的原因是因为它只应该在Database对象内实例化。

看一看this tutorial更多的细节,但总之,这里需要注意的RootConnector混入:

abstract class ConcreteNotificationTable extends 
    NotificationTable with RootConnector 

然后:

class MyDatabase(val connector: KeySpaceDef) extends Database(connector) { 
    // And here you inject the real session and keyspace in the table 
    object notifications extends ConcreteNotificationsTable with connector.Connector 
} 

然后,你做这样的事情:

object MyDatabase extends MyDatabase(ContactPoint.local.keySpace("my_app")) 

并从其他源文件:

val notification = Notification(id, //etc...) 
MyDatabase.notifications.insertItem(someNotification) 

甚至更​​好的分离 - 的关注,在本教程可用:

trait DbProvider extends DatabaseProvider { 
    def database: MyDatabase 
} 
trait ProductionDbProvider extends DbProvider { 
    // this would now point to your object 
    override val database = MyDatabase 
} 

然后需要一个数据库需要混入每一个地方无论是DbProvider或直接ProductionDbProvider。阅读教程了解更多细节,这不是一个超级小事,所有细节已经在那里。

+0

非常感谢。但是我在哪里可以找到适合您的图书馆的文档。例如,我不知道“ContactPoint.local”存在。同样,你的github wiki包含对'SimpleCassandraConnector'的引用,它现在已经变成'Connector' –

2

尝试:

import java.util.UUID 

import com.websudos.phantom.dsl._ 
import com.websudos.phantom.connectors.Connector 
import org.joda.time.DateTime 

import scala.concurrent.Future 

case class Notification(
    id:   UUID, 
    userId:  UUID, 
    timestamp: DateTime, 
    read:   Boolean, 
    actionUser: List[String], 
    verb:   String, 
    itemId:  UUID, 
    collectionId: String 
) 

//use normal class 
class NotificationTable extends CassandraTable[NotificationTable, Notification] { 

    object id extends UUIDColumn(this) with ClusteringOrder[UUID] with Ascending 

    object userId extends StringColumn(this) with PartitionKey[String] 

    object timestamp extends DateTimeColumn(this) with ClusteringOrder[DateTime] with Descending 

    object read extends BooleanColumn(this) 

    object actionUser extends ListColumn[NotificationTable, Notification, String](this) 

    object verb extends StringColumn(this) 

    object itemId extends UUIDColumn(this) 

    object collectionId extends StringColumn(this) 

    def fromRow(row: Row): Notification = 
    Notification(
     id(row), 
     userId(row), 
     timestamp(row), 
     read(row), 
     actionUser(row), 
     verb(row), 
     itemId(row), 
     collectionId(row) 
    ) 
} 

//use abstract 
abstract class NotificationTable extends NotificationTable with Connector { 

    def insertItem(item: Notification): Future[ResultSet] = 
    insert 
     .value(_.id, item.id) 
     .value(_.userId, item.userId) 
     .value(_.timestamp, item.timestamp) 
     .value(_.read, item.read) 
     .value(_.actionUser, item.actionUser) 
     .value(_.verb, item.verb) 
     .value(_.itemId, item.itemId) 
     .value(_.collectionId, item.collectionId) 
     .future() 
} 
+0

这编译,但我将如何从另一个来源调用插入方法???查看我的问题的最后一段 –