/** * Take a GQL RunQuery request and convert to a standard RunQuery request * * Always expected to be called in the stack ->gql()->execute()->runGqlAsBasicQuery() * * @param ProtocolMessage $obj_gql_request * @return null * @throws \GDS\Exception\GQL */ private function executeGqlAsBasicQuery(ProtocolMessage $obj_gql_request) { // Set up the new request $obj_query_request = $this->setupRunQuery(); $obj_query = $obj_query_request->mutableQuery(); // Transfer any transaction data to the new request /** @var RunQueryRequest $obj_gql_request */ if ($obj_gql_request->mutableReadOptions()->hasTransaction()) { $obj_query_request->mutableReadOptions()->setTransaction($obj_gql_request->mutableReadOptions()->getTransaction()); } // Parse the GQL string $obj_gql_query = $obj_gql_request->getGqlQuery(); $obj_parser = new ProtoBufGQLParser(); $obj_parser->parse($obj_gql_query->getQueryString(), $obj_gql_query->getNameArgList()); // Start applying to the new RunQuery request $obj_query->addKind()->setName($obj_parser->getKind()); foreach ($obj_parser->getOrderBy() as $arr_order_by) { $obj_query->addOrder()->setDirection($arr_order_by['direction'])->mutableProperty()->setName($arr_order_by['property']); } // Limits, Offsets, Cursors $obj_parser->getLimit() && $obj_query->setLimit($obj_parser->getLimit()); $obj_parser->getOffset() && $obj_query->setOffset($obj_parser->getOffset()); $obj_parser->getStartCursor() && $obj_query->setStartCursor($obj_parser->getStartCursor()); // @todo @ $obj_query->setEndCursor(); // Filters $int_filters = count($obj_parser->getFilters()); if (1 === $int_filters) { $this->configureFilterFromGql($obj_query->mutableFilter()->mutablePropertyFilter(), $obj_parser->getFilters()[0]); } else { if (1 < $int_filters) { $obj_composite_filter = $obj_query->mutableFilter()->mutableCompositeFilter()->setOperator(\google\appengine\datastore\v4\CompositeFilter\Operator::AND_); foreach ($obj_parser->getFilters() as $arr_filter) { $this->configureFilterFromGql($obj_composite_filter->addFilter()->mutablePropertyFilter(), $arr_filter); } } } return $this->execute('RunQuery', $obj_query_request, new RunQueryResponse()); }