public Builder mergeFrom(com.google.spanner.v1.PartialResultSet other) { if (other == com.google.spanner.v1.PartialResultSet.getDefaultInstance()) return this; if (other.hasMetadata()) { mergeMetadata(other.getMetadata()); if (other.getChunkedValue() != false) { setChunkedValue(other.getChunkedValue()); if (other.getResumeToken() != com.google.protobuf.ByteString.EMPTY) { setResumeToken(other.getResumeToken()); if (other.hasStats()) { mergeStats(other.getStats());
@java.lang.Override public int hashCode() { if (memoizedHashCode != 0) { return memoizedHashCode; } int hash = 41; hash = (19 * hash) + getDescriptor().hashCode(); if (hasMetadata()) { hash = (37 * hash) + METADATA_FIELD_NUMBER; hash = (53 * hash) + getMetadata().hashCode(); } if (getValuesCount() > 0) { hash = (37 * hash) + VALUES_FIELD_NUMBER; hash = (53 * hash) + getValuesList().hashCode(); } hash = (37 * hash) + CHUNKED_VALUE_FIELD_NUMBER; hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getChunkedValue()); hash = (37 * hash) + RESUME_TOKEN_FIELD_NUMBER; hash = (53 * hash) + getResumeToken().hashCode(); if (hasStats()) { hash = (37 * hash) + STATS_FIELD_NUMBER; hash = (53 * hash) + getStats().hashCode(); } hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; }
@java.lang.Override public Builder newBuilderForType() { return newBuilder(); }
@java.lang.Override public boolean equals(final java.lang.Object obj) { if (obj == this) { return true; } if (!(obj instanceof com.google.spanner.v1.PartialResultSet)) { return super.equals(obj); } com.google.spanner.v1.PartialResultSet other = (com.google.spanner.v1.PartialResultSet) obj; boolean result = true; result = result && (hasMetadata() == other.hasMetadata()); if (hasMetadata()) { result = result && getMetadata().equals(other.getMetadata()); } result = result && getValuesList().equals(other.getValuesList()); result = result && (getChunkedValue() == other.getChunkedValue()); result = result && getResumeToken().equals(other.getResumeToken()); result = result && (hasStats() == other.hasStats()); if (hasStats()) { result = result && getStats().equals(other.getStats()); } result = result && unknownFields.equals(other.unknownFields); return result; }
/** * * * <pre> * Streaming calls might be interrupted for a variety of reasons, such * as TCP connection loss. If this occurs, the stream of results can * be resumed by re-sending the original request and including * `resume_token`. Note that executing any other transaction in the * same session invalidates the token. * </pre> * * <code>bytes resume_token = 4;</code> */ public Builder clearResumeToken() { resumeToken_ = getDefaultInstance().getResumeToken(); onChanged(); return this; }
private boolean ensureReady(StreamValue requiredValue) throws SpannerException { while (current == null || pos >= current.getValuesCount()) { if (!stream.hasNext()) { return false; if (type == null) { if (!current.hasMetadata() || !current.getMetadata().hasRowType()) { throw newSpannerException(ErrorCode.INTERNAL, "Missing type metadata in first message"); metadata = current.getMetadata(); com.google.spanner.v1.Type typeProto = com.google.spanner.v1.Type.newBuilder() if (current.hasStats()) { statistics = current.getStats();
return null; com.google.protobuf.Value value = current.getValues(pos++); KindCase kind = value.getKindCase(); if (pos == current.getValuesCount() && current.getChunkedValue()) { throw newSpannerException(ErrorCode.INTERNAL, "Unexpected chunked PartialResultSet."); } else { if (!current.getChunkedValue() || pos != current.getValuesCount()) { return value; ? value.getStringValue() : new ArrayList<com.google.protobuf.Value>(value.getListValue().getValuesList()); while (current.getChunkedValue() && pos == current.getValuesCount()) { if (!ensureReady(StreamValue.RESULT)) { throw newSpannerException( ErrorCode.INTERNAL, "Stream closed in the middle of chunked value"); com.google.protobuf.Value newValue = current.getValues(pos++); if (newValue.getKindCase() != kind) { throw newSpannerException(
@java.lang.Override public com.google.spanner.v1.PartialResultSet getDefaultInstanceForType() { return com.google.spanner.v1.PartialResultSet.getDefaultInstance(); }
@java.lang.Override public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { if (metadata_ != null) { output.writeMessage(1, getMetadata()); } for (int i = 0; i < values_.size(); i++) { output.writeMessage(2, values_.get(i)); } if (chunkedValue_ != false) { output.writeBool(3, chunkedValue_); } if (!resumeToken_.isEmpty()) { output.writeBytes(4, resumeToken_); } if (stats_ != null) { output.writeMessage(5, getStats()); } unknownFields.writeTo(output); }
@Test public void emptyMultipleResponses() { PartialResultSet partialResultSet = PartialResultSet.newBuilder() .setMetadata(makeMetadata(Type.struct(Type.StructField.of("f", Type.string())))) .build(); consumer.onPartialResultSet(partialResultSet); consumer.onPartialResultSet(PartialResultSet.getDefaultInstance()); consumer.onPartialResultSet(PartialResultSet.getDefaultInstance()); consumer.onCompleted(); assertThat(resultSet.next()).isFalse(); }
&& (finished || !safeToRetry || !buffer.getLast().getResumeToken().isEmpty())) { return buffer.pop(); if (stream.hasNext()) { PartialResultSet next = stream.next(); boolean hasResumeToken = !next.getResumeToken().isEmpty(); if (hasResumeToken) { resumeToken = next.getResumeToken(); safeToRetry = true; if (buffer.size() > maxBufferSize && buffer.getLast().getResumeToken().isEmpty()) { logger.log(Level.FINE, "Retryable exception, will sleep and retry", e); while (!buffer.isEmpty() && buffer.getLast().getResumeToken().isEmpty()) { buffer.removeLast(); assert buffer.isEmpty() || buffer.getLast().getResumeToken().equals(resumeToken); stream = null; try (Scope s = tracer.withSpan(span)) {
/** * * * <pre> * Metadata about the result set, such as row type information. * Only present in the first response. * </pre> * * <code>.google.spanner.v1.ResultSetMetadata metadata = 1;</code> */ public com.google.spanner.v1.ResultSetMetadataOrBuilder getMetadataOrBuilder() { return getMetadata(); }
/** * * * <pre> * Query plan and execution statistics for the statement that produced this * streaming result set. These can be requested by setting * [ExecuteSqlRequest.query_mode][google.spanner.v1.ExecuteSqlRequest.query_mode] and are sent * only once with the last response in the stream. * This field will also be present in the last response for DML * statements. * </pre> * * <code>.google.spanner.v1.ResultSetStats stats = 5;</code> */ public com.google.spanner.v1.ResultSetStatsOrBuilder getStatsOrBuilder() { return getStats(); }
@Override protected String computeNext() { while (true) { if (!buffer.isEmpty()) { return buffer.pop(); } if (!iterator.hasNext()) { endOfData(); return null; } for (Value value : iterator.next().getValuesList()) { buffer.add(value.getStringValue()); } } } };
private boolean ensureReady(StreamValue requiredValue) throws SpannerException { while (current == null || pos >= current.getValuesCount()) { if (!stream.hasNext()) { return false; if (type == null) { if (!current.hasMetadata() || !current.getMetadata().hasRowType()) { throw newSpannerException(ErrorCode.INTERNAL, "Missing type metadata in first message"); metadata = current.getMetadata(); com.google.spanner.v1.Type typeProto = com.google.spanner.v1.Type.newBuilder() if (current.hasStats()) { statistics = current.getStats();
return null; com.google.protobuf.Value value = current.getValues(pos++); KindCase kind = value.getKindCase(); if (pos == current.getValuesCount() && current.getChunkedValue()) { throw newSpannerException(ErrorCode.INTERNAL, "Unexpected chunked PartialResultSet."); } else { if (!current.getChunkedValue() || pos != current.getValuesCount()) { return value; ? value.getStringValue() : new ArrayList<com.google.protobuf.Value>(value.getListValue().getValuesList()); while (current.getChunkedValue() && pos == current.getValuesCount()) { if (!ensureReady(StreamValue.RESULT)) { throw newSpannerException( ErrorCode.INTERNAL, "Stream closed in the middle of chunked value"); com.google.protobuf.Value newValue = current.getValues(pos++); if (newValue.getKindCase() != kind) { throw newSpannerException(
.setResponseMarshaller( io.grpc.protobuf.ProtoUtils.marshaller( com.google.spanner.v1.PartialResultSet.getDefaultInstance())) .setSchemaDescriptor(new SpannerMethodDescriptorSupplier("StreamingRead")) .build();
@java.lang.Override public int getSerializedSize() { int size = memoizedSize; if (size != -1) return size; size = 0; if (metadata_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getMetadata()); } for (int i = 0; i < values_.size(); i++) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, values_.get(i)); } if (chunkedValue_ != false) { size += com.google.protobuf.CodedOutputStream.computeBoolSize(3, chunkedValue_); } if (!resumeToken_.isEmpty()) { size += com.google.protobuf.CodedOutputStream.computeBytesSize(4, resumeToken_); } if (stats_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, getStats()); } size += unknownFields.getSerializedSize(); memoizedSize = size; return size; }
&& (finished || !safeToRetry || !buffer.getLast().getResumeToken().isEmpty())) { return buffer.pop(); if (stream.hasNext()) { PartialResultSet next = stream.next(); boolean hasResumeToken = !next.getResumeToken().isEmpty(); if (hasResumeToken) { resumeToken = next.getResumeToken(); safeToRetry = true; if (buffer.size() > maxBufferSize && buffer.getLast().getResumeToken().isEmpty()) { logger.log(Level.FINE, "Retryable exception, will sleep and retry", e); while (!buffer.isEmpty() && buffer.getLast().getResumeToken().isEmpty()) { buffer.removeLast(); assert buffer.isEmpty() || buffer.getLast().getResumeToken().equals(resumeToken); stream = null; try (Scope s = tracer.withSpan(span)) {
static PartialResultSet resultSet(@Nullable ByteString resumeToken, String... data) { PartialResultSet.Builder builder = PartialResultSet.newBuilder(); if (resumeToken != null) { builder.setResumeToken(resumeToken); } for (String s : data) { builder.addValuesBuilder().setStringValue(s); } return builder.build(); }