Skip to content

Commit d288187

Browse files
committed
Predicate parameters are in alphabetical order.
1 parent 29dd311 commit d288187

File tree

6 files changed

+57
-22
lines changed

6 files changed

+57
-22
lines changed

src/main/scala/com/marcastr0/prolog_utils/JSONToProlog.scala

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import spray.json._
44
import DefaultJsonProtocol._
55
import net.liftweb.util.StringHelpers.{camelify, camelifyMethod}
66

7+
import scala.collection.immutable.ListMap
8+
79
object JSONToProlog {
810

911
def toProlog(json: JsValue): String = {
@@ -12,9 +14,13 @@ object JSONToProlog {
1214
val result = for {
1315
predicate <- predicates
1416
predicateName = camelifyMethod(predicate.replaceAll("-", "_"))
15-
parameters = data.getOrElse(predicate, Seq()).headOption.getOrElse(Map()).keysIterator.map(camelify).mkString(",")
17+
parameters = data.getOrElse(predicate, Seq()).headOption.getOrElse(Map())
18+
.keysIterator.toSeq.sortWith(_ < _).map(s => camelify(s.toLowerCase)).mkString(",")
1619
comment = if (!parameters.isEmpty) s"% $predicateName($parameters)." else ""
17-
facts = data.getOrElse(predicate, Seq()).map(x => s"$predicateName(${x.values.map(JsValue2String).mkString(",")}).")
20+
facts = data.getOrElse(predicate, Seq()).map(x => {
21+
val sorted = ListMap(x.toSeq.sortBy(_._1):_*)
22+
s"$predicateName(${sorted.values.map(JsValue2String).mkString(",")})."
23+
})
1824
} yield (List(comment) ++ facts).mkString("\n")
1925
result.mkString("\n")
2026
}

src/test/resources/test.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
{"name": "'New York'", "population": 18593220}
1313
],
1414
"country": [
15-
{"name": "'Japan'", "capital": "'Tokyo'", "population": 127239952},
16-
{"name": "'India'", "capital": "'New Delhi'", "population": 1358381702},
17-
{"name": "'China'", "capital": "'Beijing'", "population": 1396368918},
18-
{"name": "'Brazil'", "capital": "'Brasilia'", "population": 213274171},
19-
{"name": "'Mexico'", "capital": "'Mexico City'", "population": 132018658},
20-
{"name": "'Egypt'", "capital": "'Cairo'", "population": 97265337},
21-
{"name": "'United States'", "capital": "'Washington DC'", "population": 328686462}
15+
{"capital": "'Tokyo'", "name": "'Japan'", "population": 127239952},
16+
{"capital": "'New Delhi'", "name": "'India'", "population": 1358381702},
17+
{"capital": "'Beijing'", "name": "'China'", "population": 1396368918},
18+
{"capital": "'Brasilia'", "name": "'Brazil'", "population": 213274171},
19+
{"capital": "'Mexico City'", "name": "'Mexico'", "population": 132018658},
20+
{"capital": "'Cairo'", "name": "'Egypt'", "population": 97265337},
21+
{"capital": "'Washington DC'", "name": "'United States'", "population": 328686462}
2222
]
2323
}

src/test/resources/test.pl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@
99
city('Osaka',20237645).
1010
city('Cairo',18771769).
1111
city('New York',18593220).
12-
% country(Name,Capital,Population).
13-
country('Japan','Tokyo',127239952).
14-
country('India','New Delhi',1358381702).
15-
country('China','Beijing',1396368918).
16-
country('Brazil','Brasilia',213274171).
17-
country('Mexico','Mexico City',132018658).
18-
country('Egypt','Cairo',97265337).
19-
country('United States','Washington DC',328686462).
12+
% country(Capital,Name,Population).
13+
country('Tokyo','Japan',127239952).
14+
country('New Delhi','India',1358381702).
15+
country('Beijing','China',1396368918).
16+
country('Brasilia','Brazil',213274171).
17+
country('Mexico City','Mexico',132018658).
18+
country('Cairo','Egypt',97265337).
19+
country('Washington DC','United States',328686462).

src/test/resources/test2.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"turno": [
3+
{
4+
"DATA_DATE": 1524106800,
5+
"END_TIME": 1524160800,
6+
"ENTRY_TIME": 1524135600,
7+
"ID_EMPLOYEE": 1429,
8+
"ID_TIMETABLE": 834,
9+
"LOCATION_ID": "'J512'"
10+
},
11+
{
12+
"DATA_DATE": 1524106800,
13+
"END_TIME": 1524168000,
14+
"ENTRY_TIME": 1524142800,
15+
"ID_EMPLOYEE": 1578,
16+
"ID_TIMETABLE": 835,
17+
"LOCATION_ID": "'J512'"
18+
}
19+
]
20+
}

src/test/resources/test2.pl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
% turno(DataDate,EndTime,EntryTime,IdEmployee,IdTimetable,LocationId).
2+
turno(1524106800,1524160800,1524135600,1429,834,'J512').
3+
turno(1524106800,1524168000,1524142800,1578,835,'J512').

src/test/scala/com/marcastr0/prolog_utils/JSONToPrologSpec.scala

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ class JSONToPrologSpec extends FlatSpec with Matchers {
1515
it should "convert an object with one predicate" in {
1616
val json ="""{ "parent": [ { "parent": "mike", "child": "marcia" } ] }"""
1717
val prolog =
18-
"""% parent(Parent,Child).
19-
|parent(mike,marcia).""".stripMargin
18+
"""% parent(Child,Parent).
19+
|parent(marcia,mike).""".stripMargin
2020
Convert.toProlog(json.parseJson) shouldEqual prolog
2121
}
2222

@@ -31,9 +31,9 @@ class JSONToPrologSpec extends FlatSpec with Matchers {
3131
|{ "code": "'YYZ'", "city": "'Toronto'" },
3232
|{ "code": "'SCL'", "city": "'Santiago'" } ] }""".stripMargin
3333
val prolog =
34-
"""% airport(Code,City).
35-
|airport('YYZ','Toronto').
36-
|airport('SCL','Santiago').""".stripMargin
34+
"""% airport(City,Code).
35+
|airport('Toronto','YYZ').
36+
|airport('Santiago','SCL').""".stripMargin
3737
Convert.toProlog(json.parseJson) shouldEqual prolog
3838
}
3939

@@ -60,4 +60,10 @@ class JSONToPrologSpec extends FlatSpec with Matchers {
6060
val prolog = Source.fromResource("test.pl").getLines.mkString("\n")
6161
Convert.toProlog(json.parseJson) shouldEqual prolog
6262
}
63+
64+
it should "have the parameters ordered alphabetically" in {
65+
val json = Source.fromResource("test2.json").getLines.mkString
66+
val prolog = Source.fromResource("test2.pl").getLines.mkString("\n")
67+
Convert.toProlog(json.parseJson) shouldEqual prolog
68+
}
6369
}

0 commit comments

Comments
 (0)