Skip to content

Commit 45d6ae9

Browse files
author
Stanislav Lukeš
committed
Add Transformations Schedules
1 parent 4c47cc2 commit 45d6ae9

File tree

7 files changed

+371
-123
lines changed

7 files changed

+371
-123
lines changed

src/main/scala/com/cognite/sdk/scala/common/dataTypes.scala

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ package com.cognite.sdk.scala.common
55

66
import java.time.Instant
77
import cats.Id
8-
import com.cognite.sdk.scala.v1.CogniteId
8+
import com.cognite.sdk.scala.v1.{CogniteExternalId, CogniteId, CogniteInternalId}
99
import io.circe.{Decoder, Encoder, Json, JsonObject}
1010
import io.circe.generic.semiauto.deriveDecoder
1111
import sttp.model.Uri
@@ -96,7 +96,28 @@ final case class CdpApiException(
9696
).flatMap(_.toList).mkString
9797

9898
s"Request ${maybeId}to ${url.toString} failed with status ${code.toString}: $message.$details"
99-
})
99+
}) {
100+
def missingIds: Seq[CogniteId] =
101+
missing.getOrElse(Seq.empty).flatMap(CdpApiException.decodeId)
102+
def missingExternalIds: Seq[String] =
103+
missingIds.collect { case CogniteExternalId(externalId) =>
104+
externalId
105+
}
106+
def missingInternalIds: Seq[Long] =
107+
missingIds.collect { case CogniteInternalId(id) =>
108+
id
109+
}
110+
def duplicatedIds: Seq[CogniteId] =
111+
duplicated.getOrElse(Seq.empty).flatMap(CdpApiException.decodeId)
112+
def duplicatedExternalIds: Seq[String] =
113+
duplicatedIds.collect { case CogniteExternalId(externalId) =>
114+
externalId
115+
}
116+
def duplicatedInternalIds: Seq[Long] =
117+
duplicatedIds.collect { case CogniteInternalId(id) =>
118+
id
119+
}
120+
}
100121

101122
object CdpApiException {
102123
private def describeErrorList(kind: String)(items: Seq[JsonObject]): String =
@@ -120,6 +141,19 @@ object CdpApiException {
120141
s" $kind ${key}s: [$commaSeparatedValues]."
121142
}
122143
.mkString
144+
145+
private val externalIdDecoder: Decoder[CogniteExternalId] = deriveDecoder
146+
private val internalIdDecoder: Decoder[CogniteInternalId] = deriveDecoder
147+
private def decodeId(jsonObject: JsonObject): Option[CogniteId] = {
148+
val json = Json.fromJsonObject(jsonObject)
149+
internalIdDecoder.decodeJson(json) match {
150+
case Right(id: CogniteId) => Some(id)
151+
case _ => externalIdDecoder.decodeJson(json) match {
152+
case Right(id) => Some(id)
153+
case _ => None
154+
}
155+
}
156+
}
123157
}
124158

125159
final case class DataPoint(

src/main/scala/com/cognite/sdk/scala/v1/resources/transformations.scala

Lines changed: 121 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ class Transformations[F[_]: Monad](val requestSession: RequestSession[F])
2525
import Transformations._
2626
override val baseUrl = uri"${requestSession.baseUrl}/transformations"
2727

28+
val schedules: TransformationSchedules[F] = new TransformationSchedules[F](requestSession)
29+
2830
override private[sdk] def readWithCursor(
2931
cursor: Option[String],
3032
limit: Option[Int],
@@ -62,12 +64,24 @@ class Transformations[F[_]: Monad](val requestSession: RequestSession[F])
6264
)
6365

6466
override def createItems(items: Items[TransformConfigCreate]): F[Seq[TransformConfigRead]] =
65-
Create.createItems[F, TransformConfigRead, TransformConfigCreate](requestSession, baseUrl, items)
67+
Create.createItems[F, TransformConfigRead, TransformConfigCreate](
68+
requestSession,
69+
baseUrl,
70+
items
71+
)
6672

67-
override def updateById(items: Map[Long, StandardTransformConfigUpdate]): F[Seq[TransformConfigRead]] =
68-
UpdateById.updateById[F, TransformConfigRead, StandardTransformConfigUpdate](requestSession, baseUrl, items)
73+
override def updateById(
74+
items: Map[Long, StandardTransformConfigUpdate]
75+
): F[Seq[TransformConfigRead]] =
76+
UpdateById.updateById[F, TransformConfigRead, StandardTransformConfigUpdate](
77+
requestSession,
78+
baseUrl,
79+
items
80+
)
6981

70-
override def updateByExternalId(items: Map[String, StandardTransformConfigUpdate]): F[Seq[TransformConfigRead]] =
82+
override def updateByExternalId(
83+
items: Map[String, StandardTransformConfigUpdate]
84+
): F[Seq[TransformConfigRead]] =
7185
UpdateByExternalId.updateByExternalId[F, TransformConfigRead, StandardTransformConfigUpdate](
7286
requestSession,
7387
baseUrl,
@@ -79,21 +93,6 @@ class Transformations[F[_]: Monad](val requestSession: RequestSession[F])
7993
override def deleteByIds(ids: Seq[Long], ignoreUnknownIds: Boolean): F[Unit] =
8094
DeleteByIds.deleteByIdsWithIgnoreUnknownIds(requestSession, baseUrl, ids, ignoreUnknownIds)
8195

82-
def deleteByIds(
83-
ids: Seq[Long],
84-
recursive: Boolean,
85-
ignoreUnknownIds: Boolean
86-
): F[Unit] =
87-
requestSession.post[Unit, Unit, ItemsWithRecursiveAndIgnoreUnknownIds](
88-
ItemsWithRecursiveAndIgnoreUnknownIds(
89-
ids.map(CogniteInternalId.apply),
90-
recursive,
91-
ignoreUnknownIds
92-
),
93-
uri"$baseUrl/delete",
94-
_ => ()
95-
)
96-
9796
override def deleteByExternalIds(externalIds: Seq[String]): F[Unit] =
9897
deleteByExternalIds(externalIds, false)
9998

@@ -105,28 +104,12 @@ class Transformations[F[_]: Monad](val requestSession: RequestSession[F])
105104
ignoreUnknownIds
106105
)
107106

108-
def deleteByExternalIds(
109-
externalIds: Seq[String],
110-
recursive: Boolean,
111-
ignoreUnknownIds: Boolean
112-
): F[Unit] =
113-
requestSession.post[Unit, Unit, ItemsWithRecursiveAndIgnoreUnknownIds](
114-
ItemsWithRecursiveAndIgnoreUnknownIds(
115-
externalIds.map(CogniteExternalId.apply),
116-
recursive,
117-
ignoreUnknownIds
118-
),
119-
uri"$baseUrl/delete",
120-
_ => ()
121-
)
122-
123-
124107
def query[I](
125108
query: String,
126109
limit: Int = 1000
127110
)(implicit itemDecoder: Decoder[I]): F[QueryResponse[I]] = {
128111
implicit val responseItemsDecoder: Decoder[Items[I]] = deriveDecoder[Items[I]]
129-
responseItemsDecoder.hashCode // suppress no usage warning... 🤦
112+
val _ = itemDecoder.hashCode + responseItemsDecoder.hashCode // suppress no usage warnings... 🤦
130113
implicit val responseDecoder: Decoder[QueryResponse[I]] = deriveDecoder[QueryResponse[I]]
131114
requestSession.post[QueryResponse[I], QueryResponse[I], QueryQuery](
132115
QueryQuery(query),
@@ -135,6 +118,7 @@ class Transformations[F[_]: Monad](val requestSession: RequestSession[F])
135118
)
136119
}
137120

121+
@SuppressWarnings(Array("org.wartremover.warts.TraversableOps"))
138122
def queryOne[I](
139123
q: String
140124
)(implicit itemDecoder: Decoder[I]): F[I] =
@@ -148,8 +132,10 @@ object Transformations {
148132
implicit val readItemsDecoder: Decoder[Items[TransformConfigRead]] =
149133
deriveDecoder[Items[TransformConfigRead]]
150134
implicit val createEncoder: Encoder[TransformConfigCreate] = deriveEncoder[TransformConfigCreate]
151-
implicit val createItemsEncoder: Encoder[Items[TransformConfigCreate]] = deriveEncoder[Items[TransformConfigCreate]]
152-
implicit val updateEncoder: Encoder[StandardTransformConfigUpdate] = deriveEncoder[StandardTransformConfigUpdate]
135+
implicit val createItemsEncoder: Encoder[Items[TransformConfigCreate]] =
136+
deriveEncoder[Items[TransformConfigCreate]]
137+
implicit val updateEncoder: Encoder[StandardTransformConfigUpdate] =
138+
deriveEncoder[StandardTransformConfigUpdate]
153139

154140
implicit val errorOrUnitDecoder: Decoder[Either[CdpApiError, Unit]] =
155141
EitherDecoder.eitherDecoder[CdpApiError, Unit]
@@ -161,5 +147,101 @@ object Transformations {
161147
implicit val queryEncoder: Encoder[QueryQuery] =
162148
deriveEncoder[QueryQuery]
163149
implicit val querySchemaDecoder: Decoder[QuerySchemaColumn] = deriveDecoder[QuerySchemaColumn]
164-
implicit val querySchemaItemsDecoder: Decoder[Items[QuerySchemaColumn]] = deriveDecoder[Items[QuerySchemaColumn]]
150+
implicit val querySchemaItemsDecoder: Decoder[Items[QuerySchemaColumn]] =
151+
deriveDecoder[Items[QuerySchemaColumn]]
152+
}
153+
154+
class TransformationSchedules[F[_]](val requestSession: RequestSession[F])
155+
extends WithRequestSession[F]
156+
with Create[TransformationScheduleRead, TransformationScheduleCreate, F]
157+
with RetrieveByIdsWithIgnoreUnknownIds[TransformationScheduleRead, F]
158+
with Readable[TransformationScheduleRead, F]
159+
with RetrieveByExternalIdsWithIgnoreUnknownIds[TransformationScheduleRead, F]
160+
with DeleteByIdsWithIgnoreUnknownIds[F, Long]
161+
with DeleteByExternalIdsWithIgnoreUnknownIds[F]
162+
//with UpdateById[TransformConfigRead, StandardTransformConfigUpdate, F]
163+
//with UpdateByExternalId[TransformConfigRead, StandardTransformConfigUpdate, F]
164+
{
165+
import TransformationSchedules._
166+
override val baseUrl = uri"${requestSession.baseUrl}/transformations/schedules"
167+
168+
override private[sdk] def readWithCursor(
169+
cursor: Option[String],
170+
limit: Option[Int],
171+
partition: Option[Partition]
172+
): F[ItemsWithCursor[TransformationScheduleRead]] =
173+
Readable.readWithCursor(
174+
requestSession,
175+
baseUrl,
176+
cursor,
177+
limit,
178+
partition,
179+
100
180+
)
181+
182+
override def retrieveByIds(
183+
ids: Seq[Long],
184+
ignoreUnknownIds: Boolean
185+
): F[Seq[TransformationScheduleRead]] =
186+
RetrieveByIdsWithIgnoreUnknownIds.retrieveByIds(
187+
requestSession,
188+
baseUrl,
189+
ids,
190+
ignoreUnknownIds
191+
)
192+
193+
override def retrieveByExternalIds(
194+
externalIds: Seq[String],
195+
ignoreUnknownIds: Boolean
196+
): F[Seq[TransformationScheduleRead]] =
197+
RetrieveByExternalIdsWithIgnoreUnknownIds.retrieveByExternalIds(
198+
requestSession,
199+
baseUrl,
200+
externalIds,
201+
ignoreUnknownIds
202+
)
203+
204+
override def createItems(
205+
items: Items[TransformationScheduleCreate]
206+
): F[Seq[TransformationScheduleRead]] =
207+
Create.createItems[F, TransformationScheduleRead, TransformationScheduleCreate](
208+
requestSession,
209+
baseUrl,
210+
items
211+
)
212+
213+
override def deleteByIds(ids: Seq[Long]): F[Unit] = deleteByIds(ids, false)
214+
215+
override def deleteByIds(ids: Seq[Long], ignoreUnknownIds: Boolean): F[Unit] =
216+
DeleteByIds.deleteByIdsWithIgnoreUnknownIds(requestSession, baseUrl, ids, ignoreUnknownIds)
217+
218+
override def deleteByExternalIds(externalIds: Seq[String]): F[Unit] =
219+
deleteByExternalIds(externalIds, false)
220+
221+
override def deleteByExternalIds(externalIds: Seq[String], ignoreUnknownIds: Boolean): F[Unit] =
222+
DeleteByExternalIds.deleteByExternalIdsWithIgnoreUnknownIds(
223+
requestSession,
224+
baseUrl,
225+
externalIds,
226+
ignoreUnknownIds
227+
)
228+
}
229+
230+
object TransformationSchedules {
231+
implicit val readDecoder: Decoder[TransformationScheduleRead] =
232+
deriveDecoder[TransformationScheduleRead]
233+
implicit val readItemsWithCursorDecoder: Decoder[ItemsWithCursor[TransformationScheduleRead]] =
234+
deriveDecoder[ItemsWithCursor[TransformationScheduleRead]]
235+
implicit val readItemsDecoder: Decoder[Items[TransformationScheduleRead]] =
236+
deriveDecoder[Items[TransformationScheduleRead]]
237+
implicit val createEncoder: Encoder[TransformationScheduleCreate] =
238+
deriveEncoder[TransformationScheduleCreate]
239+
implicit val createItemsEncoder: Encoder[Items[TransformationScheduleCreate]] =
240+
deriveEncoder[Items[TransformationScheduleCreate]]
241+
//implicit val updateEncoder: Encoder[StandardTransformConfigUpdate] = deriveEncoder[StandardTransformConfigUpdate]
242+
243+
implicit val errorOrUnitDecoder: Decoder[Either[CdpApiError, Unit]] =
244+
EitherDecoder.eitherDecoder[CdpApiError, Unit]
245+
implicit val cogniteExternalIdDecoder: Decoder[CogniteExternalId] =
246+
deriveDecoder[CogniteExternalId]
165247
}

0 commit comments

Comments
 (0)