SlideShare ist ein Scribd-Unternehmen logo
1 von 13
Downloaden Sie, um offline zu lesen
Implementation and testing DAO layer
with native DSL with using
the implicit classes mechanism in Scala
Speaker:
Hryhoriy Kravtsov, PhD.,
R&D Chief Officer,
VertaMedia LLC
DAO Pattern
Data Access Object Pattern [1] or DAO pattern is used to separate low level
data accessing API or operations from high level business services. Following
are the participants in Data Access Object Pattern.
Data Access Object Interface - This interface defines the standard operations
to be performed on a model object(s).
Data Access Object concrete class - This class implements above interface.
This class is responsible to get data from a data source which can be
database / xml or any other storage mechanism.
Model Object or Value Object - This object is simple POJO containing get/set
methods to store data retrieved using DAO class.
Repository Pattern
A Repository [2] mediates between the domain and data mapping
layers, acting like an in-memory domain object collection. Client
objects construct query specifications declaratively and submit them to
Repository for satisfaction. Objects can be added to and removed from
the Repository, as they can from a simple collection of objects, and the
mapping code encapsulated by the Repository will carry out the
appropriate operations behind the scenes.
Conceptually, a Repository encapsulates the set of objects persisted
in a data store and the operations performed over them, providing a
more object-oriented view of the persistence layer. Repository also
supports the objective of achieving a clean separation and one-way
dependency between the domain and data mapping layers.
Repository vs DAO
DAO pattern [3] offers only a loosely defined contract. It suffers from
getting potential misused and bloated implementations.
The repository pattern uses a metaphor of a Collection. This metaphor
gives the pattern a tight contract and make it easier to understand by your
fellow colleagues.
Repository and DAO [4], in conclusion, have similar intentions only that the
Repository is a higher level concept dealing directly with business/domain
objects, while DAO is more lower level, closer to the database/storage
dealing only with data. A (micro)ORM is a DAO that is used by a Repository.
For data-centric apps, a repository and DAO are interchangeable
because the ‘business’ objects are simple data.
Implicit classes
Scala 2.10 [5] introduced a new feature called implicit classes.
An implicit class is a class marked with the implicit keyword.
This keyword makes the class’ primary constructor available for
implicit conversions when the class is in scope.
object Helpers {
implicit class IntWithTimes(x: Int) {
def times[A](f: => A): Unit = {
def loop(current: Int): Unit =
if(current > 0) {
f
loop(current - 1)
}
loop(x)
}
}
}
scala> import Helpers._
import Helpers._
scala> 5 times println("HI")
HI
HI
HI
HI
HI
Restrictions
1. They must be defined inside of another
trait/class/object.
object Helpers {
implicit class RichInt(x: Int) // OK!
}
implicit class RichDouble(x: Double) // BAD!
2. They may only take one non-implicit argument in their constructor.
implicit class RichDate(date: java.util.Date) // OK!
implicit class Indexer[T](collecton: Seq[T], index: Int) // BAD!
implicit class Indexer[T](collecton: Seq[T])(implicit index: Index) // OK!
While it’s possible to create an implicit class with more than one
non-implicit argument, such classes aren’t used during implicit lookup.
3. There may not be any method,
member or object in scope with the same
name as the implicit class.
Note: This means an implicit class cannot
be a case class.
object Bar
implicit class Bar(x: Int) // BAD!
val x = 5
implicit class x(y: Int) // BAD!
implicit case class Baz(x: Int) // BAD!
Our DAO
package object dao {
import scala.concurrent.ExecutionContext.Implicits.global
abstract class AbstractDao[T](collection: BSONCollection)(implicit handler: BSONDocumentReader[T]
with BSONDocumentWriter[T] with BSONHandler[BSONDocument, T]) {
def dropCollection: Future[Unit] = collection.drop()
def insert(doc: T): Future[Boolean] = collection.insert[T](doc).map(_.writeErrors.isEmpty)
def count(): Future[Int] = collection.count()
def find(query: BSONDocument): Future[List[T]] = collection.find(query).cursor[T]().collect[List]()
def findOne(query: BSONDocument = BSONDocument()): Future[Option[T]] = collection.find(query).one[T]
def update(selector: BSONDocument, update: BSONDocument): Future[Boolean] = collection.update(selector, update)
.map(_.writeErrors.isEmpty)
def remove(query: BSONDocument): Future[Boolean] = collection.remove(query).map(_.writeErrors.isEmpty)
}
implicit class DefaultMongoWrapper(db: DefaultDB) {
implicit val partnerConfHandler = Macros.handler[PartnerConfig]
...
object partners extends AbstractDao[PartnerConfig](db(“partners”)) {
def getActivePartnerConfigs: Future[List[PartnerConfig]] = {
val query = BSONDocument("active" -> true)
find(query)
}
def byPartnerNameAndUrl(partnerName: String, url: String): Future[Option[PartnerConfig]] = {
val query = BSONDocument("name" -> partnerName, "url" -> url)
findOne(query)
}
}
...
}
}
DAO in Action
class AnalyzerActor(db: DefaultDB) extends NamedLoggingActor {
import scala.concurrent.ExecutionContext.Implicits.global
import com.vertamedia.<>.dao._
private def replaceSample(sample: Sample): Future[Boolean] = {
logger.debug("Replace old sample with new one.")
for {
diffRemoveResult <- db.diffSample.removeByPartnerNameAndUrl(sample.conf.name, sample.conf.url)
sampleRemoveResult <- db.sample.removeByPartnerNameAndUrl(sample.conf.name, sample.conf.url) if diffRemoveResult
insertResult <- db.sample.insert(sample) if sampleRemoveResult
} yield {
insertResult
}
}
override def receive: Receive = {
case sample: Sample =>
...
}
override val actorName: String = Actors.Analyzer.name
}
The Legend:
Code with using DAO pattern
Code with using
Repository pattern
Please, compare with info from the official site of MongoDB:
Embedded MongoDB
import de.flapdoodle.embed.mongo._
trait EmbeddedMongoTestFixture extends FunSpec with BeforeAndAfterAll {
private val host = MongoConnection.DefaultHost
private val version = Version.V3_0_5
private[this] lazy val port = { val socket = new ServerSocket(0); val port = socket.getLocalPort
socket.close(); port }
private[this] lazy val net = new Net(host, port, Network.localhostIsIPv6())
private[this] lazy val mongod: MongodProcess = {
val runtime = MongodStarter.getDefaultInstance
val mongodConfig = new MongodConfigBuilder().version(version).net(net).build()
runtime.prepare(mongodConfig).start()
}
private[this] lazy val _db = mongoDB(host, port, s"test-${UUID.randomUUID()}")
def mongoDB(host: String, port: Int, name: String): DefaultDB = {
import scala.concurrent.ExecutionContext.Implicits.global
val driver = new MongoDriver(); val connection: MongoConnection = driver.connection(List(s"$host:$port"))
connection(name)
}
def startMongo(): Unit = { val _mongod = mongod; db }
override def beforeAll() = { super.beforeAll(); startMongo() }
def shutDownMongo(): Unit = { _db.connection.close(); mongod.stop() }
override def afterAll() = { shutDownMongo(); super.afterAll()}
def db: DefaultDB = _db
}
DAO Testing in Action
class MongoDaoTest extends EmbeddedMongoTestFixture with BeforeAndAfterEach {
val timeOut = 5 seconds
import scala.concurrent.ExecutionContext.Implicits.global
val config = AppConfiguration(
analyzerPoolSize = 3, vastHttpTimeOut = Interval(5, "seconds"), objectHttpTimeOut = Interval(7, "seconds")
)
override def beforeEach() = {
...
Await.result(db.config.insert(config), timeOut)
...
}
override def afterEach() = {
Await.result( for {
_ <- db.partners.dropCollection()
...
} yield (), timeOut)
}
describe("Config DAO should") {
it("return exist config") {
val actual = Await.result(db.config.getConfig, timeOut)
assert(actual === config)
}
....
}
}
The Legend:
Code with using DAO pattern
Code with using
Repository pattern
Advantages and
Disadvantages
YES!
- easy code reading for DAO/compact Repository
- easy supporting for DAO/compact Repository
- familiar notation with MongoShell
- easy to test
NO!
- difficult reading of “reach” Repository
- difficult supporting “reach” Repository
- hate to the implicit conversation
To use or not to use?
For your decision!
References
1. http://www.tutorialspoint.com/design_pattern/data_access_object_pattern.htm
2. http://martinfowler.com/eaaCatalog/repository.html
3. http://thinkinginobjects.com/2012/08/26/dont-use-dao-use-repository/
4. http://blog.sapiensworks.com/post/2012/11/01/Repository-vs-DAO.aspx
5. http://docs.scala-lang.org/overviews/core/implicit-classes.html
●
Thanks for attention!
Please, your questions...
Hryhoriy Kravtsov, PhD.,
R&D Chief Officer,
VertaMedia LLC,
h.kravtsov@vertamedia.com

Weitere ähnliche Inhalte

Was ist angesagt?

javascript
javascript javascript
javascript
Kaya Ota
 
Automatically generating-json-from-java-objects-java-objects268
Automatically generating-json-from-java-objects-java-objects268Automatically generating-json-from-java-objects-java-objects268
Automatically generating-json-from-java-objects-java-objects268
Ramamohan Chokkam
 

Was ist angesagt? (20)

Sax Dom Tutorial
Sax Dom TutorialSax Dom Tutorial
Sax Dom Tutorial
 
javascript objects
javascript objectsjavascript objects
javascript objects
 
Extending the Xbase Typesystem
Extending the Xbase TypesystemExtending the Xbase Typesystem
Extending the Xbase Typesystem
 
Linq Introduction
Linq IntroductionLinq Introduction
Linq Introduction
 
Java Tutorials
Java Tutorials Java Tutorials
Java Tutorials
 
Using Combine, SwiftUI and callAsFunction to build an experimental localizati...
Using Combine, SwiftUI and callAsFunction to build an experimental localizati...Using Combine, SwiftUI and callAsFunction to build an experimental localizati...
Using Combine, SwiftUI and callAsFunction to build an experimental localizati...
 
Ajax and JavaScript Bootcamp
Ajax and JavaScript BootcampAjax and JavaScript Bootcamp
Ajax and JavaScript Bootcamp
 
JavaScript - Chapter 4 - Types and Statements
 JavaScript - Chapter 4 - Types and Statements JavaScript - Chapter 4 - Types and Statements
JavaScript - Chapter 4 - Types and Statements
 
Object Oriented Programming in PHP
Object Oriented Programming in PHPObject Oriented Programming in PHP
Object Oriented Programming in PHP
 
Intermediate JavaScript
Intermediate JavaScriptIntermediate JavaScript
Intermediate JavaScript
 
JavsScript OOP
JavsScript OOPJavsScript OOP
JavsScript OOP
 
JavaScript - Chapter 8 - Objects
 JavaScript - Chapter 8 - Objects JavaScript - Chapter 8 - Objects
JavaScript - Chapter 8 - Objects
 
java training faridabad
java training faridabadjava training faridabad
java training faridabad
 
A Deeper look into Javascript Basics
A Deeper look into Javascript BasicsA Deeper look into Javascript Basics
A Deeper look into Javascript Basics
 
Reversing JavaScript
Reversing JavaScriptReversing JavaScript
Reversing JavaScript
 
Strings in Java
Strings in Java Strings in Java
Strings in Java
 
JavaScript Basics
JavaScript BasicsJavaScript Basics
JavaScript Basics
 
JavaScript - Chapter 6 - Basic Functions
 JavaScript - Chapter 6 - Basic Functions JavaScript - Chapter 6 - Basic Functions
JavaScript - Chapter 6 - Basic Functions
 
javascript
javascript javascript
javascript
 
Automatically generating-json-from-java-objects-java-objects268
Automatically generating-json-from-java-objects-java-objects268Automatically generating-json-from-java-objects-java-objects268
Automatically generating-json-from-java-objects-java-objects268
 

Andere mochten auch

AI&BigData Lab 2016. Григорий Кравцов: Модель вычислений на классификациях
AI&BigData Lab 2016. Григорий Кравцов: Модель вычислений на классификацияхAI&BigData Lab 2016. Григорий Кравцов: Модель вычислений на классификациях
AI&BigData Lab 2016. Григорий Кравцов: Модель вычислений на классификациях
GeeksLab Odessa
 
AI&BigData Lab 2016. Дмитрий Новицкий: cпайковые и бионические нейронные сети...
AI&BigData Lab 2016. Дмитрий Новицкий: cпайковые и бионические нейронные сети...AI&BigData Lab 2016. Дмитрий Новицкий: cпайковые и бионические нейронные сети...
AI&BigData Lab 2016. Дмитрий Новицкий: cпайковые и бионические нейронные сети...
GeeksLab Odessa
 

Andere mochten auch (13)

AI&BigData Lab 2016. Григорий Кравцов: Модель вычислений на классификациях
AI&BigData Lab 2016. Григорий Кравцов: Модель вычислений на классификацияхAI&BigData Lab 2016. Григорий Кравцов: Модель вычислений на классификациях
AI&BigData Lab 2016. Григорий Кравцов: Модель вычислений на классификациях
 
Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8.
Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8.Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8.
Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8.
 
AI&BigData Lab 2016. Константин Герасименко: MOLAP: Новые границы возможного.
AI&BigData Lab 2016. Константин Герасименко: MOLAP: Новые границы возможного.AI&BigData Lab 2016. Константин Герасименко: MOLAP: Новые границы возможного.
AI&BigData Lab 2016. Константин Герасименко: MOLAP: Новые границы возможного.
 
Java/Scala Lab 2016. Владимир Гарбуз: Написание безопасного кода на Java.
Java/Scala Lab 2016. Владимир Гарбуз: Написание безопасного кода на Java.Java/Scala Lab 2016. Владимир Гарбуз: Написание безопасного кода на Java.
Java/Scala Lab 2016. Владимир Гарбуз: Написание безопасного кода на Java.
 
AI&BigData Lab 2016. Руденко Петр: Особенности обучения, настройки и использо...
AI&BigData Lab 2016. Руденко Петр: Особенности обучения, настройки и использо...AI&BigData Lab 2016. Руденко Петр: Особенности обучения, настройки и использо...
AI&BigData Lab 2016. Руденко Петр: Особенности обучения, настройки и использо...
 
AI&BigData Lab 2016. Дмитрий Новицкий: cпайковые и бионические нейронные сети...
AI&BigData Lab 2016. Дмитрий Новицкий: cпайковые и бионические нейронные сети...AI&BigData Lab 2016. Дмитрий Новицкий: cпайковые и бионические нейронные сети...
AI&BigData Lab 2016. Дмитрий Новицкий: cпайковые и бионические нейронные сети...
 
AI&BigData Lab 2016. Анатолий Востряков: Перевод с "плохого" английского на "...
AI&BigData Lab 2016. Анатолий Востряков: Перевод с "плохого" английского на "...AI&BigData Lab 2016. Анатолий Востряков: Перевод с "плохого" английского на "...
AI&BigData Lab 2016. Анатолий Востряков: Перевод с "плохого" английского на "...
 
AI&BigData Lab 2016. Сарапин Виктор: Размер имеет значение: анализ по требова...
AI&BigData Lab 2016. Сарапин Виктор: Размер имеет значение: анализ по требова...AI&BigData Lab 2016. Сарапин Виктор: Размер имеет значение: анализ по требова...
AI&BigData Lab 2016. Сарапин Виктор: Размер имеет значение: анализ по требова...
 
AI&BigData Lab 2016. Игорь Костюк: Как приручить музыкальную рекомендательную...
AI&BigData Lab 2016. Игорь Костюк: Как приручить музыкальную рекомендательную...AI&BigData Lab 2016. Игорь Костюк: Как приручить музыкальную рекомендательную...
AI&BigData Lab 2016. Игорь Костюк: Как приручить музыкальную рекомендательную...
 
AI&BigData Lab 2016. Артем Чернодуб: Обучение глубоких, очень глубоких и реку...
AI&BigData Lab 2016. Артем Чернодуб: Обучение глубоких, очень глубоких и реку...AI&BigData Lab 2016. Артем Чернодуб: Обучение глубоких, очень глубоких и реку...
AI&BigData Lab 2016. Артем Чернодуб: Обучение глубоких, очень глубоких и реку...
 
Java/Scala Lab 2016. Руслан Шевченко: Несколько трюков scala-разработки, приг...
Java/Scala Lab 2016. Руслан Шевченко: Несколько трюков scala-разработки, приг...Java/Scala Lab 2016. Руслан Шевченко: Несколько трюков scala-разработки, приг...
Java/Scala Lab 2016. Руслан Шевченко: Несколько трюков scala-разработки, приг...
 
AI&BigData Lab 2016. Сергей Шельпук: Методология Data Science проектов
AI&BigData Lab 2016. Сергей Шельпук: Методология Data Science проектовAI&BigData Lab 2016. Сергей Шельпук: Методология Data Science проектов
AI&BigData Lab 2016. Сергей Шельпук: Методология Data Science проектов
 
AI&BigData Lab 2016. Александр Баев: Transfer learning - зачем, как и где.
AI&BigData Lab 2016. Александр Баев: Transfer learning - зачем, как и где.AI&BigData Lab 2016. Александр Баев: Transfer learning - зачем, как и где.
AI&BigData Lab 2016. Александр Баев: Transfer learning - зачем, как и где.
 

Ähnlich wie Java/Scala Lab 2016. Григорий Кравцов: Реализация и тестирование DAO слоя с нативным DSL с помощью неявных классов на примере взаимодействия с MongoDB через ReactiveMongo драйвер.

Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)
Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)
Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)
lennartkats
 
Ado.net &amp; data persistence frameworks
Ado.net &amp; data persistence frameworksAdo.net &amp; data persistence frameworks
Ado.net &amp; data persistence frameworks
Luis Goldster
 

Ähnlich wie Java/Scala Lab 2016. Григорий Кравцов: Реализация и тестирование DAO слоя с нативным DSL с помощью неявных классов на примере взаимодействия с MongoDB через ReactiveMongo драйвер. (20)

Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009
 
Zend framework 03 - singleton factory data mapper caching logging
Zend framework 03 - singleton factory data mapper caching loggingZend framework 03 - singleton factory data mapper caching logging
Zend framework 03 - singleton factory data mapper caching logging
 
Dao pattern
Dao patternDao pattern
Dao pattern
 
ADO.NET
ADO.NETADO.NET
ADO.NET
 
Data access
Data accessData access
Data access
 
ptu3-harvey-m-deitel-paul-j-deitel-tem-r-nieto-contributor-paul-j-deitel.pdf
ptu3-harvey-m-deitel-paul-j-deitel-tem-r-nieto-contributor-paul-j-deitel.pdfptu3-harvey-m-deitel-paul-j-deitel-tem-r-nieto-contributor-paul-j-deitel.pdf
ptu3-harvey-m-deitel-paul-j-deitel-tem-r-nieto-contributor-paul-j-deitel.pdf
 
Ado.net
Ado.netAdo.net
Ado.net
 
Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)
Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)
Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)
 
A Scala tutorial
A Scala tutorialA Scala tutorial
A Scala tutorial
 
JavaScript Miller Columns
JavaScript Miller ColumnsJavaScript Miller Columns
JavaScript Miller Columns
 
Ch23
Ch23Ch23
Ch23
 
Ch23 xml processing_with_java
Ch23 xml processing_with_javaCh23 xml processing_with_java
Ch23 xml processing_with_java
 
Structural pattern 3
Structural pattern 3Structural pattern 3
Structural pattern 3
 
Lotusphere 2007 BP301 Advanced Object Oriented Programming for LotusScript
Lotusphere 2007 BP301 Advanced Object Oriented Programming for LotusScriptLotusphere 2007 BP301 Advanced Object Oriented Programming for LotusScript
Lotusphere 2007 BP301 Advanced Object Oriented Programming for LotusScript
 
Java se7 features
Java se7 featuresJava se7 features
Java se7 features
 
Interview preparation for programming.pptx
Interview preparation for programming.pptxInterview preparation for programming.pptx
Interview preparation for programming.pptx
 
Unit No. 1 Introduction to Java.pptx
Unit No. 1 Introduction to Java.pptxUnit No. 1 Introduction to Java.pptx
Unit No. 1 Introduction to Java.pptx
 
Ado.net &amp; data persistence frameworks
Ado.net &amp; data persistence frameworksAdo.net &amp; data persistence frameworks
Ado.net &amp; data persistence frameworks
 
Gdd pydp
Gdd pydpGdd pydp
Gdd pydp
 
Introduction to Apache Tajo: Data Warehouse for Big Data
Introduction to Apache Tajo: Data Warehouse for Big DataIntroduction to Apache Tajo: Data Warehouse for Big Data
Introduction to Apache Tajo: Data Warehouse for Big Data
 

Mehr von GeeksLab Odessa

DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
GeeksLab Odessa
 
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
GeeksLab Odessa
 
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
GeeksLab Odessa
 
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
GeeksLab Odessa
 
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
GeeksLab Odessa
 

Mehr von GeeksLab Odessa (20)

DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
 
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
 
DataScience Lab 2017_Блиц-доклад_Турский Виктор
DataScience Lab 2017_Блиц-доклад_Турский ВикторDataScience Lab 2017_Блиц-доклад_Турский Виктор
DataScience Lab 2017_Блиц-доклад_Турский Виктор
 
DataScience Lab 2017_Обзор методов детекции лиц на изображение
DataScience Lab 2017_Обзор методов детекции лиц на изображениеDataScience Lab 2017_Обзор методов детекции лиц на изображение
DataScience Lab 2017_Обзор методов детекции лиц на изображение
 
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-докладDataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-докладDataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-докладDataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
 
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
 
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
 
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
 
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
 
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
 
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
 
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
 
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
 
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
 
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
 
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
 
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
 

Kürzlich hochgeladen

Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Medical / Health Care (+971588192166) Mifepristone and Misoprostol tablets 200mg
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
VictoriaMetrics
 
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
masabamasaba
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
Health
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
masabamasaba
 

Kürzlich hochgeladen (20)

%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
tonesoftg
tonesoftgtonesoftg
tonesoftg
 
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?
 

Java/Scala Lab 2016. Григорий Кравцов: Реализация и тестирование DAO слоя с нативным DSL с помощью неявных классов на примере взаимодействия с MongoDB через ReactiveMongo драйвер.

  • 1. Implementation and testing DAO layer with native DSL with using the implicit classes mechanism in Scala Speaker: Hryhoriy Kravtsov, PhD., R&D Chief Officer, VertaMedia LLC
  • 2. DAO Pattern Data Access Object Pattern [1] or DAO pattern is used to separate low level data accessing API or operations from high level business services. Following are the participants in Data Access Object Pattern. Data Access Object Interface - This interface defines the standard operations to be performed on a model object(s). Data Access Object concrete class - This class implements above interface. This class is responsible to get data from a data source which can be database / xml or any other storage mechanism. Model Object or Value Object - This object is simple POJO containing get/set methods to store data retrieved using DAO class.
  • 3. Repository Pattern A Repository [2] mediates between the domain and data mapping layers, acting like an in-memory domain object collection. Client objects construct query specifications declaratively and submit them to Repository for satisfaction. Objects can be added to and removed from the Repository, as they can from a simple collection of objects, and the mapping code encapsulated by the Repository will carry out the appropriate operations behind the scenes. Conceptually, a Repository encapsulates the set of objects persisted in a data store and the operations performed over them, providing a more object-oriented view of the persistence layer. Repository also supports the objective of achieving a clean separation and one-way dependency between the domain and data mapping layers.
  • 4. Repository vs DAO DAO pattern [3] offers only a loosely defined contract. It suffers from getting potential misused and bloated implementations. The repository pattern uses a metaphor of a Collection. This metaphor gives the pattern a tight contract and make it easier to understand by your fellow colleagues. Repository and DAO [4], in conclusion, have similar intentions only that the Repository is a higher level concept dealing directly with business/domain objects, while DAO is more lower level, closer to the database/storage dealing only with data. A (micro)ORM is a DAO that is used by a Repository. For data-centric apps, a repository and DAO are interchangeable because the ‘business’ objects are simple data.
  • 5. Implicit classes Scala 2.10 [5] introduced a new feature called implicit classes. An implicit class is a class marked with the implicit keyword. This keyword makes the class’ primary constructor available for implicit conversions when the class is in scope. object Helpers { implicit class IntWithTimes(x: Int) { def times[A](f: => A): Unit = { def loop(current: Int): Unit = if(current > 0) { f loop(current - 1) } loop(x) } } } scala> import Helpers._ import Helpers._ scala> 5 times println("HI") HI HI HI HI HI
  • 6. Restrictions 1. They must be defined inside of another trait/class/object. object Helpers { implicit class RichInt(x: Int) // OK! } implicit class RichDouble(x: Double) // BAD! 2. They may only take one non-implicit argument in their constructor. implicit class RichDate(date: java.util.Date) // OK! implicit class Indexer[T](collecton: Seq[T], index: Int) // BAD! implicit class Indexer[T](collecton: Seq[T])(implicit index: Index) // OK! While it’s possible to create an implicit class with more than one non-implicit argument, such classes aren’t used during implicit lookup. 3. There may not be any method, member or object in scope with the same name as the implicit class. Note: This means an implicit class cannot be a case class. object Bar implicit class Bar(x: Int) // BAD! val x = 5 implicit class x(y: Int) // BAD! implicit case class Baz(x: Int) // BAD!
  • 7. Our DAO package object dao { import scala.concurrent.ExecutionContext.Implicits.global abstract class AbstractDao[T](collection: BSONCollection)(implicit handler: BSONDocumentReader[T] with BSONDocumentWriter[T] with BSONHandler[BSONDocument, T]) { def dropCollection: Future[Unit] = collection.drop() def insert(doc: T): Future[Boolean] = collection.insert[T](doc).map(_.writeErrors.isEmpty) def count(): Future[Int] = collection.count() def find(query: BSONDocument): Future[List[T]] = collection.find(query).cursor[T]().collect[List]() def findOne(query: BSONDocument = BSONDocument()): Future[Option[T]] = collection.find(query).one[T] def update(selector: BSONDocument, update: BSONDocument): Future[Boolean] = collection.update(selector, update) .map(_.writeErrors.isEmpty) def remove(query: BSONDocument): Future[Boolean] = collection.remove(query).map(_.writeErrors.isEmpty) } implicit class DefaultMongoWrapper(db: DefaultDB) { implicit val partnerConfHandler = Macros.handler[PartnerConfig] ... object partners extends AbstractDao[PartnerConfig](db(“partners”)) { def getActivePartnerConfigs: Future[List[PartnerConfig]] = { val query = BSONDocument("active" -> true) find(query) } def byPartnerNameAndUrl(partnerName: String, url: String): Future[Option[PartnerConfig]] = { val query = BSONDocument("name" -> partnerName, "url" -> url) findOne(query) } } ... } }
  • 8. DAO in Action class AnalyzerActor(db: DefaultDB) extends NamedLoggingActor { import scala.concurrent.ExecutionContext.Implicits.global import com.vertamedia.<>.dao._ private def replaceSample(sample: Sample): Future[Boolean] = { logger.debug("Replace old sample with new one.") for { diffRemoveResult <- db.diffSample.removeByPartnerNameAndUrl(sample.conf.name, sample.conf.url) sampleRemoveResult <- db.sample.removeByPartnerNameAndUrl(sample.conf.name, sample.conf.url) if diffRemoveResult insertResult <- db.sample.insert(sample) if sampleRemoveResult } yield { insertResult } } override def receive: Receive = { case sample: Sample => ... } override val actorName: String = Actors.Analyzer.name } The Legend: Code with using DAO pattern Code with using Repository pattern Please, compare with info from the official site of MongoDB:
  • 9. Embedded MongoDB import de.flapdoodle.embed.mongo._ trait EmbeddedMongoTestFixture extends FunSpec with BeforeAndAfterAll { private val host = MongoConnection.DefaultHost private val version = Version.V3_0_5 private[this] lazy val port = { val socket = new ServerSocket(0); val port = socket.getLocalPort socket.close(); port } private[this] lazy val net = new Net(host, port, Network.localhostIsIPv6()) private[this] lazy val mongod: MongodProcess = { val runtime = MongodStarter.getDefaultInstance val mongodConfig = new MongodConfigBuilder().version(version).net(net).build() runtime.prepare(mongodConfig).start() } private[this] lazy val _db = mongoDB(host, port, s"test-${UUID.randomUUID()}") def mongoDB(host: String, port: Int, name: String): DefaultDB = { import scala.concurrent.ExecutionContext.Implicits.global val driver = new MongoDriver(); val connection: MongoConnection = driver.connection(List(s"$host:$port")) connection(name) } def startMongo(): Unit = { val _mongod = mongod; db } override def beforeAll() = { super.beforeAll(); startMongo() } def shutDownMongo(): Unit = { _db.connection.close(); mongod.stop() } override def afterAll() = { shutDownMongo(); super.afterAll()} def db: DefaultDB = _db }
  • 10. DAO Testing in Action class MongoDaoTest extends EmbeddedMongoTestFixture with BeforeAndAfterEach { val timeOut = 5 seconds import scala.concurrent.ExecutionContext.Implicits.global val config = AppConfiguration( analyzerPoolSize = 3, vastHttpTimeOut = Interval(5, "seconds"), objectHttpTimeOut = Interval(7, "seconds") ) override def beforeEach() = { ... Await.result(db.config.insert(config), timeOut) ... } override def afterEach() = { Await.result( for { _ <- db.partners.dropCollection() ... } yield (), timeOut) } describe("Config DAO should") { it("return exist config") { val actual = Await.result(db.config.getConfig, timeOut) assert(actual === config) } .... } } The Legend: Code with using DAO pattern Code with using Repository pattern
  • 11. Advantages and Disadvantages YES! - easy code reading for DAO/compact Repository - easy supporting for DAO/compact Repository - familiar notation with MongoShell - easy to test NO! - difficult reading of “reach” Repository - difficult supporting “reach” Repository - hate to the implicit conversation To use or not to use? For your decision!
  • 12. References 1. http://www.tutorialspoint.com/design_pattern/data_access_object_pattern.htm 2. http://martinfowler.com/eaaCatalog/repository.html 3. http://thinkinginobjects.com/2012/08/26/dont-use-dao-use-repository/ 4. http://blog.sapiensworks.com/post/2012/11/01/Repository-vs-DAO.aspx 5. http://docs.scala-lang.org/overviews/core/implicit-classes.html ●
  • 13. Thanks for attention! Please, your questions... Hryhoriy Kravtsov, PhD., R&D Chief Officer, VertaMedia LLC, h.kravtsov@vertamedia.com