public function serialize(Node $node) { $properties = array(); $this->binaries = array(); foreach ($node->getProperties() as $propertyName => $property) { $propertyType = $property['type']; if (is_object($property['value'])) { $propertyValues = array($property['value']); } else { $propertyValues = (array) $property['value']; } $propertyLengths = array(); $binaryHashes = array(); foreach ($propertyValues as $i => &$value) { if (null === $value) { continue; } if ($propertyType == 'Date') { // should this be moved "up" ? if ($value instanceof \DateTime) { $value = $value->format('c'); } else { $date = new \DateTime($value); $value = $date->format('c'); } } if ($propertyType == 'Binary') { if (is_resource($value)) { $stream = $value; $value = stream_get_contents($stream); fclose($stream); } $propertyLengths[] = strlen($value); $binaryHash = md5($value); $this->binaries[$binaryHash] = $value; $value = $binaryHash; } else { $propertyLengths[] = ''; } } if (empty($propertyValues)) { continue; } $properties[$propertyName]['type'] = $propertyType; if (is_array($property['value'])) { $properties[$propertyName]['value'] = $propertyValues; $properties[$propertyName]['length'] = $propertyLengths; } else { $properties[$propertyName]['value'] = reset($propertyValues); $properties[$propertyName]['length'] = reset($propertyLengths); } } $yaml = Yaml::dump($properties); return $yaml; }
/** * {@inheritDoc} */ public function index($workspace, $path, Node $node) { $index = $this->getIndex($workspace); $document = new Document(); $nodeName = PathHelper::getNodeName($path); $localNodeName = $nodeName; // PathHelper::getLocalNodeName($path); $parentPath = PathHelper::getParentPath($path); $document->addField(Field::Keyword(self::IDX_PATH, $path)); $document->addField(Field::Keyword(self::IDX_NODENAME, $nodeName)); $document->addField(Field::Keyword(self::IDX_NODELOCALNAME, $localNodeName)); $document->addField(Field::Keyword(self::IDX_PARENTPATH, $parentPath)); foreach ($node->getProperties() as $propertyName => $property) { $propertyValue = $property['value']; $propertyType = $property['type']; if ($propertyName === Storage::INTERNAL_UUID) { $document->addField(Field::Keyword(Storage::INTERNAL_UUID, $propertyValue)); continue; } switch ($propertyType) { case PropertyType::TYPENAME_STRING: case PropertyType::TYPENAME_NAME: case PropertyType::TYPENAME_PATH: case PropertyType::TYPENAME_URI: $value = (array) $propertyValue; $value = join(self::MULTIVALUE_SEPARATOR, $value); $document->addField(Field::Text($propertyName, $value)); break; case PropertyType::TYPENAME_DATE: $values = (array) $propertyValue; foreach ($values as $i => $value) { if ($value instanceof \DateTime) { $values[$i] = $value->format('c'); } } $value = join(self::MULTIVALUE_SEPARATOR, $values); $document->addField(Field::Text($propertyName, $value)); break; case PropertyType::TYPENAME_DECIMAL: case PropertyType::TYPENAME_LONG: case PropertyType::TYPENAME_DOUBLE: $values = (array) $propertyValue; foreach ($values as &$value) { $value = sprintf('%0' . strlen(PHP_INT_MAX) . 's', $value); } $value = join(self::MULTIVALUE_SEPARATOR, $values); $document->addField(Field::Text($propertyName, $value)); break; case PropertyType::TYPENAME_BOOLEAN: $values = (array) $propertyValue; foreach ($values as &$value) { if ($propertyValue === 'false') { $value = self::VALUE_BOOLEAN_FALSE; } else { $value = 1; } } $value = join(self::MULTIVALUE_SEPARATOR, $values); $document->addField(Field::Text($propertyName, $value)); break; } } $index->addDocument($document); }