private function read()

in src/Apache/Ignite/Data/BinaryObject.php [395:436]


    private function read(BinaryCommunicator $communicator): void
    {
        $this->readHeader($communicator);
        if ($this->hasSchema) {
            $this->buffer->setPosition($this->startPos + $this->schemaOffset);
            $fieldOffsets = [];
            $fieldIds = $this->typeBuilder->getSchema()->getFieldIds();
            $index = 0;
            $schemaEndOffset = $this->startPos + $this->length;
            if ($this->hasRawData) {
                $schemaEndOffset -= TypeInfo::getTypeInfo(ObjectType::INTEGER)->getSize();
            }
            while ($this->buffer->getPosition() < $schemaEndOffset) {
                if (!$this->compactFooter) {
                    $fieldId = $this->buffer->readInteger();
                    $this->typeBuilder->getSchema()->addField($fieldId);
                } else {
                    if ($index >= count($fieldIds)) {
                        BinaryUtils::serializationError(
                            false, 'wrong number of fields in schema');
                    }
                    $fieldId = $fieldIds[$index];
                    $index++;
                }
                array_push($fieldOffsets, [$fieldId, $this->buffer->readNumber($this->offsetType, false)]);
            }
            usort($fieldOffsets,
                function (array $val1, array $val2): int
                {
                    return $val1[1] - $val2[1];
                });
            for ($i = 0; $i < count($fieldOffsets); $i++) {
                $fieldId = $fieldOffsets[$i][0];
                $offset = $fieldOffsets[$i][1];
                $nextOffset = $i + 1 < count($fieldOffsets) ? $fieldOffsets[$i + 1][1] : $this->schemaOffset;
                $field = BinaryObjectField::fromBuffer(
                    $communicator, $this->buffer, $this->startPos + $offset, $nextOffset - $offset, $fieldId);
                $this->fields[$field->getId()] = $field;
            }
        }
        $this->buffer->setPosition($this->startPos + $this->length);
    }