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());
 }
Пример #3
0
 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)));
 }
Пример #4
0
 /**
  * {@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;
 }
Пример #5
0
 /**
  * {@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;
 }
Пример #6
0
 /**
  * {@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);
 }
Пример #7
0
 /**
  * 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;
 }
Пример #8
0
 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);
 }