Implement JsonReader
This commit is contained in:
parent
715ae45177
commit
365050026f
@ -86,6 +86,7 @@ class DatasetManager
|
||||
$this->loadDatasets($info, ltrim($prefix . "." . $name, "."), $package, $path);
|
||||
return;
|
||||
}
|
||||
$info['filename'] = $path . "/" . $info['filename'];
|
||||
$pn = sprintf("%s#%s", $package, ltrim($prefix.".".$name,"."));
|
||||
$ds = new Dataset($pn, $info);
|
||||
$this->registerDataset($ds);
|
||||
|
@ -2,12 +2,91 @@
|
||||
|
||||
namespace NoccyLabs\Dataset\Readers;
|
||||
|
||||
use Iterator;
|
||||
use NoccyLabs\Dataset\ReaderInterface;
|
||||
|
||||
class JsonReader implements ReaderInterface
|
||||
class JsonReader implements ReaderInterface, Iterator
|
||||
{
|
||||
private array $files = [];
|
||||
|
||||
private int $currentFile = 0;
|
||||
|
||||
private ?int $loadedFile = null;
|
||||
|
||||
private array $data = [];
|
||||
|
||||
private int $currentIndex = 0;
|
||||
|
||||
private int $counter = 0;
|
||||
|
||||
public function __construct(string $filename, array $options)
|
||||
{
|
||||
$this->files = glob($filename);
|
||||
}
|
||||
|
||||
private function checkLoadedSlice()
|
||||
{
|
||||
// If the current file is the loaded file, we're already set
|
||||
if ($this->currentFile === $this->loadedFile) return;
|
||||
|
||||
if ($this->currentFile >= count($this->files)) {
|
||||
printf("Reached end of set at slice=%d\n", $this->currentFile);
|
||||
return;
|
||||
}
|
||||
$file = $this->files[$this->currentFile];
|
||||
$json = @json_decode(@file_get_contents($file), true);
|
||||
|
||||
$this->loadData($json);
|
||||
$this->loadedFile = $this->currentFile;
|
||||
printf("loaded slice %d: %s\n", $this->currentFile, $file);
|
||||
}
|
||||
|
||||
private function loadData(array $data)
|
||||
{
|
||||
// FIXME parse data according to directives if present
|
||||
$this->data = $data;
|
||||
$this->currentIndex = 0;
|
||||
}
|
||||
|
||||
public function rewind(): void
|
||||
{
|
||||
$this->currentFile = 0;
|
||||
$this->currentIndex = 0;
|
||||
$this->counter = 0;
|
||||
printf("Rewinding to slice=%d index=%d\n", $this->currentFile, $this->currentIndex);
|
||||
$this->checkLoadedSlice();
|
||||
}
|
||||
|
||||
public function key(): mixed
|
||||
{
|
||||
//$this->checkLoadedSlice();
|
||||
return $this->counter;
|
||||
}
|
||||
|
||||
public function current(): mixed
|
||||
{
|
||||
//$this->checkLoadedSlice();
|
||||
return $this->data[$this->currentIndex];
|
||||
}
|
||||
|
||||
public function next(): void
|
||||
{
|
||||
$this->counter++;
|
||||
$this->currentIndex++;
|
||||
|
||||
if ($this->currentIndex >= count($this->data)) {
|
||||
$this->currentFile++;
|
||||
$this->currentIndex = 0;
|
||||
printf("Rolling over to slice=%d index=%d counter=%d\n", $this->currentFile, $this->currentIndex, $this->counter);
|
||||
}
|
||||
|
||||
//$this->checkLoadedSlice();
|
||||
}
|
||||
|
||||
public function valid(): bool
|
||||
{
|
||||
$this->checkLoadedSlice();
|
||||
return ($this->currentFile < count($this->files) && ($this->currentIndex < count($this->data)));
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user