DesmondHui
DesmondHui

Reputation: 11

Can't make schema into cassandra using phantom-dsl

Trying to create a schema into cassandra using phantom-dsl for unit testing following this tutorial:

http://outworkers.com/blog/post/phantom-tips-3-understanding-phantom-connectors

I ran into this issue when trying to auto-generate schema

[ERROR] /home/.../test/BaseCassandraSpec.scala:54: error: not enough arguments for method autocreate: (keySpace: com.websudos.phantom.connectors.KeySpace)
com.websudos.phantom.builder.query.CreateQuery.Default[com.neruti.db.models.ConcreteUserModel,com.neruti.User].
[ERROR] Unspecified value parameter keySpace.
[ERROR] Await.result(database.userModel.autocreate().future(),10.seconds)

Any advice?

Currently using version 1.29.6

BaseCassandraSpec

import com.neruti.User
import com.neruti.db.models._
import com.neruti.db.databases._
import com.neruti.db.services._
import com.neruti.db.Connector._    
import org.scalatest._
import org.scalatest.{BeforeAndAfterAll,FlatSpec,Matchers,ShouldMatchers}
import org.scalatest.concurrent.ScalaFutures
import org.scalamock.scalatest.MockFactory
import scala.concurrent.duration._
import scala.concurrent.{Await, Future}
import scala.concurrent.ExecutionContext.Implicits.global

 override protected def beforeAll(): Unit = {
    Await.result(database.userModel.autocreate().future(),10.seconds)
   } 

Database

class UserDatabase (val connector: KeySpaceDef){
  object userModel extends ConcreteUserModel with connector.Connector
}

object ProductionDb extends UserDatabase(connector)

trait ProductionDatabaseProvider {
  def database: UserDatabase
}

trait ProductionDatabase extends ProductionDatabaseProvider {
  override val database = ProductionDb
}

object testDB extends UserDatabase(testConnector)

trait testDatabaseProvider {
  def database: UserDatabase
}

trait testDatabase extends testDatabaseProvider{
  override val database = testDB
}

Connector

package com.neruti.db

import com.neruti.db.models._

import com.websudos.phantom.database.Database
import com.websudos.phantom.connectors.ContactPoints
import com.websudos.phantom.dsl.KeySpaceDef

object Connector {



    // TODO: these key value pairs shld get from HOCON config file
      val host= Seq("127.0.0.1")
      val port = 9042
      val keySpace: String = "nrt_entities"
      //  val inet = InetAddress.getByName

      lazy val connector = ContactPoints(host,port).withClusterBuilder(
        _.withCredentials("dev", "nrtDev1989")
      ).keySpace(keySpace)

      //  embedded cassandra is not supported anymore.  Check phantom-sbt.
      //    lazy val testConnector: KeySpaceDef = ContactPoint.embedded.keySpace(keySpace)
      lazy val testConnector: KeySpaceDef = ContactPoints(host,port).noHeartbeat().keySpace(keySpace)
    }

Upvotes: 0

Views: 424

Answers (1)

flavian
flavian

Reputation: 28511

I would upgrade to phantom 2.0.0 as a side note. Next, there are many things to improve in your code, starting with capitalisation of the traits.

You should use database.create or database.createAsync, which no longer require you to re-pass the implicit keyspace or session. Bear in mind this API is version 2.1.1 of phantom-dsl, available on Maven Central.

package com.neruti.db

import com.neruti.db.models._

import com.outworkers.phantom.connectors.ContactPoints
import com.outworkers.phantom.dsl._

object Connector {



    // TODO: these key value pairs shld get from HOCON config file
      val host= Seq("127.0.0.1")
      val port = 9042
      val keySpace: String = "nrt_entities"
      //  val inet = InetAddress.getByName

      lazy val connector = ContactPoints(host,port).withClusterBuilder(
        _.withCredentials("dev", "nrtDev1989")
      ).keySpace(keySpace)

      lazy val testConnector: KeySpaceDef = ContactPoints(host, port).noHeartbeat().keySpace(keySpace)
    }


class MyDb(override val connector: CassandraConnection) extends Database(connector) {
  ... tables
}

object TestMyDb extends MyDb(Connector.testConnector)

import com.outworkers.phantom.dsl.context
// Now this will only require an execution context, nothing more
TestMyDb.create()

Upvotes: 0

Related Questions