/** * @expectedException PHPUnit_Framework_Error_Warning */ public function testSearchException() { $client = $this->getClientMock(); $backend = new ElasticSearch($client, 'indexName'); $client->expects($this->once())->method('search')->will($this->throwException(new Exception("Fail"))); $ast = Parser::parse([]); $queryParams = ['page' => 1, 'limit' => 20, 'from' => '2015-01-01', 'to' => '2015-01-31']; $backend->search(['foo', 'bar'], $ast, $queryParams); }
/** * @dataProvider getInvalidDslQueries */ public function testParserThrowsExceptionOnInvalidQueriesUsingAnInvalidDslQuery($query, $expectedError) { try { Parser::parse($query); $this->fail('Expected the query to fail with an exception'); } catch (\InvalidArgumentException $e) { $this->assertEquals($expectedError, $e->getMessage()); return true; } $this->fail('Expected the query to fail with a InvalidArgumentException exception'); }
/** * Handle metadata search operation * * page => Page number. Defaults to 1 * limit => Limit to a number of images pr. page. Defaults to 20 * metadata => Whether or not to include metadata pr. image. Set to 1 to enable * query => urlencoded json data to use in the query * from => Unix timestamp to fetch from * to => Unit timestamp to fetch to * * @param Imbo\EventListener\ListenerInterface $event The current event * @param array $users Array with image identifiers */ protected function searchHandler(EventInterface $event, array $users) { $request = $event->getRequest(); $params = $request->query; // Extract query $metadataQuery = $request->getContent(); // If no metadata is provided, we'll let db.images.load take over if (!$metadataQuery) { $event->getManager()->trigger('db.images.load'); return; } // Check access token $event->getManager()->trigger('auth.accesstoken'); // Check that the public key has access to the users $this->validateAccess($event, $users); // Build query params array $queryParams = ['page' => $params->get('page', 1), 'limit' => $params->get('limit', 20), 'from' => $params->get('from'), 'to' => $params->get('to'), 'sort' => $this->getSortParams($event)]; if ($queryParams['page'] < 1) { throw new RuntimeException('Invalid param. "page" must be a positive number.', 400); } if ($queryParams['limit'] < 1) { throw new RuntimeException('Invalid param. "limit" must be a positive number.', 400); } // Parse the query JSON and transform it to an AST $ast = DslParser::parse($metadataQuery); // Query backend using the AST $backendResponse = $this->backend->search($users, $ast, $queryParams); // If we didn't get hits in the search backend, prepare a response if (!$backendResponse->getImageIdentifiers()) { // Create the model and set some pagination values $model = new ImagesModel(); $model->setLimit($queryParams['limit'])->setPage($queryParams['page'])->setHits($backendResponse->getHits()); $response = $event->getResponse(); $response->setModel($model); return; } $imageIdentifiers = $backendResponse->getImageIdentifiers(); // Set the ids to fetch from the Imbo backend $params->set('ids', $imageIdentifiers); // In order to paginate the already paginated resultset, we'll // set the page param to 0 before triggering db.images.load $params->set('page', 0); // Unset date range parameters $params->remove('to'); $params->remove('from'); // Trigger image loading from imbo DB $event->getManager()->trigger('db.images.load'); $responseModel = $event->getResponse()->getModel(); // Set the actual page used for querying search backend on the response $responseModel->setPage($queryParams['page']); $responseModel->setHits($backendResponse->getHits()); // Sort the response image so they match the order of identifiers // returned from search backend $this->sortSearchResponse($responseModel, $imageIdentifiers); }
/** * @dataProvider getQueries */ public function testTransformationsUsingAQuery($query, $expected) { $this->assertEquals($expected, $this->transformation->transform(Parser::parse($query))); }