First pass at csv column parsing for kvp as values #194
This commit is contained in:
parent
964ea904a1
commit
9ed370693d
88
app/Services/ImporterService.php
Normal file
88
app/Services/ImporterService.php
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Services;
|
||||||
|
|
||||||
|
use App\Repositories\FlightRepository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ImporterService
|
||||||
|
* @package App\Services
|
||||||
|
*/
|
||||||
|
class ImporterService extends BaseService
|
||||||
|
{
|
||||||
|
protected $flightRepo;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
FlightRepository $flightRepo
|
||||||
|
) {
|
||||||
|
$this->flightRepo = $flightRepo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a key-value pair to an array
|
||||||
|
* @param $kvp_str
|
||||||
|
* @param array $arr
|
||||||
|
*/
|
||||||
|
protected function setKvp($kvp_str, array &$arr)
|
||||||
|
{
|
||||||
|
$item = explode('=', $kvp_str);
|
||||||
|
if(\count($item) === 1) { # just a list?
|
||||||
|
$arr[] = trim($item[0]);
|
||||||
|
} else { # actually a key-value pair
|
||||||
|
$k = trim($item[0]);
|
||||||
|
$v = trim($item[1]);
|
||||||
|
$arr[$k] = $v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse a multi column values field. E.g:
|
||||||
|
* Y?price=200&cost=100; F?price=1200
|
||||||
|
* or
|
||||||
|
* gate=B32;cost index=100
|
||||||
|
*
|
||||||
|
* Converted into a multi-dimensional array
|
||||||
|
*
|
||||||
|
* @param $field
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function parseMultiColumnValues($field): array
|
||||||
|
{
|
||||||
|
$ret = [];
|
||||||
|
$split_values = explode(';', $field);
|
||||||
|
foreach($split_values as $value) {
|
||||||
|
|
||||||
|
# This isn't in the query string format, so it's
|
||||||
|
# just a straight key-value pair set
|
||||||
|
if(strpos($value, '?') === false) {
|
||||||
|
$this->setKvp($value, $ret);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
# This contains the query string, which turns it
|
||||||
|
# into the multi-level array
|
||||||
|
|
||||||
|
$query_str = explode('?', $value);
|
||||||
|
$parent = trim($query_str[0]);
|
||||||
|
|
||||||
|
$children = [];
|
||||||
|
$kvp = explode('&', trim($query_str[1]));
|
||||||
|
foreach($kvp as $items) {
|
||||||
|
$this->setKvp($items, $children);
|
||||||
|
}
|
||||||
|
|
||||||
|
$ret[$parent] = $children;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Import flights
|
||||||
|
* @param $csv_str
|
||||||
|
*/
|
||||||
|
public function importFlights($csv_str)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
68
tests/ImporterTest.php
Normal file
68
tests/ImporterTest.php
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ImporterTest
|
||||||
|
*/
|
||||||
|
class ImporterTest extends TestCase
|
||||||
|
{
|
||||||
|
protected $importerSvc;
|
||||||
|
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
$this->importerSvc = app(\App\Services\ImporterService::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the parsing of different field/column which can be used
|
||||||
|
* for specifying different field values
|
||||||
|
*/
|
||||||
|
public function testMultiFieldValues()
|
||||||
|
{
|
||||||
|
$tests = [
|
||||||
|
[
|
||||||
|
'input' => 'gate;cost index',
|
||||||
|
'expected' => [
|
||||||
|
'gate',
|
||||||
|
'cost index',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'input' => 'gate=B32;cost index=100',
|
||||||
|
'expected' => [
|
||||||
|
'gate' => 'B32',
|
||||||
|
'cost index' => '100'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'input' => 'Y?price=200&cost=100; F?price=1200',
|
||||||
|
'expected' => [
|
||||||
|
'Y' => [
|
||||||
|
'price' => 200,
|
||||||
|
'cost' => 100,
|
||||||
|
],
|
||||||
|
'F' => [
|
||||||
|
'price' => 1200
|
||||||
|
]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'input' => 'Y?price&cost; F?price=1200',
|
||||||
|
'expected' => [
|
||||||
|
'Y' => [
|
||||||
|
'price',
|
||||||
|
'cost',
|
||||||
|
],
|
||||||
|
'F' => [
|
||||||
|
'price' => 1200
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach($tests as $test) {
|
||||||
|
$parsed = $this->importerSvc->parseMultiColumnValues($test['input']);
|
||||||
|
$this->assertEquals($parsed, $test['expected']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user