@Test public void testToUrlSafe() { byte[][] invalidUtf8 = new byte[][] {{(byte) 0xfe}, {(byte) 0xc1, (byte) 0xbf}, {(byte) 0xc0}, {(byte) 0x80}}; for (byte[] bytes : invalidUtf8) { assertFalse(ByteString.copyFrom(bytes).isValidUtf8()); Cursor cursor = new Cursor(ByteString.copyFrom(bytes)); assertEquals(cursor, Cursor.fromUrlSafe(cursor.toUrlSafe())); } }
/** Create a {@code Cursor} given its URL safe encoded form. */ public static Cursor fromUrlSafe(String urlSafe) { try { return Cursor.copyFrom(BaseEncoding.base64Url().decode(urlSafe)); } catch (IllegalArgumentException e) { throw new IllegalStateException("Unexpected decoding exception", e); } }
com.google.datastore.v1.GqlQueryParameter toPb() { com.google.datastore.v1.GqlQueryParameter.Builder argPb = com.google.datastore.v1.GqlQueryParameter.newBuilder(); if (cursor != null) { argPb.setCursor(cursor.getByteString()); } if (value != null) { argPb.setValue(value.toPb()); } return argPb.build(); }
@Test public void testToFromUrlSafe() throws Exception { String urlSafe = cursor1.toUrlSafe(); assertEquals(cursor1, Cursor.fromUrlSafe(urlSafe)); }
@Override public Cursor getCursorAfter() { return new Cursor(cursor); }
List<DatastoreKey> entities = new ArrayList<>(); DefaultQueryResponse<DatastoreKey> response = new DefaultQueryResponse<>(); response.setStartCursor(new DefaultDatastoreCursor(results.getCursorAfter().toUrlSafe())); while (results.hasNext()) { Key result = results.next(); response.setEndCursor(new DefaultDatastoreCursor(results.getCursorAfter().toUrlSafe())); return response; } catch (DatastoreException exp) {
} else if (bindingValue instanceof DatastoreCursor) { queryBuilder.setBinding(bindingName, Cursor.fromUrlSafe(((DatastoreCursor) bindingValue).getEncoded())); } else if (bindingValue instanceof GeoLocation) {
public static Cursor copyFrom(byte[] bytes) { return new Cursor(ByteString.copyFrom(checkNotNull(bytes))); }
gqlQueryBuilder.setBinding("Limit", limit); gqlQueryBuilder.setBinding("Offset", Cursor.fromUrlSafe(fromCursor.getEncoded())); GqlQuery<Key> gqlQuery = gqlQueryBuilder.build(); Datastore datastore = entityManager.getDatastore(); DefaultQueryResponse<String> response = new DefaultQueryResponse<>(); List<String> namespaces = new ArrayList<>(Math.max(limit, 50)); response.setStartCursor(new DefaultDatastoreCursor(results.getCursorAfter().toUrlSafe())); while (results.hasNext()) { Key key = results.next(); response.setEndCursor(new DefaultDatastoreCursor(results.getCursorAfter().toUrlSafe())); return response; } catch (DatastoreException exp) {
List<E> entities = new ArrayList<>(); DefaultQueryResponse<E> response = new DefaultQueryResponse<>(); response.setStartCursor(new DefaultDatastoreCursor(results.getCursorAfter().toUrlSafe())); while (results.hasNext()) { ProjectionEntity result = results.next(); response.setEndCursor(new DefaultDatastoreCursor(results.getCursorAfter().toUrlSafe()));
queryBuilder.addBinding(((DatastoreKey) binding).nativeKey()); } else if (binding instanceof DatastoreCursor) { queryBuilder.addBinding(Cursor.fromUrlSafe(((DatastoreCursor) binding).getEncoded())); } else if (binding instanceof GeoLocation) {
@Test public void testCopyFrom() throws Exception { Cursor cursor = Cursor.copyFrom(bytes2); assertEquals(cursor2, cursor); assertNotEquals(cursor1, cursor); } }
List<E> entities = new ArrayList<>(); DefaultQueryResponse<E> response = new DefaultQueryResponse<>(); response.setStartCursor(new DefaultDatastoreCursor(results.getCursorAfter().toUrlSafe())); while (results.hasNext()) { Entity result = results.next(); response.setEndCursor(new DefaultDatastoreCursor(results.getCursorAfter().toUrlSafe())); entityManager.executeEntityListeners(CallbackType.POST_LOAD, entities); return response;
queryPb.setStartCursor(startCursor.getByteString()); queryPb.setEndCursor(endCursor.getByteString());
static Binding fromPb(com.google.datastore.v1.GqlQueryParameter argPb) { switch (argPb.getParameterTypeCase()) { case CURSOR: return new Binding(new Cursor(argPb.getCursor())); case VALUE: return new Binding(Value.fromPb(argPb.getValue())); default: throw new AssertionError("Unexpected enum value " + argPb.getParameterTypeCase()); } } }
Cursor expectedEndCursor = Cursor.copyFrom(cursorIter.next().toByteArray()); assertEquals(expectedEndCursor, results.getCursorAfter()); if (resultCount < limit) {
com.google.datastore.v1.GqlQueryParameter toPb() { com.google.datastore.v1.GqlQueryParameter.Builder argPb = com.google.datastore.v1.GqlQueryParameter.newBuilder(); if (cursor != null) { argPb.setCursor(cursor.getByteString()); } if (value != null) { argPb.setValue(value.toPb()); } return argPb.build(); }
@Override StructuredQuery<V> nextQuery(com.google.datastore.v1.RunQueryResponse responsePb) { Builder<V> builder = toBuilder(); builder.setStartCursor(new Cursor(responsePb.getBatch().getEndCursor())); if (offset > 0 && responsePb.getBatch().getSkippedResults() < offset) { builder.setOffset(offset - responsePb.getBatch().getSkippedResults()); } else { builder.setOffset(0); if (limit != null) { builder.setLimit(limit - responsePb.getBatch().getEntityResultsCount()); } } return builder.build(); }
/** Create a {@code Cursor} given its URL safe encoded form. */ public static Cursor fromUrlSafe(String urlSafe) { try { return Cursor.copyFrom(BaseEncoding.base64Url().decode(urlSafe)); } catch (IllegalArgumentException e) { throw new IllegalStateException("Unexpected decoding exception", e); } }