Skip to content

Commit

Permalink
elaborate composite ids:
Browse files Browse the repository at this point in the history
- accept in `TestInsert`
- build ids more easily based on other ids
- extract ids from ids
- work in dsl
  • Loading branch information
oyvindberg committed Jun 9, 2024
1 parent dc72e3b commit 797e083
Show file tree
Hide file tree
Showing 21 changed files with 360 additions and 57 deletions.
2 changes: 1 addition & 1 deletion typo-dsl-anorm/src/scala/typo/dsl/SqlExpr.scala
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ object SqlExpr {
}

object CompositeIn {
case class TuplePart[Tuple, T, Row](field: IdField[T, Row])(val extract: Tuple => T)(implicit val asConst: Const.As[Array[T], Required], val CT: ClassTag[T])
case class TuplePart[Tuple, T, Row](field: FieldLike[T, Required, Row])(val extract: Tuple => T)(implicit val asConst: Const.As[Array[T], Required], val CT: ClassTag[T])
}

case class RowExpr(exprs: List[SqlExpr.SqlExprNoHkt[?]]) extends SqlExpr[List[?], Required] {
Expand Down
2 changes: 1 addition & 1 deletion typo-dsl-doobie/src/scala/typo/dsl/SqlExpr.scala
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ object SqlExpr {
}

object CompositeIn {
case class TuplePart[Tuple, T, Row](field: IdField[T, Row])(val extract: Tuple => T)(implicit val asConst: Const.As[Array[T], Required], val CT: ClassTag[T])
case class TuplePart[Tuple, T, Row](field: FieldLike[T, Required, Row])(val extract: Tuple => T)(implicit val asConst: Const.As[Array[T], Required], val CT: ClassTag[T])
}

case class RowExpr(exprs: List[SqlExpr.SqlExprNoHkt[?]]) extends SqlExpr[List[?], Required] {
Expand Down
2 changes: 1 addition & 1 deletion typo-dsl-zio-jdbc/src/scala/typo/dsl/SqlExpr.scala
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ object SqlExpr {
}

object CompositeIn {
case class TuplePart[Tuple, T, Row](field: IdField[T, Row])(val extract: Tuple => T)(implicit val asConst: Const.As[Array[T], Required], val CT: ClassTag[T])
case class TuplePart[Tuple, T, Row](field: FieldLike[T, Required, Row])(val extract: Tuple => T)(implicit val asConst: Const.As[Array[T], Required], val CT: ClassTag[T])
}

case class RowExpr(exprs: List[SqlExpr.SqlExprNoHkt[?]]) extends SqlExpr[List[?], Required] {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import adventureworks.customtypes.TypoUUID
import adventureworks.production.product.ProductId
import adventureworks.sales.salesorderheader.SalesorderheaderId
import adventureworks.sales.specialoffer.SpecialofferId
import adventureworks.sales.specialofferproduct.SpecialofferproductId
import anorm.Column
import anorm.RowParser
import anorm.Success
Expand Down Expand Up @@ -61,6 +62,10 @@ case class SalesorderdetailRow(
){
val compositeId: SalesorderdetailId = SalesorderdetailId(salesorderid, salesorderdetailid)
val id = compositeId
val extractSpecialofferproductId: SpecialofferproductId = SpecialofferproductId(
specialofferid = specialofferid,
productid = productid
)
def toUnsavedRow(salesorderdetailid: Defaulted[Int], unitpricediscount: Defaulted[BigDecimal] = Defaulted.Provided(this.unitpricediscount), rowguid: Defaulted[TypoUUID] = Defaulted.Provided(this.rowguid), modifieddate: Defaulted[TypoLocalDateTime] = Defaulted.Provided(this.modifieddate)): SalesorderdetailRowUnsaved =
SalesorderdetailRowUnsaved(salesorderid, carriertrackingnumber, orderqty, productid, specialofferid, unitprice, salesorderdetailid, unitpricediscount, rowguid, modifieddate)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,7 @@ import adventureworks.sales.specialoffer.SpecialofferId
import adventureworks.sales.specialoffer.SpecialofferRepoImpl
import adventureworks.sales.specialoffer.SpecialofferRow
import adventureworks.sales.specialoffer.SpecialofferRowUnsaved
import adventureworks.sales.specialofferproduct.SpecialofferproductId
import adventureworks.sales.specialofferproduct.SpecialofferproductRepoImpl
import adventureworks.sales.specialofferproduct.SpecialofferproductRow
import adventureworks.sales.specialofferproduct.SpecialofferproductRowUnsaved
Expand Down Expand Up @@ -855,17 +856,16 @@ class TestInsert(random: Random) {
creditcardid: /* user-picked */ CustomCreditcardId,
modifieddate: Defaulted[TypoLocalDateTime] = Defaulted.UseDefault
)(implicit c: Connection): PersoncreditcardRow = (new PersoncreditcardRepoImpl).insert(new PersoncreditcardRowUnsaved(businessentityid = businessentityid, creditcardid = creditcardid, modifieddate = modifieddate))
def salesSalesorderdetail(salesorderid: SalesorderheaderId,
productid: ProductId,
specialofferid: SpecialofferId,
def salesSalesorderdetail(SpecialofferproductId: SpecialofferproductId,
salesorderid: SalesorderheaderId,
carriertrackingnumber: Option[/* max 25 chars */ String] = if (random.nextBoolean()) None else Some(random.alphanumeric.take(20).mkString),
orderqty: TypoShort = TypoShort(random.nextInt(Short.MaxValue).toShort),
unitprice: BigDecimal = BigDecimal.decimal(random.nextDouble()),
salesorderdetailid: Defaulted[Int] = Defaulted.UseDefault,
unitpricediscount: Defaulted[BigDecimal] = Defaulted.UseDefault,
rowguid: Defaulted[TypoUUID] = Defaulted.UseDefault,
modifieddate: Defaulted[TypoLocalDateTime] = Defaulted.UseDefault
)(implicit c: Connection): SalesorderdetailRow = (new SalesorderdetailRepoImpl).insert(new SalesorderdetailRowUnsaved(salesorderid = salesorderid, productid = productid, specialofferid = specialofferid, carriertrackingnumber = carriertrackingnumber, orderqty = orderqty, unitprice = unitprice, salesorderdetailid = salesorderdetailid, unitpricediscount = unitpricediscount, rowguid = rowguid, modifieddate = modifieddate))
)(implicit c: Connection): SalesorderdetailRow = (new SalesorderdetailRepoImpl).insert(new SalesorderdetailRowUnsaved(salesorderid = salesorderid, carriertrackingnumber = carriertrackingnumber, orderqty = orderqty, productid = SpecialofferproductId.productid, specialofferid = SpecialofferproductId.specialofferid, unitprice = unitprice, salesorderdetailid = salesorderdetailid, unitpricediscount = unitpricediscount, rowguid = rowguid, modifieddate = modifieddate))
def salesSalesorderheader(customerid: CustomerId,
billtoaddressid: AddressId,
shiptoaddressid: AddressId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import adventureworks.customtypes.TypoUUID
import adventureworks.production.product.ProductId
import adventureworks.sales.salesorderheader.SalesorderheaderId
import adventureworks.sales.specialoffer.SpecialofferId
import adventureworks.sales.specialofferproduct.SpecialofferproductId
import doobie.enumerated.Nullability
import doobie.postgres.Text
import doobie.util.Read
Expand Down Expand Up @@ -57,6 +58,10 @@ case class SalesorderdetailRow(
){
val compositeId: SalesorderdetailId = SalesorderdetailId(salesorderid, salesorderdetailid)
val id = compositeId
val extractSpecialofferproductId: SpecialofferproductId = SpecialofferproductId(
specialofferid = specialofferid,
productid = productid
)
def toUnsavedRow(salesorderdetailid: Defaulted[Int], unitpricediscount: Defaulted[BigDecimal] = Defaulted.Provided(this.unitpricediscount), rowguid: Defaulted[TypoUUID] = Defaulted.Provided(this.rowguid), modifieddate: Defaulted[TypoLocalDateTime] = Defaulted.Provided(this.modifieddate)): SalesorderdetailRowUnsaved =
SalesorderdetailRowUnsaved(salesorderid, carriertrackingnumber, orderqty, productid, specialofferid, unitprice, salesorderdetailid, unitpricediscount, rowguid, modifieddate)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,7 @@ import adventureworks.sales.specialoffer.SpecialofferId
import adventureworks.sales.specialoffer.SpecialofferRepoImpl
import adventureworks.sales.specialoffer.SpecialofferRow
import adventureworks.sales.specialoffer.SpecialofferRowUnsaved
import adventureworks.sales.specialofferproduct.SpecialofferproductId
import adventureworks.sales.specialofferproduct.SpecialofferproductRepoImpl
import adventureworks.sales.specialofferproduct.SpecialofferproductRow
import adventureworks.sales.specialofferproduct.SpecialofferproductRowUnsaved
Expand Down Expand Up @@ -855,17 +856,16 @@ class TestInsert(random: Random) {
creditcardid: /* user-picked */ CustomCreditcardId,
modifieddate: Defaulted[TypoLocalDateTime] = Defaulted.UseDefault
): ConnectionIO[PersoncreditcardRow] = (new PersoncreditcardRepoImpl).insert(new PersoncreditcardRowUnsaved(businessentityid = businessentityid, creditcardid = creditcardid, modifieddate = modifieddate))
def salesSalesorderdetail(salesorderid: SalesorderheaderId,
productid: ProductId,
specialofferid: SpecialofferId,
def salesSalesorderdetail(SpecialofferproductId: SpecialofferproductId,
salesorderid: SalesorderheaderId,
carriertrackingnumber: Option[/* max 25 chars */ String] = if (random.nextBoolean()) None else Some(random.alphanumeric.take(20).mkString),
orderqty: TypoShort = TypoShort(random.nextInt(Short.MaxValue).toShort),
unitprice: BigDecimal = BigDecimal.decimal(random.nextDouble()),
salesorderdetailid: Defaulted[Int] = Defaulted.UseDefault,
unitpricediscount: Defaulted[BigDecimal] = Defaulted.UseDefault,
rowguid: Defaulted[TypoUUID] = Defaulted.UseDefault,
modifieddate: Defaulted[TypoLocalDateTime] = Defaulted.UseDefault
): ConnectionIO[SalesorderdetailRow] = (new SalesorderdetailRepoImpl).insert(new SalesorderdetailRowUnsaved(salesorderid = salesorderid, productid = productid, specialofferid = specialofferid, carriertrackingnumber = carriertrackingnumber, orderqty = orderqty, unitprice = unitprice, salesorderdetailid = salesorderdetailid, unitpricediscount = unitpricediscount, rowguid = rowguid, modifieddate = modifieddate))
): ConnectionIO[SalesorderdetailRow] = (new SalesorderdetailRepoImpl).insert(new SalesorderdetailRowUnsaved(salesorderid = salesorderid, carriertrackingnumber = carriertrackingnumber, orderqty = orderqty, productid = SpecialofferproductId.productid, specialofferid = SpecialofferproductId.specialofferid, unitprice = unitprice, salesorderdetailid = salesorderdetailid, unitpricediscount = unitpricediscount, rowguid = rowguid, modifieddate = modifieddate))
def salesSalesorderheader(customerid: CustomerId,
billtoaddressid: AddressId,
shiptoaddressid: AddressId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import adventureworks.customtypes.TypoUUID
import adventureworks.production.product.ProductId
import adventureworks.sales.salesorderheader.SalesorderheaderId
import adventureworks.sales.specialoffer.SpecialofferId
import adventureworks.sales.specialofferproduct.SpecialofferproductId
import java.sql.ResultSet
import zio.jdbc.JdbcDecoder
import zio.json.JsonDecoder
Expand Down Expand Up @@ -56,6 +57,10 @@ case class SalesorderdetailRow(
){
val compositeId: SalesorderdetailId = SalesorderdetailId(salesorderid, salesorderdetailid)
val id = compositeId
val extractSpecialofferproductId: SpecialofferproductId = SpecialofferproductId(
specialofferid = specialofferid,
productid = productid
)
def toUnsavedRow(salesorderdetailid: Defaulted[Int], unitpricediscount: Defaulted[BigDecimal] = Defaulted.Provided(this.unitpricediscount), rowguid: Defaulted[TypoUUID] = Defaulted.Provided(this.rowguid), modifieddate: Defaulted[TypoLocalDateTime] = Defaulted.Provided(this.modifieddate)): SalesorderdetailRowUnsaved =
SalesorderdetailRowUnsaved(salesorderid, carriertrackingnumber, orderqty, productid, specialofferid, unitprice, salesorderdetailid, unitpricediscount, rowguid, modifieddate)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,7 @@ import adventureworks.sales.specialoffer.SpecialofferId
import adventureworks.sales.specialoffer.SpecialofferRepoImpl
import adventureworks.sales.specialoffer.SpecialofferRow
import adventureworks.sales.specialoffer.SpecialofferRowUnsaved
import adventureworks.sales.specialofferproduct.SpecialofferproductId
import adventureworks.sales.specialofferproduct.SpecialofferproductRepoImpl
import adventureworks.sales.specialofferproduct.SpecialofferproductRow
import adventureworks.sales.specialofferproduct.SpecialofferproductRowUnsaved
Expand Down Expand Up @@ -856,17 +857,16 @@ class TestInsert(random: Random) {
creditcardid: /* user-picked */ CustomCreditcardId,
modifieddate: Defaulted[TypoLocalDateTime] = Defaulted.UseDefault
): ZIO[ZConnection, Throwable, PersoncreditcardRow] = (new PersoncreditcardRepoImpl).insert(new PersoncreditcardRowUnsaved(businessentityid = businessentityid, creditcardid = creditcardid, modifieddate = modifieddate))
def salesSalesorderdetail(salesorderid: SalesorderheaderId,
productid: ProductId,
specialofferid: SpecialofferId,
def salesSalesorderdetail(SpecialofferproductId: SpecialofferproductId,
salesorderid: SalesorderheaderId,
carriertrackingnumber: Option[/* max 25 chars */ String] = if (random.nextBoolean()) None else Some(random.alphanumeric.take(20).mkString),
orderqty: TypoShort = TypoShort(random.nextInt(Short.MaxValue).toShort),
unitprice: BigDecimal = BigDecimal.decimal(random.nextDouble()),
salesorderdetailid: Defaulted[Int] = Defaulted.UseDefault,
unitpricediscount: Defaulted[BigDecimal] = Defaulted.UseDefault,
rowguid: Defaulted[TypoUUID] = Defaulted.UseDefault,
modifieddate: Defaulted[TypoLocalDateTime] = Defaulted.UseDefault
): ZIO[ZConnection, Throwable, SalesorderdetailRow] = (new SalesorderdetailRepoImpl).insert(new SalesorderdetailRowUnsaved(salesorderid = salesorderid, productid = productid, specialofferid = specialofferid, carriertrackingnumber = carriertrackingnumber, orderqty = orderqty, unitprice = unitprice, salesorderdetailid = salesorderdetailid, unitpricediscount = unitpricediscount, rowguid = rowguid, modifieddate = modifieddate))
): ZIO[ZConnection, Throwable, SalesorderdetailRow] = (new SalesorderdetailRepoImpl).insert(new SalesorderdetailRowUnsaved(salesorderid = salesorderid, carriertrackingnumber = carriertrackingnumber, orderqty = orderqty, productid = SpecialofferproductId.productid, specialofferid = SpecialofferproductId.specialofferid, unitprice = unitprice, salesorderdetailid = salesorderdetailid, unitpricediscount = unitpricediscount, rowguid = rowguid, modifieddate = modifieddate))
def salesSalesorderheader(customerid: CustomerId,
billtoaddressid: AddressId,
shiptoaddressid: AddressId,
Expand Down
6 changes: 6 additions & 0 deletions typo/src/scala/typo/NonEmptyList.scala
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@ case class NonEmptyList[T](head: T, tail: List[T]) {
val head :: tail = toList.sorted: @unchecked
NonEmptyList(head, tail)
}
def iterator: Iterator[T] =
Iterator(head) ++ tail.iterator

def countWhere(f: T => Boolean): Int =
(if (f(head)) 1 else 0) + tail.count(f)

def zipWithIndex: NonEmptyList[(T, Int)] =
NonEmptyList((head, 0), tail.zipWithIndex.map { case (t, i) => (t, i + 1) })

Expand Down
Loading

0 comments on commit 797e083

Please sign in to comment.