org.springframework.cloud.gcp.data.datastore.repository.query.DatastorePageable Maven / Gradle / Ivy
/*
* Copyright 2019-2019 the original author or authors.
*
* Licensed 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
*
* https://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.springframework.cloud.gcp.data.datastore.repository.query;
import com.google.cloud.datastore.Cursor;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
/**
* A pageable implementation for Cloud Datastore that uses the cursor for efficient reads.
*
* @author Dmitry Solomakha
* @author Chengyuan Zhao
*/
public class DatastorePageable extends PageRequest {
private final String urlSafeCursor;
private final Long totalCount;
private DatastorePageable(Pageable pageable, String urlSafeCursor, Long totalCount) {
super(pageable.getPageNumber(), pageable.getPageSize(), pageable.getSort());
this.urlSafeCursor = urlSafeCursor;
this.totalCount = totalCount;
}
DatastorePageable(Pageable pageable, Cursor cursor, Long totalCount) {
this(pageable, cursor.toUrlSafe(), totalCount);
}
public static Pageable from(Pageable pageable, Cursor cursor, Long totalCount) {
return from(pageable, cursor == null ? null : cursor.toUrlSafe(), totalCount);
}
public static Pageable from(Pageable pageable, String urlSafeCursor, Long totalCount) {
if (pageable.isUnpaged()) {
return pageable;
}
return new DatastorePageable(pageable, urlSafeCursor, totalCount);
}
public String getUrlSafeCursor() {
return this.urlSafeCursor;
}
@Override
public Pageable next() {
return from(super.next(), this.urlSafeCursor, this.totalCount);
}
public Cursor toCursor() {
return this.urlSafeCursor == null ? null : Cursor.fromUrlSafe(this.urlSafeCursor);
}
public Long getTotalCount() {
return this.totalCount;
}
}