/ / Перекладіть один клас справи Scala з певною структурою в інший з іншою структурою - scala, elasticsearch, elastic4s

Оформлення одного шару Scala з певною структурою на іншу з іншою структурою - scala, elasticsearch, elastic4s

Я будую API Scala, з яким розмовляю Еластичний пошук використовуючи Еластичні4.

Я отримав відповідь від Elastic4s такого типу SearchHit і має структуру:

SearchHit(id: String,
index: String,
`type`: String,
score: Float,
private val _source: Map(name: String,
code: String,
location: Map(lat: Double, lon:Double)
)
)

Мені потрібно зіставити цей об’єкт з іншим об’єктом структури:

case class Location(id: Option[String] = None, location: GeoLocation, code: String, name: String)

де GeoLocation це:

case class GeoLocation(lat: Double, lon: Double)

Як бачите, більшість полів, до яких мені потрібно зіставити Location знаходяться всередині _source Карта, але мені також потрібна id на карту.

Відповіді:

0 для відповіді № 1

Elastic4s пропонує клас класів, який допоможе. Це називається HitReader (хоча це може змінити назву у версії 6 - буде випущено), і якщо ви застосуєте це для свого типу Location то можна зателефонувати .to[T] на результати пошуку.

object LocationHitReader extends HitReader {
def read(hit: Hit): Either[Throwable, T] = ...
}

Здійснюючи це вручну, вам не надто багатодалі, ніж ви знаходитесь на даний момент, але elastic4s надає реалізації із використанням загальних бекендів json - Jackson, Json4s, Circe, Spray-Json, так що вам не потрібно нічого робити.

Якщо ви використовуєте Джексон наприклад, тоді ви додаєте elastic4s-jackson до шляху до вашого класу, а потім додайте наступний імпорт над результатами пошуку.

import ElasticJackson.Implicits._

Потім за результатами пошуку ви можете зателефонувати .to[Location] щоб отримати Seq[Location] або .safeTo[Location] щоб отримати Seq[Either[T, Location]

Щоб також отримати ідентифікатор, ви можете створити власний HitReader який делегатів у бібліотеці створив, додавши ідентифікатор.