Skip to content

Commit

Permalink
Adds all of rapido
Browse files Browse the repository at this point in the history
  • Loading branch information
Pieter Verloop committed Oct 12, 2017
1 parent 7815e3d commit d45a7a9
Show file tree
Hide file tree
Showing 33 changed files with 802 additions and 0 deletions.
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/vendor/
composer.lock
coverage.xml
tests/RapidoBundle/Config/sqlite.db
tests/RapidoBundle/Config/cache/
tests/RapidoBundle/Config/logs/
13 changes: 13 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
language: php

php:
- 7.0

before_script:
- composer self-update
- composer install --prefer-dist --no-interaction

script: ./vendor/bin/phpunit --coverage-clover=coverage.xml

after_success:
- bash <(curl -s https://codecov.io/bash)
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Avoran/Rapido
[![Build Status](https://travis-ci.org/Avoran/Rapido.svg?branch=master)](https://travis-ci.org/Avoran/Rapido.svg?branch=master) [![codecov](https://codecov.io/gh/Avoran/Rapido/branch/master/graph/badge.svg)](https://codecov.io/gh/Avoran/Rapido) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/Avoran/Rapido/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/Avoran/Rapido/?branch=master) [![Code Coverage](https://scrutinizer-ci.com/g/Avoran/Rapido/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/Avoran/Rapido/?branch=master)
34 changes: 34 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"name": "avoran/rapido",
"description": "Readmodel library for event stores",
"type": "library",
"license": "MIT",
"authors": [
{
"name": "Avoran",
"email": "avoran@protonmail.com"
}
],
"require": {
"php": "^7.0",
"doctrine/dbal": "^2.5",
"symfony/framework-bundle": "^3.3"
},
"require-dev": {
"phpunit/phpunit": "^5.7"
},
"autoload": {
"psr-4": {
"Avoran\\Rapido\\": "src/Rapido",
"Avoran\\RapidoAdapter\\": "src/RapidoAdapter",
"Avoran\\RapidoBundle\\": "src/RapidoBundle"
}
},
"autoload-dev": {
"psr-4": {
"Avoran\\Rapido\\": "tests/Rapido",
"Avoran\\RapidoAdapter\\": "tests/RapidoAdapter",
"Avoran\\RapidoBundle\\": "tests/RapidoBundle"
}
}
}
27 changes: 27 additions & 0 deletions phpunit.xml.dist
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
backupStaticAttributes="false"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
bootstrap="tests/bootstrap.php"
>
<php>
<server name="KERNEL_DIR" value="tests/RapidoBundle/Config" />
</php>
<testsuites>
<testsuite name="Rapido Test Suite">
<directory suffix="Test.php">./tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">src</directory>
</whitelist>
</filter>
</phpunit>
7 changes: 7 additions & 0 deletions src/Rapido/ReadModel/DataType/Boolean.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?php

namespace Avoran\Rapido\ReadModel\DataType;

final class Boolean implements FieldDataType
{
}
7 changes: 7 additions & 0 deletions src/Rapido/ReadModel/DataType/DateTime.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?php

namespace Avoran\Rapido\ReadModel\DataType;

final class DateTime implements FieldDataType
{
}
21 changes: 21 additions & 0 deletions src/Rapido/ReadModel/DataType/Decimal.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace Avoran\Rapido\ReadModel\DataType;

final class Decimal implements FieldDataType
{
private $totalDigits;
public function getTotalDigits() { return $this->totalDigits; }

private $fractionalDigits;
public function getFractionalDigits() { return $this->fractionalDigits; }

public function __construct($totalDigits, $fractionalDigits)
{
if ($totalDigits <= $fractionalDigits)
throw new \InvalidArgumentException("'totalDigits' ({$totalDigits}) has to be larger than 'fractionalDigits' ({$fractionalDigits})");

$this->totalDigits = $totalDigits;
$this->fractionalDigits = $fractionalDigits;
}
}
7 changes: 7 additions & 0 deletions src/Rapido/ReadModel/DataType/FieldDataType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?php

namespace Avoran\Rapido\ReadModel\DataType;

interface FieldDataType
{
}
7 changes: 7 additions & 0 deletions src/Rapido/ReadModel/DataType/Integer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?php

namespace Avoran\Rapido\ReadModel\DataType;

final class Integer implements FieldDataType
{
}
14 changes: 14 additions & 0 deletions src/Rapido/ReadModel/DataType/TextString.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Avoran\Rapido\ReadModel\DataType;

final class TextString implements FieldDataType
{
private $maxLength;
public function getMaxLength() { return $this->maxLength; }

public function __construct($maxLength = null)
{
$this->maxLength = $maxLength;
}
}
42 changes: 42 additions & 0 deletions src/Rapido/ReadModel/ReadModelConfiguration.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

namespace Avoran\Rapido\ReadModel;

final class ReadModelConfiguration
{
private $name;
public function getName() { return $this->name; }

private $id;
public function getId() { return $this->id; }

/** @var ReadModelField[] */
private $fields;
public function getFields() { return $this->fields; }

private $recordFactory;
private $allRecords;

public function __construct($name, ReadModelId $id, array $fields, callable $recordFactory, callable $allRecords)
{
$this->name = $name;
$this->id = $id;
$this->fields = $fields;
$this->recordFactory = $recordFactory;
$this->allRecords = $allRecords;
}

public function getAllRecords()
{
$allRecords = $this->allRecords;
foreach ($allRecords() as $recordData)
yield $recordData;
}

/** @return Record */
public function createRecord($recordData)
{
$recordFactory = $this->recordFactory;
return $recordFactory($recordData);
}
}
20 changes: 20 additions & 0 deletions src/Rapido/ReadModel/ReadModelField.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace Avoran\Rapido\ReadModel;

use Avoran\Rapido\ReadModel\DataType\FieldDataType;

final class ReadModelField
{
private $id;
public function getId() { return $this->id; }

private $dataType;
public function getDataType() { return $this->dataType; }

public function __construct($id, FieldDataType $dataType)
{
$this->id = $id;
$this->dataType = $dataType;
}
}
16 changes: 16 additions & 0 deletions src/Rapido/ReadModel/ReadModelId.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

namespace Avoran\Rapido\ReadModel;

use Avoran\Rapido\ReadModel\DataType\FieldDataType;

final class ReadModelId
{
private $dataType;
public function getDataType() { return $this->dataType; }

public function __construct(FieldDataType $dataType)
{
$this->dataType = $dataType;
}
}
18 changes: 18 additions & 0 deletions src/Rapido/ReadModel/Record.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace Avoran\Rapido\ReadModel;

final class Record
{
private $id;
public function getId() { return $this->id; }

private $data;
public function getData() { return $this->data; }

public function __construct($id, $data)
{
$this->id = $id;
$this->data = $data;
}
}
8 changes: 8 additions & 0 deletions src/Rapido/ReadModel/StorageWriter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace Avoran\Rapido\ReadModel;

interface StorageWriter
{
public function writeRecord(ReadModelConfiguration $metadata, $recordData);
}
27 changes: 27 additions & 0 deletions src/RapidoAdapter/DoctrineDbalStorage/ColumnFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace Avoran\RapidoAdapter\DoctrineDbalStorage;

use Doctrine\DBAL\Schema\Column;
use Avoran\Rapido\ReadModel\DataType\FieldDataType;

class ColumnFactory
{
private $dbalTypeMapper;
private $dbalOptionsMapper;

public function __construct(DbalTypeMapper $dbalTypeMapper, DbalOptionsMapper $dbalOptionsMapper)
{
$this->dbalTypeMapper = $dbalTypeMapper;
$this->dbalOptionsMapper = $dbalOptionsMapper;
}

public function createColumn(FieldDataType $dataType, $id)
{
return new Column(
$id,
$this->dbalTypeMapper->mapReadModelToDbalType($dataType),
$this->dbalOptionsMapper->mapReadModelToDbalOptions($dataType)
);
}
}
22 changes: 22 additions & 0 deletions src/RapidoAdapter/DoctrineDbalStorage/DbalOptionsMapper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace Avoran\RapidoAdapter\DoctrineDbalStorage;

use Avoran\Rapido\ReadModel\DataType\Decimal;
use Avoran\Rapido\ReadModel\DataType\FieldDataType;

class DbalOptionsMapper
{
public function mapReadModelToDbalOptions(FieldDataType $fieldDataType)
{
$options = ['notnull' => false];

switch ($fieldDataType) {
case $fieldDataType instanceof Decimal:
$options = array_merge($options, ['scale' => $fieldDataType->getFractionalDigits(), 'precision' => $fieldDataType->getTotalDigits()]);
break;
}

return $options;
}
}
35 changes: 35 additions & 0 deletions src/RapidoAdapter/DoctrineDbalStorage/DbalTypeMapper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

namespace Avoran\RapidoAdapter\DoctrineDbalStorage;

use Doctrine\DBAL\Types\Type;
use Avoran\Rapido\ReadModel\DataType\Boolean;
use Avoran\Rapido\ReadModel\DataType\DateTime;
use Avoran\Rapido\ReadModel\DataType\Decimal;
use Avoran\Rapido\ReadModel\DataType\FieldDataType;
use Avoran\Rapido\ReadModel\DataType\Integer;
use Avoran\Rapido\ReadModel\DataType\TextString;

class DbalTypeMapper
{
public function mapReadModelToDbalType(FieldDataType $fieldDataType)
{
switch ($fieldDataType) {
case $fieldDataType instanceof Integer:
return Type::getType(Type::INTEGER);
case $fieldDataType instanceof Decimal:
return Type::getType(Type::DECIMAL);
case $fieldDataType instanceof Boolean:
return Type::getType(Type::BOOLEAN);
case $fieldDataType instanceof TextString:
return $fieldDataType->getMaxLength() && $fieldDataType->getMaxLength() < 256
? Type::getType(Type::STRING)
: Type::getType(Type::TEXT)
;
case $fieldDataType instanceof DateTime:
return Type::getType(Type::DATETIME);
default:
throw new \InvalidArgumentException("Could not find a suitable data type");
}
}
}

0 comments on commit d45a7a9

Please sign in to comment.