Implement JsonReader
This commit is contained in:
		@@ -86,6 +86,7 @@ class DatasetManager
 | 
				
			|||||||
                $this->loadDatasets($info, ltrim($prefix . "." . $name, "."), $package, $path);
 | 
					                $this->loadDatasets($info, ltrim($prefix . "." . $name, "."), $package, $path);
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            $info['filename'] = $path . "/" . $info['filename'];
 | 
				
			||||||
            $pn = sprintf("%s#%s", $package, ltrim($prefix.".".$name,"."));
 | 
					            $pn = sprintf("%s#%s", $package, ltrim($prefix.".".$name,"."));
 | 
				
			||||||
            $ds = new Dataset($pn, $info);
 | 
					            $ds = new Dataset($pn, $info);
 | 
				
			||||||
            $this->registerDataset($ds);
 | 
					            $this->registerDataset($ds);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,12 +2,91 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace NoccyLabs\Dataset\Readers;
 | 
					namespace NoccyLabs\Dataset\Readers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Iterator;
 | 
				
			||||||
use NoccyLabs\Dataset\ReaderInterface;
 | 
					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)
 | 
					    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)));
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user