【问题标题】:Phantom 1.25.4 with Cassandra幻影 1.25.4 与 Cassandra
【发布时间】:2016-09-14 20:14:25
【问题描述】:

我在使用 phantom 和 cassandra 实现通知模型方面需要帮助。到目前为止我做了什么:

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 源调用插入语句。

【问题讨论】:

    标签: scala cassandra phantom-dsl


    【解决方案1】:

    您错过了一个事实,即您应该在那里使用 RootConnector 而不是随机的 Connector 特征。该类之所以是抽象的,是因为它只能在 Database 对象内实例化。

    查看this tutorial 了解更多详情,但简而言之,请注意此处的RootConnector mixin:

    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。阅读教程了解更多细节,这不是一个超级琐碎的话题,所有细节都已经存在。

    【讨论】:

    • 非常感谢。但是我在哪里可以找到适合您图书馆的文档。例如,我不知道 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()
    }
    

    【讨论】:

    • 这编译,但我怎么会从另一个来源调用插入方法???请参阅我的问题的最后一段
    猜你喜欢
    • 2021-04-24
    • 2015-09-01
    • 2016-11-09
    • 2019-04-23
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    相关资源
    最近更新 更多