byjg/anydataset

Anydataset is an agnostic data source abstraction layer in PHP. Core Module.

4.9.1 2024-01-03 23:58 UTC

README

Opensource ByJG Build Status Opensource ByJG GitHub source GitHub license GitHub release

Anydataset Core Module. Anydataset is an agnostic data source abstraction layer in PHP.

Features

  • Access different data sources using the same interface.
  • Iterable results
  • Convert results to array

Current Implementations

Object Data Source Read Write Reference
DbDriverInterface Relational DB yes yes Github
AnyDataSet Anydataset yes yes Github
ArrayDataSet Array yes no Github
TextFileDataSet Delimited Fields yes no Github
FixedTextFileDataSet Fixed Size fields yes no Github
XmlDataSet Xml yes no Github
JSONDataSet Json yes no Github
SparQLDataSet SparQl Repositories yes no Github
NoSqlDocumentInterface NoSql Document Based yes yes Github
KeyValueInterface NoSql Key/Value Based yes yes Github

Examples

Iterating with foreach

<?php
$dataset = new \ByJG\AnyDataset\Core\AnyDataset("example");

$iterator = $dataset->getIterator();
foreach ($iterator as $row) {
    print $row->toArray();
}

Filtering results

<?php
$filter = new \ByJG\AnyDataset\Core\IteratorFilter();
$filter->addRelation("field1", \ByJG\AnyDataset\Core\Enum\Relation::EQUAL, 10);
$iterator2 = $dataset->getIterator($filter);

Converting to Array

<?php
$iterator = $dataset->getIterator();
print_r($iterator->toArray());

Iterating with While

<?php
$iterator = $dataset->getIterator();
while ($iterator->hasNext()) {
    $row = $iterator->moveNext();

    print_r($row->get("field1"));
}

or

foreach ($iterator as $row) {
    print_r($row->get("field1"));
}

Additional Classes

RowOutpout - Format Field Output

This class defines custom format for the field output.

<?php
$output = RowOutput::getInstance()
    ->addFormat("field1", "Test {field1}")
    ->addFormat("field2", "Showing {} and {field3}");
    ->addCustomFormat("field3", function ($row, $field, $value) {
        // return the formatted output.
        // $row: The row object with all values
        // $field: The field has been processed
        // $value: The field value
    });

// This will output the field1 formatted:
echo $output->print($row, "field1");

// This will apply the format defintion to all fields at once:
$ouput->apply($row);

Notes about the format pattern:

  • {} represents the current value
  • {.} represents the field name
  • {field_name} return the value of $row->get(field_name)

RowValidator - Validate Field contents

<?php
$validator = RowValidator::getInstance()
    ->requiredFields(["field1", "field2"])
    ->numericFields(['field1', 'field3'])
    ->regexValidation("field4", '/\d{4}-\d{2}-\d{2}/')
    ->customValidation("field3", function($value) {
        // Return any string containing the error message if validation FAILS
        // otherwise, just return null and the valition will pass.
    });

$validator->validate($row) // Will return an array with the error messages. Empty array if not errors.

Formatters

AnyDataset comes with an extensible set to format the AnyDataset. The interface is:

namespace ByJG\AnyDataset\Core\Formatter;

interface FormatterInterface
{
    /**
     * Return the object in your original format, normally as object
     *
     * @return mixed
     */
    public function raw();

    /**
     * Return the object transformed to string.
     *
     * @return string
     */
    public function toText();

    /**
     * Save the contents to a file
     *
     * @param string $filename
     * @return void
     */
    public function saveToFile($filename);
}

AnyDataset implements two formatters:

  • JsonFormatter
  • XmlFormatter

Example:

<?php
$formatter = new XmlFormatter($anydataset->getIterator());
$formatter->raw(); // Return a DOM object
$formatter->toText(); // Return the XML as a text
$formatter->saveToFile("/path/to/file.xml");  // Save the XML Text to a file.

Install

composer require "byjg/anydataset"

Running Unit tests

vendor/bin/phpunit

Dependencies

flowchart TD
    byjg/anydataset --> byjg/serializer
    byjg/anydataset --> byjg/xmlutil

Open source ByJG