cgivre commented on a change in pull request #2414: URL: https://github.com/apache/drill/pull/2414#discussion_r779659605
########## File path: contrib/storage-http/src/main/java/org/apache/drill/exec/store/http/paginator/OffsetPaginator.java ########## @@ -0,0 +1,117 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.drill.exec.store.http.paginator; + +import okhttp3.HttpUrl; +import okhttp3.HttpUrl.Builder; +import org.apache.drill.common.exceptions.UserException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; + +public class OffsetPaginator extends Paginator { + + private static final Logger logger = LoggerFactory.getLogger(OffsetPaginator.class); + + private final int limit; + private final String limitField; + private final String offsetField; + private int offset; + + /** + * This class implements the idea of an Offset Paginator. See here for complete explanation: + * https://nordicapis.com/everything-you-need-to-know-about-api-pagination/ + * <p> + * + * @param builder The okhttp3 URL builder which has the API root URL + * @param limit The limit clause from the sql query + * @param maxPageSize The maximum page size the API documentation + * @param limitField The field name which corresponds to the limit field from the API + * @param offsetField The field name which corresponds to the offset field from the API + */ + public OffsetPaginator(Builder builder, int limit, int maxPageSize, String limitField, String offsetField) { + super(builder, paginationMode.OFFSET, maxPageSize, limit > 0); + this.limit = limit; + this.limitField = limitField; + this.offsetField = offsetField; + this.paginatedUrls = buildPaginatedURLs(); + this.offset = 0; + + // Page size must be greater than zero + if (maxPageSize <= 0) { + throw UserException + .validationError() + .message("API limit cannot be zero") + .build(logger); + } + } + + public int getLimit() { + return limit; + } + + @Override + public String next() { + if (hasLimit) { + return super.next(); + } else { + return generateNextUrl(); + } + } + + @Override + public String generateNextUrl() { + builder.removeAllEncodedQueryParameters(offsetField); + builder.removeAllEncodedQueryParameters(limitField); + + builder.addQueryParameter(offsetField, String.valueOf(offset)); + builder.addQueryParameter(limitField, String.valueOf(maxPageSize)); + offset += maxPageSize; + + return builder.build().url().toString(); + } + + + /** + * Build the paginated URLs. If the parameters are invalid, return a list with the original URL. + * + * @return List of paginated URLs + */ + @Override + public List<HttpUrl> buildPaginatedURLs() { + this.paginatedUrls = new ArrayList<>(); + // If user wants 1000 records, and the max page size is 100, we need to send 10 requests Review comment: Fixed. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
