diff --git a/src/main/scala/com/paulgoldbaum/influxdbclient/Database.scala b/src/main/scala/com/paulgoldbaum/influxdbclient/Database.scala index 0bf209f..c2eb92c 100644 --- a/src/main/scala/com/paulgoldbaum/influxdbclient/Database.scala +++ b/src/main/scala/com/paulgoldbaum/influxdbclient/Database.scala @@ -2,6 +2,7 @@ package com.paulgoldbaum.influxdbclient import com.paulgoldbaum.influxdbclient.Parameter.Consistency.Consistency import com.paulgoldbaum.influxdbclient.Parameter.Precision.Precision +import com.paulgoldbaum.influxdbclient.implicits.ToPointSyntax import scala.concurrent.{ExecutionContext, Future} @@ -12,12 +13,12 @@ class Database protected[influxdbclient] with RetentionPolicyManagement with DatabaseManagement { - def write(point: Point, + def write[A](point: A, precision: Precision = null, consistency: Consistency = null, - retentionPolicy: String = null): Future[Boolean] = + retentionPolicy: String = null)(implicit toPoint: ToPoint[A]): Future[Boolean] = { - executeWrite(point.serialize(), precision, consistency, retentionPolicy) + executeWrite(point.toPoint.serialize(), precision, consistency, retentionPolicy) } def bulkWrite(points: Seq[Point], diff --git a/src/main/scala/com/paulgoldbaum/influxdbclient/ToPoint.scala b/src/main/scala/com/paulgoldbaum/influxdbclient/ToPoint.scala new file mode 100644 index 0000000..52cde43 --- /dev/null +++ b/src/main/scala/com/paulgoldbaum/influxdbclient/ToPoint.scala @@ -0,0 +1,17 @@ +package com.paulgoldbaum.influxdbclient + +trait ToPoint[-A] { + + def convert(value: A): Point + +} + +object ToPoint { + + implicit object PointToPoint extends ToPoint[Point]{ + + override def convert(value: Point): Point = value + + } + +} diff --git a/src/main/scala/com/paulgoldbaum/influxdbclient/implicits/package.scala b/src/main/scala/com/paulgoldbaum/influxdbclient/implicits/package.scala new file mode 100644 index 0000000..d874408 --- /dev/null +++ b/src/main/scala/com/paulgoldbaum/influxdbclient/implicits/package.scala @@ -0,0 +1,14 @@ +package com.paulgoldbaum.influxdbclient + +package object implicits { + + implicit class ToPointSyntax[A](val value: A) extends AnyVal { + + def toPoint(implicit toPoint: ToPoint[A]): Point = toPoint.convert(value) + + } + + implicit def anyToPoint[A](value: A)(implicit toPoint: ToPoint[A]): Point = + toPoint.convert(value) + +} diff --git a/src/test/scala/com/paulgoldbaum/influxdbclient/DatabaseSuite.scala b/src/test/scala/com/paulgoldbaum/influxdbclient/DatabaseSuite.scala index cc1675b..e24e0d6 100644 --- a/src/test/scala/com/paulgoldbaum/influxdbclient/DatabaseSuite.scala +++ b/src/test/scala/com/paulgoldbaum/influxdbclient/DatabaseSuite.scala @@ -59,6 +59,12 @@ class DatabaseSuite extends CustomTestSuite with BeforeAndAfter { assert(result.series.length == 1) } + test("A point can be written using ToPoint type class") { + await(database.write(Metric(123, "tag_value"))) + val result = await(database.query("SELECT * FROM test_measurement WHERE tag_key='tag_value'")) + assert(result.series.length == 1) + } + test("A point can be written and read with a precision parameter") { val time = 1444760421270l await( diff --git a/src/test/scala/com/paulgoldbaum/influxdbclient/Metric.scala b/src/test/scala/com/paulgoldbaum/influxdbclient/Metric.scala new file mode 100644 index 0000000..c9bc726 --- /dev/null +++ b/src/test/scala/com/paulgoldbaum/influxdbclient/Metric.scala @@ -0,0 +1,16 @@ +package com.paulgoldbaum.influxdbclient + +/** + * Class used for testing purposes. + */ +case class Metric(value: Int, tag: String) + +object Metric { + implicit val metricToPoint: ToPoint[Metric] = new ToPoint[Metric] { + override def convert(m: Metric): Point = + Point("test_measurement") + .addField("value", m.value) + .addTag("tag_key", m.tag) + } + +} \ No newline at end of file