@Override
  public void crossJoin(DataRequest request, List<String> entitySetNames, ODataResponse response)
      throws ODataLibraryException, ODataApplicationException {

    final ODataSQLBuilder visitor =
        new ODataSQLBuilder(
            this.odata,
            getClient().getMetadataStore(),
            this.prepared,
            true,
            request.getODataRequest().getRawBaseUri(),
            this.serviceMetadata,
            this.nameGenerator);
    visitor.visit(request.getUriInfo());

    try {
      Query query = visitor.selectQuery();
      BaseResponse queryResponse = executeQuery(request, request.isCountRequest(), visitor, query);
      ContextURL.Builder builder =
          new ContextURL.Builder().asCollection().entitySetOrSingletonOrType("Edm.ComplexType");

      EdmComplexResponse complexResponse =
          EdmComplexResponse.getInstance(request, builder.build(), false, response);
      sendResults(request, visitor, queryResponse, complexResponse);
    } catch (Exception e) {
      throw new ODataApplicationException(
          e.getMessage(),
          HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode(),
          Locale.getDefault(),
          e);
    }
  }
  @Override
  public void upsertEntity(
      DataRequest request, Entity entity, boolean merge, String entityETag, EntityResponse response)
      throws ODataLibraryException, ODataApplicationException {

    final ODataSQLBuilder visitor =
        new ODataSQLBuilder(
            this.odata,
            getClient().getMetadataStore(),
            this.prepared,
            true,
            request.getODataRequest().getRawBaseUri(),
            this.serviceMetadata,
            this.nameGenerator);
    visitor.visit(request.getUriInfo());

    final EntityCollectionResponse queryResponse;
    try {
      Query query = visitor.selectQuery();
      queryResponse =
          (EntityCollectionResponse)
              executeQuery(request, request.isCountRequest(), visitor, query);
    } catch (Exception e) {
      throw new ODataApplicationException(
          e.getMessage(),
          HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode(),
          Locale.getDefault(),
          e);
    }

    if (!queryResponse.getEntities().isEmpty()) {
      updateEntity(request, entity, merge, entityETag, response);
    } else {
      createEntity(request, entity, response);
    }
  }