Skip to content

Commit 53dded5

Browse files
author
Nick Grippin
committed
cleanup and json format
1 parent 3bb8e61 commit 53dded5

File tree

7 files changed

+79
-66
lines changed

7 files changed

+79
-66
lines changed

model/shared/src/main/scala/hmda/model/publication/reports/ApplicantIncome.scala

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,19 @@ package hmda.model.publication.reports
22

33
case class ApplicantIncome(
44
applicantIncome: ApplicantIncomeEnum,
5-
borrowerCharacteristics: List[BorrowerCharacteristic]
5+
characteristics: Characteristics
66
)
7+
8+
case class Characteristics(
9+
raceBorrowerCharacteristic: RaceBorrowerCharacteristic,
10+
ethnicityBorrowerCharacteristic: EthnicityBorrowerCharacteristic,
11+
minorityStatusBorrowerCharacteristic: MinorityStatusBorrowerCharacteristic
12+
) {
13+
def +(other: Characteristics): Characteristics = {
14+
Characteristics(
15+
raceBorrowerCharacteristic + other.raceBorrowerCharacteristic,
16+
ethnicityBorrowerCharacteristic + other.ethnicityBorrowerCharacteristic,
17+
minorityStatusBorrowerCharacteristic + other.minorityStatusBorrowerCharacteristic
18+
)
19+
}
20+
}

model/shared/src/main/scala/hmda/model/publication/reports/Characteristic.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ case class EthnicityCharacteristic(ethnicity: EthnicityEnum, dispositions: List[
2020
}
2121
}
2222

23-
2423
case class MinorityStatusCharacteristic(minorityStatus: MinorityStatusEnum, dispositions: List[Disposition]) extends Characteristic {
2524
def +(msc: MinorityStatusCharacteristic) = {
2625
val combined = dispositions.map(d =>

model/shared/src/main/scala/hmda/model/publication/reports/Disposition.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package hmda.model.publication.reports
22

33
case class Disposition(
4-
disposition: ActionTakenTypeEnum,
5-
count: Int,
6-
value: Int
4+
disposition: ActionTakenTypeEnum,
5+
count: Int,
6+
value: Int
77
) {
88
def +(disp: Disposition): Disposition = {
99
Disposition(disposition, count + disp.count, value + disp.value)

publication/src/main/scala/hmda/publication/reports/national/N52.scala

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,41 +3,30 @@ package hmda.publication.reports.national
33
import akka.NotUsed
44
import akka.stream.scaladsl.Source
55
import hmda.census.model.MsaIncomeLookup
6-
import hmda.model.publication.reports.ApplicantIncomeEnum._
76
import hmda.model.publication.reports._
87
import hmda.publication.reports._
98
import hmda.publication.reports.aggregate.A52
9+
import hmda.publication.reports.util.ReportUtil._
1010
import hmda.publication.reports.util.ReportsMetaDataLookup
1111
import hmda.query.model.filing.LoanApplicationRegisterQuery
1212

1313
import scala.concurrent.Future
1414

1515
case class N52(
16-
year: Int = 0,
17-
reportDate: String = "",
18-
applicantIncomes: List[ApplicantIncome] = List(),
19-
total: List[Disposition] = List(),
20-
table: String = N52.metaData.reportTable,
21-
description: String = N52.metaData.description
22-
) extends NationalAggregateReport {
16+
year: Int = 0,
17+
reportDate: String = formattedCurrentDate,
18+
applicantIncomes: List[ApplicantIncome] = List(),
19+
total: List[Disposition] = List(),
20+
table: String = N52.metaData.reportTable,
21+
description: String = N52.metaData.description
22+
) extends NationalAggregateReport {
2323
def +(a52: A52): N52 = {
24-
val combinedIncomes = a52.applicantIncomes.map(income => {
25-
val bc = applicantIncomes.find(i => i.applicantIncome == income.applicantIncome).get.borrowerCharacteristics
26-
27-
val originalRc = bc.find(_.isInstanceOf[RaceBorrowerCharacteristic]).get.asInstanceOf[RaceBorrowerCharacteristic]
28-
val additionalRc = income.borrowerCharacteristics.find(_.isInstanceOf[RaceBorrowerCharacteristic]).get.asInstanceOf[RaceBorrowerCharacteristic]
29-
30-
val originalEc = bc.find(_.isInstanceOf[EthnicityBorrowerCharacteristic]).get.asInstanceOf[EthnicityBorrowerCharacteristic]
31-
val additionalEc = income.borrowerCharacteristics.find(_.isInstanceOf[EthnicityBorrowerCharacteristic]).get.asInstanceOf[EthnicityBorrowerCharacteristic]
3224

33-
val originalMsc = bc.find(_.isInstanceOf[MinorityStatusBorrowerCharacteristic]).get.asInstanceOf[MinorityStatusBorrowerCharacteristic]
34-
val additionalMsc = income.borrowerCharacteristics.find(_.isInstanceOf[MinorityStatusBorrowerCharacteristic]).get.asInstanceOf[MinorityStatusBorrowerCharacteristic]
25+
val combinedIncomes = a52.applicantIncomes.map(income => {
26+
val newC = applicantIncomes.find(i => i.applicantIncome == income.applicantIncome).get.characteristics
27+
val originalC = income.characteristics
3528

36-
ApplicantIncome(income.applicantIncome, List(
37-
originalRc + additionalRc,
38-
originalEc + additionalEc,
39-
originalMsc + additionalMsc
40-
))
29+
ApplicantIncome(income.applicantIncome, newC + originalC)
4130
})
4231

4332
val combinedDispositions = a52.total.map(disposition => {
@@ -60,9 +49,14 @@ object N52 {
6049
def generate[ec: EC, mat: MAT, as: AS](larSource: Source[LoanApplicationRegisterQuery, NotUsed]): Future[N52] = {
6150
val fipsList = MsaIncomeLookup.values.map(_.fips)
6251

63-
fipsList.foldLeft(N52())((n, f) => {
64-
val a52 = A52.generate(larSource, f)
65-
a52.map{report => n + report}
52+
val a52List = fipsList.map(fipsCode => A52.generate(larSource, fipsCode))
53+
val n52f = Future.sequence(a52List).map(seq => {
54+
seq.foldLeft(N52())((n52, a52) => n52 + a52)
6655
})
56+
57+
for {
58+
n <- n52f
59+
y <- calculateYear(larSource)
60+
} yield N52(y, n.reportDate, n.applicantIncomes, n.total)
6761
}
6862
}
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package hmda.publication.reports.protocol
22

3-
import hmda.model.publication.reports.ApplicantIncome
3+
import hmda.model.publication.reports.{ ApplicantIncome, Characteristics }
44

5-
trait ApplicantIncomeProtocol extends ApplicantIncomeEnumProtocol with BorrowerCharacteristicProtocol {
5+
trait ApplicantIncomeProtocol extends ApplicantIncomeEnumProtocol with CharacteristicsProtocol {
66
implicit val applicantIncomeFormat = jsonFormat2(ApplicantIncome.apply)
77
}
8+
9+
trait CharacteristicsProtocol extends BorrowerCharacteristicProtocol {
10+
implicit val characteristicsProtocol = jsonFormat3(Characteristics.apply)
11+
}

publication/src/main/scala/hmda/publication/reports/protocol/BorrowerCharacteristicProtocol.scala

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,45 +5,48 @@ import spray.json._
55

66
trait BorrowerCharacteristicProtocol extends CharacteristicProtocol {
77

8-
implicit object BorrowerCharacteristicFormat extends RootJsonFormat[BorrowerCharacteristic] {
9-
override def write(obj: BorrowerCharacteristic): JsValue = obj match {
10-
11-
case RaceBorrowerCharacteristic(races) =>
12-
JsObject(
13-
"characteristic" -> JsString("Race"),
14-
"races" -> races.toJson
15-
)
16-
17-
case EthnicityBorrowerCharacteristic(ethnicities) =>
18-
JsObject(
19-
"characteristic" -> JsString("Ethnicity"),
20-
"ethnicities" -> ethnicities.toJson
21-
)
22-
23-
case MinorityStatusBorrowerCharacteristic(minorityStatus) =>
24-
JsObject(
25-
"characteristic" -> JsString("Minority Status"),
26-
"minorityStatus" -> minorityStatus.toJson
27-
)
28-
29-
}
30-
31-
override def read(json: JsValue): BorrowerCharacteristic = json match {
8+
implicit object RaceBorrowerCharacteristicFormat extends RootJsonFormat[RaceBorrowerCharacteristic] {
9+
override def write(obj: RaceBorrowerCharacteristic): JsValue =
10+
JsObject(
11+
"characteristic" -> JsString("Race"),
12+
"races" -> obj.toJson
13+
)
14+
15+
override def read(json: JsValue): RaceBorrowerCharacteristic = json match {
3216
case JsObject(fields) if fields.isDefinedAt("races") =>
3317
RaceBorrowerCharacteristic(
3418
fields("races").convertTo[List[RaceCharacteristic]]
3519
)
20+
}
21+
}
22+
23+
implicit object EthnicityBorrowerCharacteristicFormat extends RootJsonFormat[EthnicityBorrowerCharacteristic] {
24+
override def write(obj: EthnicityBorrowerCharacteristic): JsValue =
25+
JsObject(
26+
"characteristic" -> JsString("Ethnicity"),
27+
"ethnicities" -> obj.toJson
28+
)
3629

30+
override def read(json: JsValue): EthnicityBorrowerCharacteristic = json match {
3731
case JsObject(fields) if fields.isDefinedAt("ethnicities") =>
3832
EthnicityBorrowerCharacteristic(
3933
fields("ethnicities").convertTo[List[EthnicityCharacteristic]]
4034
)
35+
}
36+
}
4137

38+
implicit object MinorityStatusBorrowerCharacteristicFormat extends RootJsonFormat[MinorityStatusBorrowerCharacteristic] {
39+
override def write(obj: MinorityStatusBorrowerCharacteristic): JsValue =
40+
JsObject(
41+
"characteristic" -> JsString("Minority Status"),
42+
"minorityStatus" -> obj.toJson
43+
)
44+
45+
override def read(json: JsValue): MinorityStatusBorrowerCharacteristic = json match {
4246
case JsObject(fields) if fields.isDefinedAt("minorityStatus") =>
4347
MinorityStatusBorrowerCharacteristic(
4448
fields("minorityStatus").convertTo[List[MinorityStatusCharacteristic]]
4549
)
4650
}
47-
4851
}
4952
}

publication/src/main/scala/hmda/publication/reports/util/ReportUtil.scala

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,16 +118,15 @@ object ReportUtil extends SourceUtils {
118118
def borrowerCharacteristicsByIncomeInterval[ec: EC, mat: MAT, as: AS](
119119
larsByIncome: Map[ApplicantIncomeEnum, Source[LoanApplicationRegisterQuery, NotUsed]],
120120
dispositions: List[DispositionType]
121-
): Map[ApplicantIncomeEnum, Future[List[BorrowerCharacteristic]]] = {
121+
): Map[ApplicantIncomeEnum, Future[Characteristics]] = {
122122
larsByIncome.map {
123123
case (income, lars) =>
124-
val characteristics = Future.sequence(
125-
List(
126-
raceBorrowerCharacteristic(lars, dispositions),
127-
ethnicityBorrowerCharacteristic(lars, dispositions),
128-
minorityStatusBorrowerCharacteristic(lars, dispositions)
129-
)
130-
)
124+
val characteristics =
125+
for {
126+
r <- raceBorrowerCharacteristic(lars, dispositions)
127+
e <- ethnicityBorrowerCharacteristic(lars, dispositions)
128+
m <- minorityStatusBorrowerCharacteristic(lars, dispositions)
129+
} yield Characteristics(r, e, m)
131130
income -> characteristics
132131
}
133132
}

0 commit comments

Comments
 (0)