Czy istnieje prosty sposób na uzyskanie strumienia jako wyjścia RowParser?
DanyrowParser
typuRowParser[Photo]
w ten sposób analizujesz listę wierszy pochodzących z tabeliphoto
, według przykładów kodu, które widziałem do tej pory:
def getPhotos(album: Album): List[Photo] = DB.withConnection { implicit c =>
SQL("select * from photo where album = {album}").on(
'album -> album.id
).as(rowParser *)
}
Gdzie*
operator tworzy parser typuResultSetParser[List[Photo]]
. Zastanawiałem się teraz, czy możliwe jest uzyskanie parsera dającego aStream
(myśląc, że bycie bardziej leniwym jest zawsze lepsze), ale wymyśliłem to tylko:
def getPhotos(album: Album): Stream[Photo] = DB.withConnection { implicit c =>
SQL("select * from photo where album = {album}").on(
'album -> album.id
)() collect (rowParser(_) match { case Success(photo) => photo })
}
To działa, ale wydaje się zbyt skomplikowane. Mogę oczywiście zadzwonićtoStream
naList
Dostaję od pierwszej funkcji, ale moim celem było tylko zastosowanierowParser
w wierszach, które są faktycznie czytane. Czy istnieje łatwiejszy sposób osiągnięcia tego celu?
EDIT: Wiem tolimit
należy użyć w zapytaniu, jeśli liczba interesujących wierszy jest znana wcześniej. Jestem również świadomy, że w wielu przypadkach i tak wykorzystasz cały wynik, więc bycie leniwym nie poprawi wydajności. Ale może się zdarzyć, że zaoszczędzisz kilka cykli, np. jeśli z jakiegoś powodu masz kryteria wyszukiwania, których nie możesz lub nie chcesz wyrazić w SQL. Pomyślałem więc, że to dziwne, biorąc pod uwagę fakt, że anorm zapewnia sposób na uzyskanieStream
zSqlRow
, Nie znalazłem prostego sposobu na zastosowanieRowParser
Na tym.