Ну ... код будет выдавать результат в соответствии с тем, что вы написали, а не в соответствии с тем, что вы хотите. В центре внимания этой части ...
yield (message, sender ,mRecipients)
Вы дающий кортеж (message, sender, mRecipents)
И вы сделали это внутри для понимания
mRecipients <- recipients if mRecipients.targetID === targetID
message <- messages if message.senderID === senderID || message.id === mRecipients.messageID
sender <- Users.users if sender.id === m.senderID
Здесь каждый из выражений, как recipients if mRecipients.targetID === targetID
оценивает к Query
Монада.
Чтобы понять, что случилось с этим, он очень похож на следующий и позволяет думать, что происходит, когда мы делаем это,
scala>:pa
// Entering paste mode (ctrl-D to finish
for{
i <- List(1, 2, 3)
j <- List(1, 2, 3)
k <- List(1, 2, 3)
} yield(i, j, k)
// Exiting paste mode, now interpreting.
res1: List[(Int, Int, Int)] = List((1,1,1), (1,1,2), (1,1,3), (1,2,1),
(1,2,2), (1,2,3), (1,3,1), (1,3,2), (1,3,3), (2,1,1), (2,1,2), (2,1,3),
(2,2,1), (2,2,2), (2,2,3), (2,3,1), (2,3,2), (2,3,3), (3,1,1), (3,1,2),
(3,1,3), (3,2,1), (3,2,2), (3,2,3), (3,3,1), (3,3,2), (3,3,3))
Проще говоря, for comprehensions
сделать что-то похожее на развертке в monad
и получить итератор из значений внутри него ... и затем снова обматывает полученное значение в monad
.
Так что, если вы soemthing как,
scala>:pa
// Entering paste mode (ctrl-D to finish
for{
l <- Some(List(1, 2, 3))
i <- Some(1)
} yield (l, i)
// Exiting paste mode, now interpreting.
res1: Option[(List[Int], Int)] = Some((List(1, 2, 3),1))
Также ... Ваша модель данных чувствует своего рода неправильно.
Что такое recipients
?? Скажите мне, что, возможно, я смогу решить вашу проблему лучше и эффективнее.
Но учитывая то, что я могу догадаться о вашей модели данных, теперь, если вы хотите, список получателей правильный путь, вы должны сделать что-то подобное,
// List[ (Message, List[ Recipients]) ]
val messageAndRecipentsList = (for {
// First get all possible recipents
possibleRecipient <- recipients if possibleRecipient.targetID === targetID
// Now get all relevant messages for sender and possibleRecipeint
message <- messages if message.senderID === senderID || message.id === possibleRecipient.messageID
// Now get list of recipents for each of these messages
messageRecipients <- for {
messageRecipient <- recipients if messageRecipient.messageID === message.id
} yield (messageRecipient).list
} yield (message, messageRecipients)).list
// Now lets add sender for each of these messages, I am guessing sender
// should be exactly one for each sendorId. So... instead of querying for
// same user for every message lets just query it once and add to every
// tuple of the above list,
val sender = (for {
sender <- Users.users if sender.id === senderID
} yield sender).list.head
val finalList = messageAndRecipentsList.map ({
case (message, msaageRecipents) => new FullMessage(message, sender, messageRecipients)
})
Что такое '' recipients' и messages'? ? Вам нужно больше узнать о них. Этот вопрос является неполным. –