Base document with multiple instances

15 views
Skip to first unread message

stephanos

unread,
Mar 1, 2013, 9:08:21 AM3/1/13
to rogue...@googlegroups.com
I'm stuck on this all day already, I hope someone has an idea how to solve this.

Basically I have a base document that has a few instances (db.doc0, db.doc1 etc.):

import com.foursquare.rogue.LiftRogue._
import net.liftweb.mongodb.record.{MongoRecord, MongoMetaRecord}
 
// ==== BASE
 
trait BaseDoc[T <: MongoRecord[T]]
extends MongoRecord[T] {
 
self: T =>
 
object id
}
 
trait BaseMeta[T <: BaseDoc[T]]
extends MongoMetaRecord[T] {
 
self: T =>
}
 
// ==== DOC #1
 
class BaseDoc1 extends BaseDoc[BaseDoc1] {
def meta = BaseMeta1
}
object BaseMeta1 extends BaseDoc1 with BaseMeta[BaseDoc1]
 
// ==== DOC #2
 
class BaseDoc2 extends BaseDoc[BaseDoc2] {
def meta = BaseMeta2
}
object BaseMeta2 extends BaseDoc2 with BaseMeta[BaseDoc2]
 
// ==== QUERY
 
case class Mod(num: Int) {
def doc: BaseMeta[_] with BaseDoc[_] = // WRONG
num % 2 match {
case 0 => BaseMeta1
case _ => BaseMeta2
}
}
 
object Main {
 
val doc = Mod(0).doc
doc.where(_._id eqs 42)
}


The error I'm getting is

error: value where is not a member of BaseMeta[_] with BaseDoc[_]
doc.where(_._id eqs 42)

Obviously the implicit conversation is not triggered because the return type of doc is wrong.

But how do I fix it?


Regards
Stephan

stephanos

unread,
Mar 2, 2013, 3:49:39 AM3/2/13
to rogue...@googlegroups.com
I think I got it:

import net.liftweb.mongodb.record.field.ObjectIdField
import net.liftweb.mongodb.record.{MongoMetaRecord, MongoRecord}
import net.liftweb.record.field.IntField
 
// ==== BASE
 
trait BaseDoc
extends MongoRecord[BaseDoc] {
 
def id = _id.value
 
object _id extends ObjectIdField(this)
object int extends IntField(this)
}
 
trait BaseMeta
extends MongoMetaRecord[BaseDoc] {
 
self: BaseDoc =>
}
 
// ==== DOC #1
 
class BaseDoc1 extends BaseDoc {
def meta = BaseMeta1
}
 
object BaseMeta1 extends BaseDoc1 with BaseMeta
 
// ==== DOC #2
 
class BaseDoc2 extends BaseDoc {
def meta = BaseMeta2
}
 
object BaseMeta2 extends BaseDoc2 with BaseMeta
 
// ==== QUERY
 
case class Mod(num: Int) {
 
def meta: BaseMeta with BaseDoc =
num % 2 match {
case 0 => BaseMeta1
case _ => BaseMeta2
}
}
 
object Main extends App {
import com.foursquare.rogue.LiftRogue._
 
val doc = Mod(0).meta
doc.where(_.int eqs 42)
}

Reply all
Reply to author
Forward
0 new messages