2016-02-29 75 views
1

在卡桑德拉的模式我写了这个代码创建使用幻影斯卡拉DSL

case class User(id: Int, gender: String, age: Int, occupation: String, zipCode: String) 

object Defaults { 
    val hosts = Seq("172.17.0.9") 
    val Connector = ContactPoints(hosts).keySpace("Movies") 
} 

class MyDatabase(val keyspace: KeySpaceDef) extends com.websudos.phantom.db.DatabaseImpl(keyspace) { 
    object users extends Users with keyspace.Connector 
} 

object MyDatabase extends MyDatabase(Defaults.Connector) 
class Users extends CassandraTable[Users, User] { 
    object id extends IntColumn(this) with PartitionKey[Int] 
    object age extends IntColumn(this) with Index[Int] 
    object gender extends StringColumn(this) with Index[String] 
    object occupation extends StringColumn(this) with Index[String] 
    object zipCode extends StringColumn(this) with Index[String] 

    def fromRow(row: Row) : User = { 
    User(
     row(id), 
     row(gender), 
     row(age), 
     row(occupation), 
     row(zipCode) 
    ) 
    } 
} 

object Users extends Users with RootConnector { 
    def store(user: User) : Future[ResultSet] = { 
    insert 
     .value(_.id, user.id) 
     .value(_.gender, user.gender) 
     .value(_.age, user.age) 
     .value(_.occupation, user.occupation) 
     .value(_.zipCode, user.zipCode) 
     .consistencyLevel_=(ConsistencyLevel.ALL) 
     .future() 
    } 

    def getById(id: Int) : Future[Option[User]] = { 
    select.where(_.id eqs id).one() 
    } 
} 

但是,当我编译此,我得到一个错误。

Object creation impossible, since member session: Session in 
com.websudos.phantom.connectors.RootConnector is not defined; member space: 
KeySpace in com.websudos.phantom.connectors.RootConnector is not defined. 

我也看到其他错误

[error] /Users/U/MyProjects/src/main/scala-2.11/com/abhi/MovieLensDataPreperation.scala:180: com.websudos.phantom.dsl.Row does not take parameters 
[error]  row(id), 
[error]  ^
[error] /Users/U/MyProjects/src/main/scala-2.11/com/abhi/MovieLensDataPreperation.scala:181: com.websudos.phantom.dsl.Row does not take parameters 
[error]  row(gender), 
[error]  ^
[error] /Users/U/MyProjects/src/main/scala-2.11/com/abhi/MovieLensDataPreperation.scala:182: com.websudos.phantom.dsl.Row does not take parameters 
[error]  row(age), 
[error]  ^
[error] /Users/U/MyProjects/src/main/scala-2.11/com/abhi/MovieLensDataPreperation.scala:183: com.websudos.phantom.dsl.Row does not take parameters 
[error]  row(occupation), 
[error]  ^
[error] /Users/U/MyProjects/src/main/scala-2.11/com/abhi/MovieLensDataPreperation.scala:184: com.websudos.phantom.dsl.Row does not take parameters 
[error]  row(zipCode) 
[error]  ^
[error] 5 errors found 
[error] (compile:compileIncremental) Compilation failed 
+1

我认为你应该再次阅读我的教程,你没有按照DSL的结构,你没有提供一个会议,你应该。你也没有使用'Database'实现,这真的很有帮助。小的事情,但通过这将帮助你加快速度。你的'用户'对象应该是一个名为'ConcreteUsers'的类,这就是'MyDatabase'下''用户'字段应该扩展的东西,否则你将没有任何方法。 http://websudos.com/blog/post/a-series-on-phantom-part-1-getting-started-with-phantom – flavian

+0

谢谢Flavian。我改变了我的实现基于这里的代码https://github.com/thiagoandrade6/cassandra-phantom/blob/master/src/main/scala/com/cassandra/phantom/modeling/model/GenericSongsModel.scala现在它更好。不过,我还有另一个劫持。 http://stackoverflow.com/questions/35692508/creating-model-for-cassandra-using-phantom-dsl –

+0

我也回答了一个。 – flavian

回答

1

既然你已经定义ID,性别,年龄等栏目,你应该从一排这样的提取值:

def fromRow(row: Row) : User = { 
    User(
    id(row), 
    gender(row), 
    age(row), 
    occupation(row), 
    zipCode(row) 
) 
}