diff --git a/doc/conseil.sql b/doc/conseil.sql index 52fdc0c55..c1064ca1a 100644 --- a/doc/conseil.sql +++ b/doc/conseil.sql @@ -163,6 +163,8 @@ CREATE TABLE public.operations ( storage character varying, status character varying, consumed_gas numeric, + storage_size numeric, + paid_storage_size_diff numeric, block_hash character varying NOT NULL, block_level integer NOT NULL, "timestamp" timestamp without time zone NOT NULL diff --git a/src/main/scala/tech/cryptonomic/conseil/tezos/DatabaseConversions.scala b/src/main/scala/tech/cryptonomic/conseil/tezos/DatabaseConversions.scala index 7466b36e4..758d93d90 100644 --- a/src/main/scala/tech/cryptonomic/conseil/tezos/DatabaseConversions.scala +++ b/src/main/scala/tech/cryptonomic/conseil/tezos/DatabaseConversions.scala @@ -201,6 +201,8 @@ object DatabaseConversions { parameters = parameters.map(_.expression), status = Some(metadata.operation_result.status), consumedGas = metadata.operation_result.consumed_gas.flatMap(extractBigDecimal), + storageSize = metadata.operation_result.storage_size.flatMap(extractBigDecimal), + paidStorageSizeDiff = metadata.operation_result.paid_storage_size_diff.flatMap(extractBigDecimal), blockHash = block.data.hash.value, blockLevel = block.data.header.level, timestamp = toSql(block.data.header.timestamp) @@ -227,6 +229,8 @@ object DatabaseConversions { storage = script.map(_.storage.expression), status = Some(metadata.operation_result.status), consumedGas = metadata.operation_result.consumed_gas.flatMap(extractBigDecimal), + storageSize = metadata.operation_result.storage_size.flatMap(extractBigDecimal), + paidStorageSizeDiff = metadata.operation_result.paid_storage_size_diff.flatMap(extractBigDecimal), blockHash = block.data.hash.value, blockLevel = block.data.header.level, timestamp = toSql(block.data.header.timestamp) diff --git a/src/main/scala/tech/cryptonomic/conseil/tezos/Tables.scala b/src/main/scala/tech/cryptonomic/conseil/tezos/Tables.scala index d485d7277..de583753b 100644 --- a/src/main/scala/tech/cryptonomic/conseil/tezos/Tables.scala +++ b/src/main/scala/tech/cryptonomic/conseil/tezos/Tables.scala @@ -412,20 +412,22 @@ trait Tables { * @param storage Database column storage SqlType(varchar), Default(None) * @param status Database column status SqlType(varchar), Default(None) * @param consumedGas Database column consumed_gas SqlType(numeric), Default(None) + * @param storageSize Database column storage_size SqlType(numeric), Default(None) + * @param paidStorageSizeDiff Database column paid_storage_size_diff SqlType(numeric), Default(None) * @param blockHash Database column block_hash SqlType(varchar) * @param blockLevel Database column block_level SqlType(int4) * @param timestamp Database column timestamp SqlType(timestamp) */ - case class OperationsRow(operationId: Int, operationGroupHash: String, kind: String, level: Option[Int] = None, delegate: Option[String] = None, slots: Option[String] = None, nonce: Option[String] = None, pkh: Option[String] = None, secret: Option[String] = None, source: Option[String] = None, fee: Option[scala.math.BigDecimal] = None, counter: Option[scala.math.BigDecimal] = None, gasLimit: Option[scala.math.BigDecimal] = None, storageLimit: Option[scala.math.BigDecimal] = None, publicKey: Option[String] = None, amount: Option[scala.math.BigDecimal] = None, destination: Option[String] = None, parameters: Option[String] = None, managerPubkey: Option[String] = None, balance: Option[scala.math.BigDecimal] = None, spendable: Option[Boolean] = None, delegatable: Option[Boolean] = None, script: Option[String] = None, storage: Option[String] = None, status: Option[String] = None, consumedGas: Option[scala.math.BigDecimal] = None, blockHash: String, blockLevel: Int, timestamp: java.sql.Timestamp) + case class OperationsRow(operationId: Int, operationGroupHash: String, kind: String, level: Option[Int] = None, delegate: Option[String] = None, slots: Option[String] = None, nonce: Option[String] = None, pkh: Option[String] = None, secret: Option[String] = None, source: Option[String] = None, fee: Option[scala.math.BigDecimal] = None, counter: Option[scala.math.BigDecimal] = None, gasLimit: Option[scala.math.BigDecimal] = None, storageLimit: Option[scala.math.BigDecimal] = None, publicKey: Option[String] = None, amount: Option[scala.math.BigDecimal] = None, destination: Option[String] = None, parameters: Option[String] = None, managerPubkey: Option[String] = None, balance: Option[scala.math.BigDecimal] = None, spendable: Option[Boolean] = None, delegatable: Option[Boolean] = None, script: Option[String] = None, storage: Option[String] = None, status: Option[String] = None, consumedGas: Option[scala.math.BigDecimal] = None, storageSize: Option[scala.math.BigDecimal] = None, paidStorageSizeDiff: Option[scala.math.BigDecimal] = None, blockHash: String, blockLevel: Int, timestamp: java.sql.Timestamp) /** GetResult implicit for fetching OperationsRow objects using plain SQL queries */ implicit def GetResultOperationsRow(implicit e0: GR[Int], e1: GR[String], e2: GR[Option[Int]], e3: GR[Option[String]], e4: GR[Option[scala.math.BigDecimal]], e5: GR[Option[Boolean]], e6: GR[java.sql.Timestamp]): GR[OperationsRow] = GR{ prs => import prs._ - OperationsRow(<<[Int], <<[String], <<[String], <(r => OperationsRow(r(0).asInstanceOf[Option[Int]].get, r(1).asInstanceOf[Option[String]].get, r(2).asInstanceOf[Option[String]].get, r(3).asInstanceOf[Option[Int]], r(4).asInstanceOf[Option[String]], r(5).asInstanceOf[Option[String]], r(6).asInstanceOf[Option[String]], r(7).asInstanceOf[Option[String]], r(8).asInstanceOf[Option[String]], r(9).asInstanceOf[Option[String]], r(10).asInstanceOf[Option[scala.math.BigDecimal]], r(11).asInstanceOf[Option[scala.math.BigDecimal]], r(12).asInstanceOf[Option[scala.math.BigDecimal]], r(13).asInstanceOf[Option[scala.math.BigDecimal]], r(14).asInstanceOf[Option[String]], r(15).asInstanceOf[Option[scala.math.BigDecimal]], r(16).asInstanceOf[Option[String]], r(17).asInstanceOf[Option[String]], r(18).asInstanceOf[Option[String]], r(19).asInstanceOf[Option[scala.math.BigDecimal]], r(20).asInstanceOf[Option[Boolean]], r(21).asInstanceOf[Option[Boolean]], r(22).asInstanceOf[Option[String]], r(23).asInstanceOf[Option[String]], r(24).asInstanceOf[Option[String]], r(25).asInstanceOf[Option[scala.math.BigDecimal]], r(26).asInstanceOf[Option[String]].get, r(27).asInstanceOf[Option[Int]].get, r(28).asInstanceOf[Option[java.sql.Timestamp]].get), (_:Any) => throw new Exception("Inserting into ? projection not supported.")) + def ? = (Rep.Some(operationId) :: Rep.Some(operationGroupHash) :: Rep.Some(kind) :: level :: delegate :: slots :: nonce :: pkh :: secret :: source :: fee :: counter :: gasLimit :: storageLimit :: publicKey :: amount :: destination :: parameters :: managerPubkey :: balance :: spendable :: delegatable :: script :: storage :: status :: consumedGas :: storageSize :: paidStorageSizeDiff :: Rep.Some(blockHash) :: Rep.Some(blockLevel) :: Rep.Some(timestamp) :: HNil).shaped.<>(r => OperationsRow(r(0).asInstanceOf[Option[Int]].get, r(1).asInstanceOf[Option[String]].get, r(2).asInstanceOf[Option[String]].get, r(3).asInstanceOf[Option[Int]], r(4).asInstanceOf[Option[String]], r(5).asInstanceOf[Option[String]], r(6).asInstanceOf[Option[String]], r(7).asInstanceOf[Option[String]], r(8).asInstanceOf[Option[String]], r(9).asInstanceOf[Option[String]], r(10).asInstanceOf[Option[scala.math.BigDecimal]], r(11).asInstanceOf[Option[scala.math.BigDecimal]], r(12).asInstanceOf[Option[scala.math.BigDecimal]], r(13).asInstanceOf[Option[scala.math.BigDecimal]], r(14).asInstanceOf[Option[String]], r(15).asInstanceOf[Option[scala.math.BigDecimal]], r(16).asInstanceOf[Option[String]], r(17).asInstanceOf[Option[String]], r(18).asInstanceOf[Option[String]], r(19).asInstanceOf[Option[scala.math.BigDecimal]], r(20).asInstanceOf[Option[Boolean]], r(21).asInstanceOf[Option[Boolean]], r(22).asInstanceOf[Option[String]], r(23).asInstanceOf[Option[String]], r(24).asInstanceOf[Option[String]], r(25).asInstanceOf[Option[scala.math.BigDecimal]], r(26).asInstanceOf[Option[scala.math.BigDecimal]], r(27).asInstanceOf[Option[scala.math.BigDecimal]], r(28).asInstanceOf[Option[String]].get, r(29).asInstanceOf[Option[Int]].get, r(30).asInstanceOf[Option[java.sql.Timestamp]].get), (_:Any) => throw new Exception("Inserting into ? projection not supported.")) /** Database column operation_id SqlType(serial), AutoInc, PrimaryKey */ val operationId: Rep[Int] = column[Int]("operation_id", O.AutoInc, O.PrimaryKey) @@ -479,6 +481,10 @@ trait Tables { val status: Rep[Option[String]] = column[Option[String]]("status", O.Default(None)) /** Database column consumed_gas SqlType(numeric), Default(None) */ val consumedGas: Rep[Option[scala.math.BigDecimal]] = column[Option[scala.math.BigDecimal]]("consumed_gas", O.Default(None)) + /** Database column storage_size SqlType(numeric), Default(None) */ + val storageSize: Rep[Option[scala.math.BigDecimal]] = column[Option[scala.math.BigDecimal]]("storage_size", O.Default(None)) + /** Database column paid_storage_size_diff SqlType(numeric), Default(None) */ + val paidStorageSizeDiff: Rep[Option[scala.math.BigDecimal]] = column[Option[scala.math.BigDecimal]]("paid_storage_size_diff", O.Default(None)) /** Database column block_hash SqlType(varchar) */ val blockHash: Rep[String] = column[String]("block_hash") /** Database column block_level SqlType(int4) */ diff --git a/src/test/scala/tech/cryptonomic/conseil/tezos/DatabaseConversionsTest.scala b/src/test/scala/tech/cryptonomic/conseil/tezos/DatabaseConversionsTest.scala index 4eb8df2de..00d1cc0ba 100644 --- a/src/test/scala/tech/cryptonomic/conseil/tezos/DatabaseConversionsTest.scala +++ b/src/test/scala/tech/cryptonomic/conseil/tezos/DatabaseConversionsTest.scala @@ -329,7 +329,10 @@ class DatabaseConversionsTest converted.delegatable :: converted.script :: converted.consumedGas :: - converted.status :: Nil) { + converted.status :: + converted.storageSize :: + converted.paidStorageSizeDiff :: + Nil) { _ shouldBe 'empty } @@ -368,7 +371,10 @@ class DatabaseConversionsTest converted.delegatable :: converted.script :: converted.consumedGas :: - converted.status :: Nil) { + converted.status :: + converted.storageSize :: + converted.paidStorageSizeDiff :: + Nil) { _ shouldBe 'empty } @@ -407,7 +413,10 @@ class DatabaseConversionsTest converted.delegatable :: converted.script :: converted.consumedGas :: - converted.status :: Nil) { + converted.status :: + converted.storageSize :: + converted.paidStorageSizeDiff :: + Nil) { _ shouldBe 'empty } @@ -461,7 +470,10 @@ class DatabaseConversionsTest converted.balance :: converted.spendable :: converted.delegatable :: - converted.script :: Nil) { + converted.script :: + converted.storageSize :: + converted.paidStorageSizeDiff :: + Nil) { _ shouldBe 'empty } @@ -505,6 +517,14 @@ class DatabaseConversionsTest case Some(Decimal(bignumber)) => converted.consumedGas.value shouldBe bignumber case _ => converted.consumedGas shouldBe 'empty } + sampleTransaction.metadata.operation_result.storage_size match { + case Some(Decimal(bignumber)) => converted.storageSize.value shouldBe bignumber + case _ => converted.storageSize shouldBe 'empty + } + sampleTransaction.metadata.operation_result.paid_storage_size_diff match { + case Some(Decimal(bignumber)) => converted.paidStorageSizeDiff.value shouldBe bignumber + case _ => converted.paidStorageSizeDiff shouldBe 'empty + } forAll( converted.level :: @@ -518,7 +538,8 @@ class DatabaseConversionsTest converted.balance :: converted.spendable :: converted.delegatable :: - converted.script :: Nil) { + converted.script :: + Nil) { _ shouldBe 'empty } @@ -566,6 +587,14 @@ class DatabaseConversionsTest case Some(Decimal(bignumber)) => converted.consumedGas.value shouldBe bignumber case _ => converted.consumedGas shouldBe 'empty } + sampleOrigination.metadata.operation_result.storage_size match { + case Some(Decimal(bignumber)) => converted.storageSize.value shouldBe bignumber + case _ => converted.storageSize shouldBe 'empty + } + sampleOrigination.metadata.operation_result.paid_storage_size_diff match { + case Some(Decimal(bignumber)) => converted.paidStorageSizeDiff.value shouldBe bignumber + case _ => converted.paidStorageSizeDiff shouldBe 'empty + } forAll( converted.level :: @@ -576,7 +605,8 @@ class DatabaseConversionsTest converted.publicKey :: converted.amount :: converted.destination :: - converted.parameters :: Nil) { + converted.parameters :: + Nil) { _ shouldBe 'empty } @@ -630,7 +660,10 @@ class DatabaseConversionsTest converted.balance :: converted.spendable :: converted.delegatable :: - converted.script :: Nil) { + converted.script :: + converted.storageSize :: + converted.paidStorageSizeDiff :: + Nil) { _ shouldBe 'empty } @@ -669,7 +702,10 @@ class DatabaseConversionsTest converted.delegatable :: converted.script :: converted.status :: - converted.consumedGas :: Nil) { + converted.consumedGas :: + converted.storageSize :: + converted.paidStorageSizeDiff :: + Nil) { _ shouldBe 'empty } @@ -708,7 +744,10 @@ class DatabaseConversionsTest converted.delegatable :: converted.script :: converted.status :: - converted.consumedGas :: Nil) { + converted.consumedGas :: + converted.storageSize :: + converted.paidStorageSizeDiff :: + Nil) { _ shouldBe 'empty } @@ -747,7 +786,10 @@ class DatabaseConversionsTest converted.delegatable :: converted.script :: converted.status :: - converted.consumedGas :: Nil) { + converted.consumedGas :: + converted.storageSize :: + converted.paidStorageSizeDiff :: + Nil) { _ shouldBe 'empty } @@ -786,7 +828,10 @@ class DatabaseConversionsTest converted.delegatable :: converted.script :: converted.status :: - converted.consumedGas :: Nil) { + converted.consumedGas :: + converted.storageSize :: + converted.paidStorageSizeDiff :: + Nil) { _ shouldBe 'empty } diff --git a/src/test/scala/tech/cryptonomic/conseil/tezos/TezosPlatformDiscoveryOperationsTest.scala b/src/test/scala/tech/cryptonomic/conseil/tezos/TezosPlatformDiscoveryOperationsTest.scala index 2f3cbf008..d39f8eda5 100644 --- a/src/test/scala/tech/cryptonomic/conseil/tezos/TezosPlatformDiscoveryOperationsTest.scala +++ b/src/test/scala/tech/cryptonomic/conseil/tezos/TezosPlatformDiscoveryOperationsTest.scala @@ -176,6 +176,8 @@ class TezosPlatformDiscoveryOperationsTest Attribute("storage", "Storage", DataType.String, Some(0), KeyType.NonKey, "operations"), Attribute("status", "Status", DataType.String, Some(0), KeyType.NonKey, "operations"), Attribute("consumed_gas", "Consumed gas", DataType.Decimal, None, KeyType.NonKey, "operations"), + Attribute("storage_size", "Storage size", DataType.Decimal, None, KeyType.NonKey, "operations"), + Attribute("paid_storage_size_diff", "Paid storage size diff", DataType.Decimal, None, KeyType.NonKey, "operations"), Attribute("block_hash", "Block hash", DataType.String, Some(0), KeyType.NonKey, "operations"), Attribute("block_level", "Block level", DataType.Int, None, KeyType.NonKey, "operations"), Attribute("timestamp", "Timestamp", DataType.DateTime, None, KeyType.NonKey, "operations")