blob: 377066e2a8941fdf01f35109d495c5b8725c4cd0 [file] [log] [blame]
package io.prediction.commons.modeldata
import io.prediction.commons.Config
import io.prediction.commons.Spec
import io.prediction.commons.settings.{ Algo, App }
import org.specs2._
import org.specs2.specification.Step
import com.mongodb.casbah.Imports._
import com.github.nscala_time.time.Imports._
class ItemRecScoresSpec extends Specification {
def is = s2"""
PredictionIO Model Data Item Recommendation Scores Specification
ItemRecScores can be implemented by:
1. MongoItemRecScores ${mongoItemRecScores}
"""
def mongoItemRecScores = s2"""
MongoItemRecScores should
- behave like any ItemRecScores implementation ${itemRecScores(newMongoItemRecScores)}
(clean up database after test) ${Step(Spec.mongoClient(mongoDbName).dropDatabase())}
"""
def itemRecScores(itemRecScores: ItemRecScores) = s2"""
inserting and getting 3 ItemRecScores ${insert(itemRecScores)}
getting Top N Iids ${getTopNIids(itemRecScores)}
delete ItemRecScores by algoid ${deleteByAlgoid(itemRecScores)}
existence by Algo ${existByAlgo(itemRecScores)}
"""
val mongoDbName = "predictionio_modeldata_mongoitemrecscore_test"
def newMongoItemRecScores = new mongodb.MongoItemRecScores(
new Config, Spec.mongoClient(mongoDbName))
def insert(itemRecScores: ItemRecScores) = {
implicit val app = App(
id = 0,
userid = 0,
appkey = "",
display = "",
url = None,
cat = None,
desc = None,
timezone = "UTC"
)
implicit val algo = Algo(
id = 110101,
engineid = 0,
name = "",
infoid = "abc",
command = "",
params = Map(),
settings = Map(),
modelset = true,
createtime = DateTime.now,
updatetime = DateTime.now,
status = "deployed",
offlineevalid = None,
offlinetuneid = None,
loop = None,
paramset = None
)
val itemScores = List(ItemRecScore(
uid = "testUser",
iids = Seq("testUserItem4", "testUserItem3", "testUserItem2",
"testUserItem1"),
scores = Seq(999, 124.678, 10, -5.6),
itypes = Seq(List("invalid"), List("7", "8", "9"), List("4", "5", "6"),
List("1", "2", "3")),
appid = app.id,
algoid = algo.id,
modelset = algo.modelset
), ItemRecScore(
uid = "testUser2",
iids = Seq("b", "c", "d", "e"),
scores = Seq(8, 5.4, 2, 1),
itypes = Seq(List("invalid"), List("7"), List("6"), List("1", "2", "3")),
appid = app.id,
algoid = algo.id,
modelset = algo.modelset
), ItemRecScore(
uid = "testUser3",
iids = Seq("b", "c", "e", "s"),
scores = Seq(999, 124.678, 10, -5.6),
itypes = Seq(List("1"), List("7", "8", "9"), List("4", "5", "6"),
List("1")),
appid = app.id,
algoid = algo.id,
modelset = algo.modelset
))
val dbItemScores = itemRecScores.insert(itemScores)
val results = itemRecScores.getByUid("testUser")
val results2 = itemRecScores.getByUid("testUser2")
val results3 = itemRecScores.getByUid("testUser3")
results must beSome(dbItemScores(0)) and
(results2 must beSome(dbItemScores(1))) and
(results3 must beSome(dbItemScores(2)))
}
def getTopNIids(itemRecScores: ItemRecScores) = {
implicit val app = App(
id = 234,
userid = 0,
appkey = "",
display = "",
url = None,
cat = None,
desc = None,
timezone = "UTC")
implicit val algo = Algo(
id = 234,
engineid = 0,
name = "",
infoid = "abc",
command = "",
params = Map(),
settings = Map(),
modelset = true,
createtime = DateTime.now,
updatetime = DateTime.now,
status = "deployed",
offlineevalid = None,
offlinetuneid = None,
loop = None,
paramset = None)
val itemScores = List(ItemRecScore(
uid = "testUser",
iids = Seq("testUserItem10", "testUserItem8", "testUserItem4",
"testUserItem9", "testUserItem7", "testUserItem3", "testUserItem2",
"testUserItem6", "testUserItem1", "testUserItem5"),
scores = Seq(10000, 999, 999, 124.678, 124.678, 124.678, 10, 10, -5.6,
-5.6),
itypes = Seq(List("invalid"), List("invalid"), List("invalid"),
List("1", "2", "3"), List("1", "2", "4"), List("3"),
List("5", "6", "7"), List("5", "6", "8"), List("1", "2", "3"),
List("1", "2", "3")),
appid = app.id,
algoid = algo.id,
modelset = true
))
val dbItemScores = itemScores map {
itemRecScores.insert(_)
}
val resultsAllTop5 = itemRecScores.getTopNIidsAndScores("testUser", 5, None)
val resultsAllTop1 = itemRecScores.getTopNIidsAndScores("testUser", 1, None)
val resultsAllTop0 = itemRecScores.getTopNIidsAndScores("testUser", 0, None)
val results23Top4 = itemRecScores.getTopNIids("testUser", 4,
Some(List("2", "3"))).toSeq
val results23Top100 = itemRecScores.getTopNIids("testUser", 100,
Some(List("2", "3"))).toSeq
val results8Top4 = itemRecScores.getTopNIids("testUser", 4,
Some(List("8"))).toSeq
val results8Top0 = itemRecScores.getTopNIids("testUser", 0,
Some(List("8"))).toSeq
val resultUnknownAllTop4 = itemRecScores.getTopNIids("unknown", 4,
None).toSeq
val resultUnknown18Top4 = itemRecScores.getTopNIids("unknown", 4,
Some(List("1", "8"))).toSeq
resultsAllTop5 must beEqualTo(Seq(("testUserItem10", 10000.0),
("testUserItem8", 999.0), ("testUserItem4", 999.0),
("testUserItem9", 124.678), ("testUserItem7", 124.678))) and
(resultsAllTop1 must beEqualTo(Seq(("testUserItem10", 10000)))) and
(resultsAllTop0 must beEqualTo(Seq(("testUserItem10", 10000),
("testUserItem8", 999), ("testUserItem4", 999),
("testUserItem9", 124.678), ("testUserItem7", 124.678),
("testUserItem3", 124.678), ("testUserItem2", 10),
("testUserItem6", 10), ("testUserItem1", -5.6),
("testUserItem5", -5.6)))) and
(results23Top4 must beEqualTo(Seq("testUserItem9", "testUserItem7",
"testUserItem3", "testUserItem1"))) and
(results23Top100 must beEqualTo(Seq("testUserItem9", "testUserItem7",
"testUserItem3", "testUserItem1", "testUserItem5"))) and
(results8Top4 must beEqualTo(Seq("testUserItem6"))) and
(results8Top0 must beEqualTo(Seq("testUserItem6"))) and
(resultUnknownAllTop4 must beEqualTo(Seq())) and
(resultUnknown18Top4 must beEqualTo(Seq()))
}
def deleteByAlgoid(itemRecScores: ItemRecScores) = {
implicit val app = App(
id = 0,
userid = 0,
appkey = "",
display = "",
url = None,
cat = None,
desc = None,
timezone = "UTC"
)
val algo1 = Algo(
id = 1,
engineid = 0,
name = "algo1",
infoid = "abc",
command = "",
params = Map(),
settings = Map(),
modelset = true,
createtime = DateTime.now,
updatetime = DateTime.now,
status = "deployed",
offlineevalid = None,
offlinetuneid = None,
loop = None,
paramset = None
)
val algo2 = algo1.copy(id = 2) // NOTE: different id
val itemScores1 = List(ItemRecScore(
uid = "deleteByAlgoidUser",
iids = Seq("testUserItem10", "testUserItem8", "testUserItem4",
"testUserItem9", "testUserItem7", "testUserItem3", "testUserItem2",
"testUserItem6", "testUserItem1", "testUserItem5"),
scores = Seq(10000, 999, 999, 124.678, 124.678, 124.678, 10, 10, -5.6,
-5.6),
itypes = Seq(List("invalid"), List("invalid"), List("invalid"),
List("1", "2", "3"), List("1", "2", "4"), List("2", "3", "4"),
List("5", "6", "7"), List("5", "6", "8"), List("1", "2", "3"),
List("1", "2", "3")),
appid = app.id,
algoid = algo1.id,
modelset = algo1.modelset
), ItemRecScore(
uid = "deleteByAlgoidUser2",
iids = Seq("a", "b", "c", "d"),
scores = Seq(10, 9, 8, 7),
itypes = Seq(List("invalid"), List("5", "6", "7"), List("5", "6", "8"),
List("4")),
appid = app.id,
algoid = algo1.id,
modelset = algo1.modelset
))
val itemScores2 = List(ItemRecScore(
uid = "deleteByAlgoidUser",
iids = Seq("testUserItem10", "testUserItem8", "testUserItem4",
"testUserItem9", "testUserItem7", "testUserItem3", "testUserItem2",
"testUserItem6", "testUserItem1", "testUserItem5"),
scores = Seq(10000, 999, 999, 124.678, 124.678, 124.678, 10, 10, -5.6,
-5.6),
itypes = Seq(List("invalid"), List("invalid"), List("invalid"),
List("1", "2", "3"), List("1", "2", "4"), List("2", "3", "4"),
List("5", "6", "7"), List("5", "6", "8"), List("1", "2", "3"),
List("1", "2", "3")),
appid = app.id,
algoid = algo2.id,
modelset = algo2.modelset
), ItemRecScore(
uid = "deleteByAlgoidUser2",
iids = Seq("a", "b", "c", "d"),
scores = Seq(10, 9, 8, 7),
itypes = Seq(List("invalid"), List("5", "6", "7"), List("5", "6", "8"),
List("4")),
appid = app.id,
algoid = algo2.id,
modelset = algo2.modelset
))
val dbItemScores1 = itemScores1 map {
itemRecScores.insert(_)
}
val dbItemScores2 = itemScores2 map {
itemRecScores.insert(_)
}
val results1 = itemRecScores.getByUid("deleteByAlgoidUser")(app, algo1)
val results1u2 = itemRecScores.getByUid("deleteByAlgoidUser2")(app, algo1)
val results2 = itemRecScores.getByUid("deleteByAlgoidUser")(app, algo2)
val results2u2 = itemRecScores.getByUid("deleteByAlgoidUser2")(app, algo2)
itemRecScores.deleteByAlgoid(algo1.id)
val results1b = itemRecScores.getByUid("deleteByAlgoidUser")(app, algo1)
val results1bu2 = itemRecScores.getByUid("deleteByAlgoidUser2")(app, algo1)
val results2b = itemRecScores.getByUid("deleteByAlgoidUser")(app, algo2)
val results2bu2 = itemRecScores.getByUid("deleteByAlgoidUser2")(app, algo2)
itemRecScores.deleteByAlgoid(algo2.id)
val results2c = itemRecScores.getByUid("deleteByAlgoidUser")(app, algo2)
val results2cu2 = itemRecScores.getByUid("deleteByAlgoidUser2")(app, algo2)
results1 must beSome(dbItemScores1(0)) and
(results1u2 must beSome(dbItemScores1(1))) and
(results2 must beSome(dbItemScores2(0))) and
(results2u2 must beSome(dbItemScores2(1))) and
(results1b must beNone) and
(results1bu2 must beNone) and
(results2b must beSome(dbItemScores2(0))) and
(results2bu2 must beSome(dbItemScores2(1))) and
(results2c must beNone) and
(results2cu2 must beNone)
}
def existByAlgo(itemRecScores: ItemRecScores) = {
implicit val app = App(
id = 345,
userid = 0,
appkey = "",
display = "",
url = None,
cat = None,
desc = None,
timezone = "UTC"
)
val algo1 = Algo(
id = 345,
engineid = 0,
name = "",
infoid = "dummy",
command = "",
params = Map(),
settings = Map(),
modelset = true,
createtime = DateTime.now,
updatetime = DateTime.now,
status = "deployed",
offlineevalid = None,
offlinetuneid = None,
loop = None,
paramset = None
)
val algo2 = algo1.copy(id = 3456)
itemRecScores.insert(ItemRecScore(
uid = "testUser",
iids = Seq("testUserItem4"),
scores = Seq(999),
itypes = Seq(List("invalid")),
appid = app.id,
algoid = algo1.id,
modelset = algo1.modelset
))
itemRecScores.existByAlgo(algo1) must beTrue and
(itemRecScores.existByAlgo(algo2) must beFalse)
}
}