private function executeInserts(UnitOfWork $uow, array &$set) { $this->references = []; $queryWriter = new QueryWriter(); $ordered = self::orderByType($uow->getDocumentInsertions(), $set); if (empty($ordered)) { return; } $docs = []; foreach ($ordered as $class => $inserts) { /** @var ClassMetadata $md */ $md = $this->metadataFactory->getMetadataFor($class); if ($md->isEmbeddedDocument()) { continue; } switch (true) { case $md->isVertex(): foreach ($inserts as $oid => $doc) { $id = $this->createDocVarReference($doc); $data = $this->prepareData($md, $uow, $doc); $queryWriter->addCreateVertexQuery($id->toValue(), $md->getOrientClass(), $data); $docs[] = [$id, $doc, $md]; } continue; case $md->isEdge(): foreach ($inserts as $oid => $doc) { $id = $this->createDocVarReference($doc); $data = $this->prepareData($md, $uow, $doc); if (!property_exists($data, 'in')) { } if (!property_exists($data, 'out')) { } $in = $data->in; $out = $data->out; unset($data->in, $data->out); $queryWriter->addCreateEdgeQuery($id->toValue(), $md->getOrientClass(), $out, $in, $data); $docs[] = [$id, $doc, $md]; } continue; default: foreach ($inserts as $oid => $doc) { $id = $this->createDocVarReference($doc); $data = $this->prepareData($md, $uow, $doc); $queryWriter->addInsertQuery($id->toValue(), $md->getOrientClass(), $data); $docs[] = [$id, $doc, $md]; } continue; } } $queries = $queryWriter->getQueries(); if (!$queries) { // nothing to do return; } $parts = []; foreach ($docs as $k => list($v)) { $parts[] = sprintf('n%s : %s', $k, $v); } $queries[] = sprintf('return { %s }', implode(', ', $parts)); $rids = $this->executeQueries($queries); foreach ($rids as $k => $rid) { if (isset($docs[$k])) { /** @var ClassMetadata $md */ list($_, $doc, $md) = $docs[$k]; unset($docs[$k]); $md->reflFields[$md->identifier]->setValue($doc, $rid); $data = $uow->getDocumentActualData($doc); $uow->registerManaged($doc, $rid, $data); $uow->raisePostPersist($md, $doc); } } if (!empty($docs)) { // we didn't receive info for all inserted documents throw new SQLBatchException('missing RIDs for one or more inserted documents'); } $this->references = []; }