public function testBackAndForth() { foreach ($this->qomQueries as $name => $originalQomQuery) { $originalSql2Query = $this->sql2Queries[$name]; if (is_array($originalSql2Query)) { $this->assertGreaterThan(0, count($originalSql2Query), 'empty list of queries'); $passed = false; $sql2 = 'None of the QOM statements matched'; foreach ($originalSql2Query as $query) { $qom = $this->sql2Parser->parse($query); if ($originalQomQuery->getStatement() == $qom->getStatement()) { $sql2 = $this->qomParser->convert($qom); if ($sql2 == $query) { $passed = true; break; } } } $this->assertTrue($passed, "QOM-->SQL2->QOM: Query variation {$name} resulted in SQL2 that is not found: {$sql2}"); } else { $qom = $this->sql2Parser->parse($originalSql2Query); $this->assertEquals($originalQomQuery, $qom, "QOM-->SQL2: Original query = {$originalSql2Query}"); $sql2 = $this->qomParser->convert($qom); $this->assertEquals($originalSql2Query, $sql2, "SQL2-->QOM: Original query = {$originalSql2Query}"); } } }
/** * @dataProvider getSQL2WithWhitespace */ public function testPropertyComparisonWithWhitespace($sql2, $literal) { $qom = $this->parser->parse($sql2); $this->assertInstanceOf('PHPCR\\Query\\QOM\\ComparisonInterface', $qom->getConstraint()); $this->assertInstanceOf('PHPCR\\Query\\QOM\\PropertyValueInterface', $qom->getConstraint()->getOperand1()); $this->assertInstanceOf('PHPCR\\Query\\QOM\\LiteralInterface', $qom->getConstraint()->getOperand2()); $this->assertEquals('prop1', $qom->getConstraint()->getOperand1()->getPropertyName()); $this->assertEquals($literal, $qom->getConstraint()->getOperand2()->getLiteralValue()); }
public function execute(InputInterface $input, OutputInterface $output) { $sql = $this->getQuery($input); if (!preg_match('{^delete from}', strtolower($sql))) { throw new \PHPCR\Query\InvalidQueryException(sprintf('"FROM" not specified in DELETE query: "%s"', $sql)); } $session = $this->get('phpcr.session'); $qm = $session->getWorkspace()->getQueryManager(); $sql = 'SELECT * FROM' . substr($sql, 11); $selectParser = new Sql2ToQomQueryConverter($qm->getQOMFactory()); $query = $selectParser->parse($sql); $start = microtime(true); $result = $query->execute(); $rows = 0; foreach ($result as $row) { $rows++; $node = $row->getNode(); $node->remove(); } $elapsed = microtime(true) - $start; $output->writeln(sprintf('%s row(s) affected in %ss', $rows, number_format($elapsed, 2))); }
/** * {@inheritDoc} */ public function query(Query $query) { $this->assertLoggedIn(); if (!$query instanceof QueryObjectModelInterface) { $parser = new Sql2ToQomQueryConverter($this->factory->get('Query\\QOM\\QueryObjectModelFactory')); try { $qom = $parser->parse($query->getStatement()); $qom->setLimit($query->getLimit()); $qom->setOffset($query->getOffset()); } catch (\Exception $e) { throw new InvalidQueryException('Invalid query: ' . $query->getStatement(), null, $e); } } else { $qom = $query; } $qomWalker = new QOMWalker($this->nodeTypeManager, $this->getConnection(), $this->getNamespaces()); list($selectors, $selectorAliases, $sql) = $qomWalker->walkQOMQuery($qom); $primarySource = reset($selectors); $primaryType = $primarySource->getSelectorName() ?: $primarySource->getNodeTypeName(); $data = $this->getConnection()->fetchAll($sql, array($this->workspaceName)); $results = $properties = $standardColumns = array(); foreach ($data as $row) { $result = array(); /** @var SelectorInterface $selector */ foreach ($selectors as $selector) { $selectorName = $selector->getSelectorName() ?: $selector->getNodeTypeName(); $columnPrefix = isset($selectorAliases[$selectorName]) ? $selectorAliases[$selectorName] . '_' : $selectorAliases[''] . '_'; if ($primaryType === $selector->getNodeTypeName()) { $result[] = array('dcr:name' => 'jcr:path', 'dcr:value' => $row[$columnPrefix . 'path'], 'dcr:selectorName' => $selectorName); } $result[] = array('dcr:name' => 'jcr:path', 'dcr:value' => $row[$columnPrefix . 'path'], 'dcr:selectorName' => $selectorName); $result[] = array('dcr:name' => 'jcr:score', 'dcr:value' => 0, 'dcr:selectorName' => $selectorName); if (0 === count($qom->getColumns())) { $selectorPrefix = null !== $selector->getSelectorName() ? $selectorName . '.' : ''; $result[] = array('dcr:name' => $selectorPrefix . 'jcr:primaryType', 'dcr:value' => $primaryType, 'dcr:selectorName' => $selectorName); } if (isset($row[$columnPrefix . 'props'])) { $propertyNames = array(); $columns = $qom->getColumns(); // Always populate jcr:created and jcr:createdBy if a wildcard selector is used. // This emulates the behavior of Jackrabbit if (0 === count($columns)) { $propertyNames = array('jcr:created', 'jcr:createdBy'); } foreach ($columns as $column) { if (!$column->getSelectorName() || $column->getSelectorName() == $selectorName) { $propertyNames[] = $column->getPropertyName(); } } $properties[$selectorName] = (array) $this->xmlToColumns($row[$columnPrefix . 'props'], $propertyNames); } else { $properties[$selectorName] = array(); } // TODO: add other default columns that Jackrabbit provides to provide a more consistent behavior if (isset($properties[$selectorName]['jcr:createdBy'])) { $standardColumns[$selectorName]['jcr:createdBy'] = $properties[$selectorName]['jcr:createdBy']; } if (isset($properties[$selectorName]['jcr:created'])) { $standardColumns[$selectorName]['jcr:created'] = $properties[$selectorName]['jcr:created']; } } $reservedNames = array('jcr:path', 'jcr:score'); foreach ($qom->getColumns() as $column) { $selectorName = $column->getSelectorName(); $columnName = $column->getPropertyName(); $columnPrefix = isset($selectorAliases[$selectorName]) ? $selectorAliases[$selectorName] . '_' : $selectorAliases[''] . '_'; if (in_array($column->getColumnName(), $reservedNames)) { throw new InvalidQueryException(sprintf('Cannot reserved name "%s". Reserved names are "%s"', $column->getColumnName(), implode('", "', $reservedNames))); } $dcrValue = 'jcr:uuid' === $columnName ? $row[$columnPrefix . 'identifier'] : (isset($properties[$selectorName][$columnName]) ? $properties[$selectorName][$columnName] : ''); if (isset($standardColumns[$selectorName][$columnName])) { unset($standardColumns[$selectorName][$columnName]); } $result[] = array('dcr:name' => $column->getColumnName() === $columnName && isset($properties[$selectorName][$columnName]) ? $selectorName . '.' . $columnName : $column->getColumnName(), 'dcr:value' => $dcrValue, 'dcr:selectorName' => $selectorName ?: $primaryType); } foreach ($standardColumns as $selectorName => $columns) { foreach ($columns as $columnName => $value) { $result[] = array('dcr:name' => $primaryType . '.' . $columnName, 'dcr:value' => $value, 'dcr:selectorName' => $selectorName); } } $results[] = $result; } return $results; }
/** * {@inheritDoc} */ public function query(Query $query) { $this->assertLoggedIn(); if (!$query instanceof QueryObjectModelInterface) { $parser = new Sql2ToQomQueryConverter($this->factory->get('Query\\QOM\\QueryObjectModelFactory')); try { $qom = $parser->parse($query->getStatement()); $qom->setLimit($query->getLimit()); $qom->setOffset($query->getOffset()); } catch (\Exception $e) { throw new InvalidQueryException('Invalid query: ' . $query->getStatement(), null, $e); } } else { $qom = $query; } $qomWalker = new QOMWalker($this->nodeTypeManager, $this->api, $this->getNamespaces()); list($selectors, $selectorAliases, $query) = $qomWalker->walkQOMQuery($qom); $primarySource = reset($selectors); $primaryType = $primarySource->getSelectorName() ?: $primarySource->getNodeTypeName(); $data = $this->api->forms()->everything->ref($this->ref)->query($query)->submit(); // TODO implement $results = array(); return $results; }
/** * {@inheritDoc} */ public function query(Query $query) { $this->assertLoggedIn(); if (!$query instanceof QueryObjectModelInterface) { $parser = new Sql2ToQomQueryConverter($this->factory->get('Query\\QOM\\QueryObjectModelFactory')); try { $qom = $parser->parse($query->getStatement()); $qom->setLimit($query->getLimit()); $qom->setOffset($query->getOffset()); } catch (\Exception $e) { throw new InvalidQueryException('Invalid query: ' . $query->getStatement(), null, $e); } } else { $qom = $query; } // TODO: realize QOM handler // $qomWalker = new QOMWalker($this->nodeTypeManager, $this->db->getConnection(), $this->getNamespaces()); // list($selectors, $selectorAliases, $sql) = $qomWalker->walkQOMQuery($qom); }
/** * Get a query builder instance from an existing query * * @param string $statement the statement in the specified language * @param string $language the query language * * @return QueryBuilder This QueryBuilder instance. */ public function setFromQuery($statement, $language) { if (QueryInterface::JCR_SQL2 === $language) { $converter = new Sql2ToQomQueryConverter($this->qomFactory); $statement = $converter->parse($statement); } if (!$statement instanceof QueryObjectModelInterface) { throw new \InvalidArgumentException("Language '{$language}' not supported"); } $this->state = self::STATE_DIRTY; $this->source = $statement->getSource(); $this->constraint = $statement->getConstraint(); $this->orderings = $statement->getOrderings(); $this->columns = $statement->getColumns(); return $this; }
public function query(Query $query) { if (!$query instanceof QueryObjectModelInterface) { $parser = new Sql2ToQomQueryConverter($this->factory->get('Query\\QOM\\QueryObjectModelFactory')); try { $qom = $parser->parse($query->getStatement()); $qom->setLimit($query->getLimit()); $qom->setOffset($query->getOffset()); } catch (\Exception $e) { throw new InvalidQueryException('Invalid query: ' . $query->getStatement(), null, $e); } } else { $qom = $query; } return $this->getSearchAdapter()->query($this->workspaceName, $qom); }