Override the ConfigurableTrait fromConfig method to handle custom classes for records
public static fromConfig ( array $options = [] ) : mixed | ||
$options | array | |
return | mixed |
public function testCreateLoad() { if ($this->client->getTransport()->getProtocolVersion() < 26) { // $this->markTestSkipped( 'Record Create/Update Unpredictable Behaviour' ); } $rec1 = ['oData' => ['alloggio' => 'baita', 'lavoro' => 'no', 'vacanza' => 'lago']]; $rec = Record::fromConfig($rec1); $result = $this->client->execute('recordCreate', ['cluster_id' => 9, 'record' => $rec]); $this->assertInstanceOf('\\PhpOrient\\Protocols\\Binary\\Data\\Record', $result); $this->assertEquals('#9:0', (string) $result->getRid()); // var_export( $result . "\n" ); $rec2 = ['oData' => ['alloggio' => 'albergo', 'lavoro' => 'ufficio', 'vacanza' => 'montagna']]; $rec = Record::fromConfig($rec2); $result = $this->client->execute('recordCreate', ['cluster_id' => 9, 'record' => $rec]); $this->assertInstanceOf('\\PhpOrient\\Protocols\\Binary\\Data\\Record', $result); $this->assertEquals('#9:1', (string) $result->getRid()); // var_export( $result . "\n" ); $rec3 = ['alloggio' => 'case', 'lavoro' => 'mercato', 'vacanza' => 'mare']; $rec = new Record(); $rec->setOData($rec3); $rec->setOClass('V'); $result = $this->client->execute('recordCreate', ['cluster_id' => 9, 'record' => $rec]); $this->assertInstanceOf('\\PhpOrient\\Protocols\\Binary\\Data\\Record', $result); $this->assertEquals('#9:2', (string) $result->getRid()); // var_export( $result . "\n" ); $load = $this->client->execute('recordLoad', ['rid' => $result->getRid()]); $this->assertInstanceOf('\\PhpOrient\\Protocols\\Binary\\Data\\Record', $load[0]); $this->assertEquals('#9:2', (string) $load[0]->getRid()); $this->assertEquals((string) $rec, (string) $load[0]); // var_export( $load[0] . "\n" ); }
public function setUp() { parent::setUp(); $rec2 = ['oClass' => 'V', 'oData' => ['alloggio' => 'albergo']]; $rec = Record::fromConfig($rec2); $this->first_rec = $this->client->execute('recordCreate', ['cluster_id' => 9, 'record' => $rec]); $rec3 = ['oClass' => 'V', 'oData' => ['alloggio' => 'house']]; $rec = Record::fromConfig($rec3); $this->sec_rec = $this->client->execute('recordCreate', ['cluster_id' => 9, 'record' => $rec]); }
public function testDeserializeEmbeddedRecord() { $result = CSV::unserialize('Test@attr1:"test",attr2:(TestInfo@subAttr1:"sub test",subAttr2:123)'); $payload = []; if (isset($result['oClass'])) { $payload['oClass'] = $result['oClass']; unset($result['oClass']); } $payload['oData'] = $result; $result = Record::fromConfig($payload); $testRecord = Record::fromConfig(['oClass' => 'Test', 'oData' => array('attr1' => 'test', 'attr2' => Record::fromConfig(['oClass' => 'TestInfo', 'version' => 0, 'oData' => array('subAttr1' => 'sub test', 'subAttr2' => '123')]))]); $this->assertEquals($testRecord, $result); }
/** * Read sync command payloads * * @return array|null * @throws PhpOrientBadMethodCallException * @throws PhpOrientException * @throws SocketException */ public function _read_sync() { # type of response # decode body char with flag continue ( Header already read ) $response_type = $this->_readChar(); $res = []; switch ($response_type) { case 'n': # get end Line \x00 $this->_readChar(); $res = array(null); break; case $response_type == 'r' || $response_type == 'w': $res = [Record::fromConfig($this->_readRecord())]; # get end Line \x00 $this->_readChar(); break; case 'a': $res = [$this->_readString()]; # get end Line \x00 $this->_readChar(); break; case 'l': $list_len = $this->_readInt(); for ($n = 0; $n < $list_len; $n++) { $res[] = Record::fromConfig($this->_readRecord()); } # async-result-type can be: # 0: no records remain to be fetched # 1: a record is returned as a result set # 2: a record is returned as pre-fetched to be loaded in client's # cache only. It's not part of the result set but the client # knows that it's available for later access $cached_results = $this->_read_prefetch_record(); $res = array_merge($res, $cached_results); # cache = cached_results['cached'] break; default: # debug errors if (!Constants::$LOGGING) { throw new PhpOrientException('Unknown payload type ' . $response_type); } $msg = ''; $m = $this->_transport->getSocket()->read(1); while ($m != '') { $msg .= $m; $this->_transport->hexDump($msg); $m = $this->_transport->getSocket()->read(1); } break; } return $res; }
/** * */ public function testLinkSetCreation() { $config = static::getConfig('connect'); $client = new PhpOrient('localhost', 2424); $client->configure(array('username' => $config['username'], 'password' => $config['password'])); $client->connect(); try { $client->dbDrop('temp', Constants::STORAGE_TYPE_MEMORY); } catch (\Exception $e) { // echo $e->getMessage(); $client->getTransport()->debug($e->getMessage()); } $client->dbCreate('temp', Constants::STORAGE_TYPE_MEMORY, Constants::DATABASE_TYPE_DOCUMENT); $client->dbOpen('temp'); $client->sqlBatch(' create class Test1; create property Test1.aString string; insert into Test1 (aString) VALUES ("b"),("c"),("d"); create class Test2; create property Test2.aString string; create property Test2.anEmbeddedSetOfString embeddedset string; create property Test2.aLinkedSetOfTest1 linkset Test1;'); $clusterTest1 = $client->query("select classes[name='Test1'].defaultClusterId from 0:1", -1)[0]['classes']; $clusterTest2 = $client->query("select classes[name='Test2'].defaultClusterId from 0:1", -1)[0]['classes']; $this->assertEquals('9', $clusterTest1); $this->assertEquals('10', $clusterTest2); $newRecord = ['oClass' => 'Test2', 'oData' => ['aString' => 'Test record', 'anEmbeddedSetOfString' => ['something 1', 'something 2', 'more other'], 'aLinkedSetOfTest1' => [new ID($clusterTest1, 1), new ID($clusterTest1, 2)]]]; $newRecordObject = Record::fromConfig($newRecord); $newRecordObject->setRid(new ID($clusterTest2)); $tmp = $client->recordCreate($newRecordObject); $this->assertInstanceOf('\\PhpOrient\\Protocols\\Binary\\Data\\Record', $tmp); /** * @var \PhpOrient\Protocols\Binary\Data\Record $record */ $record = $client->recordLoad($tmp->getRid())[0]; $this->assertEquals('Test record', $record->aString); $this->assertArrayHasKey(0, $record->anEmbeddedSetOfString); $this->assertArrayHasKey(1, $record->anEmbeddedSetOfString); $this->assertArrayHasKey(2, $record->anEmbeddedSetOfString); $this->assertEquals('something 1', $record->anEmbeddedSetOfString[0]); $this->assertEquals('something 2', $record->anEmbeddedSetOfString[1]); $this->assertEquals('more other', $record->anEmbeddedSetOfString[2]); $this->assertArrayHasKey(0, $record->aLinkedSetOfTest1); $this->assertArrayHasKey(1, $record->aLinkedSetOfTest1); $this->assertInstanceOf('\\PhpOrient\\Protocols\\Binary\\Data\\ID', $record->aLinkedSetOfTest1[0]); $this->assertInstanceOf('\\PhpOrient\\Protocols\\Binary\\Data\\ID', $record->aLinkedSetOfTest1[1]); $aLinkedSetOfTest1 = $record->aLinkedSetOfTest1; /** * @var \PhpOrient\Protocols\Binary\Data\ID[] $aLinkedSetOfTest1 */ $this->assertEquals('#9:1', $aLinkedSetOfTest1[0]->jsonSerialize()); $this->assertEquals('#9:2', $aLinkedSetOfTest1[1]->__toString()); }
/** * Consume an embedded record. * * @param string $input The input to unserialize. * * @return array The collected record and any remaining content. */ protected static function eatRecord($input) { $record = []; $input = ltrim($input, ' '); if ($input[0] === ')') { // this is an empty record. return [$record, substr($input, 1)]; } $chunk = self::eatFirstKey($input); if ($chunk[2]) { // this is actually a class name. $record['oClass'] = $chunk[0]; $input = ltrim($chunk[1], ' '); if ($input[0] === ')') { return [$record, substr($input, 1)]; } $chunk = self::eatKey($input); $key = $chunk[0]; $input = $chunk[1]; } else { $key = $chunk[0]; $input = $chunk[1]; } $chunk = self::eatValue($input); $value = $chunk[0]; $input = ltrim($chunk[1], ' '); $record[$key] = $value; while (strlen($input) > 0) { if ($input[0] === ',') { $input = ltrim(substr($input, 1), ' '); } elseif ($input[0] === ')') { $input = ltrim(substr($input, 1), ' '); break; } $chunk = self::eatKey($input); $key = $chunk[0]; $input = ltrim($chunk[1], ' '); if (strlen($input) > 0) { $chunk = self::eatValue($input); $value = $chunk[0]; $input = $chunk[1]; $record[$key] = $value; } else { $record[$key] = null; } } $payload = []; if (isset($record['oClass'])) { $payload['oClass'] = $record['oClass']; unset($record['oClass']); } if (isset($record['@type'])) { $payload['type'] = $record['@type']; unset($record['@type']); } $payload['oData'] = $record; $record = \PhpOrient\Protocols\Binary\Data\Record::fromConfig($payload); return [$record, $input]; }
public function testNullValueHandling() { try { $client = new PhpOrient('localhost', 2424); $client->username = '******'; $client->password = '******'; $client->connect(); $this->skipTestByOrientDBVersion(['2.1.3', '2.0.13', '1.7.10']); try { $client->dbDrop('temp', Constants::STORAGE_TYPE_MEMORY, Constants::DATABASE_TYPE_DOCUMENT); } catch (\Exception $e) { // echo $e->getMessage(); $client->getTransport()->debug($e->getMessage()); } $client->dbCreate('temp', Constants::STORAGE_TYPE_MEMORY, Constants::DATABASE_TYPE_GRAPH); $client->dbOpen('temp'); $client->sqlBatch('create class Prova1;' . 'create property Prova1.aString string;' . 'insert into Prova1 (aString) VALUES ("b"),("c"),("d");' . 'create class Prova2;' . 'create property Prova2.aString string;' . 'create property Prova2.anEmbeddedSetOfString embeddedset string;' . 'create property Prova2.prova1 link Prova1;'); $clusterProva1 = $client->query("select classes[name='Prova1'].defaultClusterId from 0:1", -1)[0]['classes']; $clusterProva2 = $client->query("select classes[name='Prova2'].defaultClusterId from 0:1", -1)[0]['classes']; // echo "Default cluster for Prova1: $clusterProva1\n"; // echo "Default cluster for Prova2: $clusterProva2\n\n"; $newRecord = ['oClass' => 'Prova2', 'oData' => ['aString' => 'record di prova', 'anEmbeddedSetOfString' => ['qualcosa 1', 'qualcosa 2', 'ancora altro'], 'prova1' => null]]; $newRecordObject = Record::fromConfig($newRecord); $newRecordObject->setRid(new ID($clusterProva2)); $tmp = $client->recordCreate($newRecordObject); $record = $client->recordLoad($tmp->getRid())[0]; $this->assertEquals('record di prova', $record->getOData()['aString']); $this->assertEquals(null, $record->getOData()['prova1']); // print_r($record->getOData()); } catch (\Exception $e) { // echo $e . "\n"; } }
/** * Read the response from the socket. * * @return int The session id. */ protected function _read() { $payloads = []; $status = $this->_readByte(); if ($status != 0) { $payload = []; // a normal record if ($this->_transport->getProtocolVersion() > 27) { $type = $this->_readChar(); $version = $this->_readInt(); if ($type == 'b') { $data[] = $this->_readString(); } else { $data = CSV::unserialize($this->_readString()); } } else { $string = $this->_readString(); $data = CSV::unserialize($string); $version = $this->_readInt(); $type = $this->_readChar(); if ($type == 'b') { $data = $string; } } $payload['rid'] = new ID($this->cluster_id, $this->cluster_position); $payload['type'] = $type; $payload['version'] = $version; if (isset($data['oClass'])) { $payload['oClass'] = $data['oClass']; unset($data['oClass']); } $payload['oData'] = $data; $record = Record::fromConfig($payload); $payloads[] = $record; $prefetched = $this->_read_prefetch_record(); # read cache and prefetch with callback $payloads = array_merge($payloads, $prefetched); } return $payloads; }