2016-08-09 6 views
1

各ブロックに含まれるトランザクションを格納する別のCassandraテーブルを含むようにアプリケーションを拡張しようとしています。エラー:Phantom-dsl BatchQueryオーバーロードされたメソッドで指定されていません

私は、コードスニペットを簡潔かつ関連性を保つようにしました。さらにコードコンテキストが必要な場合は、私に知らせてください。

phantomVersion = "1.22.0" cassandraVersion = "2.1.4"


私は、下記のコードで、次のコンパイルエラーを取得しています。洞察は大いに感謝します。

[error] /home/dan/projects/open-blockchain/scanner/src/main/scala/org/dyne/danielsan/openblockchain/data/database/Database.scala:30: overloaded method value add with alternatives: 
[error] (batch: com.websudos.phantom.batch.BatchQuery[_])com.websudos.phantom.batch.BatchQuery[com.websudos.phantom.builder.Unspecified] <and> 
[error] (queries: Iterator[com.websudos.phantom.builder.query.Batchable with com.websudos.phantom.builder.query.ExecutableStatement])(implicit session: com.datastax.driver.core.Session)com.websudos.phantom.batch.BatchQuery[com.websudos.phantom.builder.Unspecified] <and> 
[error] (queries: com.websudos.phantom.builder.query.Batchable with com.websudos.phantom.builder.query.ExecutableStatement*)(implicit session: com.datastax.driver.core.Session)com.websudos.phantom.batch.BatchQuery[com.websudos.phantom.builder.Unspecified] <and> 
[error] (query: com.websudos.phantom.builder.query.Batchable with com.websudos.phantom.builder.query.ExecutableStatement)(implicit session: com.datastax.driver.core.Session)com.websudos.phantom.batch.BatchQuery[com.websudos.phantom.builder.Unspecified] 
[error] cannot be applied to (scala.concurrent.Future[com.datastax.driver.core.ResultSet]) 
[error]  .add(ChainDatabase.bt.insertNewBlockTransaction(bt)) 
[error]  ^
[error] one error found 
[error] (compile:compileIncremental) Compilation failed 
[error] Total time: 6 s, completed Aug 9, 2016 2:42:30 PM 

GenericBlockModel.scala:

case class BlockTransaction(hash: String, txid: String) 

sealed class BlockTransactionModel extends CassandraTable[BlockTransactionModel, BlockTransaction] { 

    override def fromRow(r: Row): BlockTransaction = { 
    BlockTransaction(
     hash(r), 
     txid(r) 
    ) 
    } 

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

    object txid extends StringColumn(this) with ClusteringOrder[String] with Descending 

} 

abstract class ConcreteBlockTransactionModel extends BlockTransactionModel with RootConnector { 

    override val tableName = "block_transactions" 

    def insertNewBlockTransaction(bt: BlockTransaction): Future[ResultSet] = insertNewRecord(bt).future() 

    def insertNewRecord(bt: BlockTransaction) = { 
    insert 
     .value(_.hash, bt.hash) 
     .value(_.txid, bt.txid) 
    } 
} 

Database.scala

class Database(val keyspace: KeySpaceDef) extends DatabaseImpl(keyspace) { 

    def insertBlock(block: Block) = { 
    Batch.logged 
     .add(ChainDatabase.block.insertNewRecord(block)) 
     .future() 
    } 

    def insertTransaction(tx: Transaction) = { 
    Batch.logged 
     .add(ChainDatabase.tx.insertNewTransaction(tx)) 
     .future() 
    } 

    def insertBlockTransaction(bt: BlockTransaction) = { 
    Batch.logged 
     .add(ChainDatabase.btx.insertNewBlockTransaction(bt)) 
     .future() 
    } 

    object block extends ConcreteBlocksModel with keyspace.Connector 

    object tx extends ConcreteTransactionsModel with keyspace.Connector 

    object btx extends ConcreteBlockTransactionsModel with keyspace.Connector 


} 

object ChainDatabase extends Database(Config.keySpaceDefinition) 

答えて

2

エラーは、あなたがBatchFutureを追加しようとしていることを明らかにされBatchにクエリが必要です。既にクエリをトリガした場合は、クエリをもう一度実行することはできませんので、一歩前に停止する必要があります。代わりに、それは保証するために使用され、カサンドラでbatchを並列挿入を行うために使用されていない別のノートで

Batch.logged.add(insertNewRecord(record1) 
.add(insertNewRecord(record2)) 
// etc 

def insertNewRecord(
    bt: BlockTransaction 
): InsertQuery.Default[BlockTransactionModel, BlockTransaction] = { 
    insert 
    .value(_.hash, bt.hash) 
    .value(_.txid, bt.txid) 
} 

今、あなたがバッチに複数のレコードを追加することができます:ここではどのようです通常のパラレルインサートよりも少なくとも30%遅くなります。詳細はthisをご覧ください。

あなたは、単に、同時により多くのものを挿入したい場合、あなたはこのように将来を返すメソッドを使用することができます。

def insertMany(
    list: List[BlockTransaction] 
): Future[List[ResultSet]] = { 
    Future.sequence(list.map(insertNewRecord(_).future())) 
} 
+0

バッチは、マルチパーティション操作のために遅いです。 https://inoio.de/blog/2016/01/13/cassandra-to-batch-or-not-to-batch/も参照してください。 – mmatloka

関連する問題