Skip to content

Commit acc6cb8

Browse files
feat: add session support (#1652)
Adds: - CreateSession to Query config - SessionInfo in JobStatistics to record session stats
1 parent fa3b477 commit acc6cb8

File tree

7 files changed

+177
-2
lines changed

7 files changed

+177
-2
lines changed

google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobStatistics.java

Lines changed: 88 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public abstract class JobStatistics implements Serializable {
4545
private final ScriptStatistics scriptStatistics;
4646
private final List<ReservationUsage> reservationUsage;
4747
private final TransactionInfo transactionInfo;
48+
private final SessionInfo sessionInfo;
4849

4950
/** A Google BigQuery Copy Job statistics. */
5051
public static class CopyStatistics extends JobStatistics {
@@ -1251,6 +1252,76 @@ static TransactionInfo fromPb(
12511252
}
12521253
}
12531254

1255+
// SessionInfo contains information about the session if this job is part of one.
1256+
public static class SessionInfo {
1257+
1258+
// Id of the session
1259+
private final String sessionId;
1260+
1261+
public static class Builder {
1262+
1263+
private String sessionId;
1264+
1265+
private Builder() {};
1266+
1267+
Builder setSessionId(String sessionId) {
1268+
this.sessionId = sessionId;
1269+
return this;
1270+
}
1271+
1272+
SessionInfo build() {
1273+
return new SessionInfo(this);
1274+
}
1275+
}
1276+
1277+
private SessionInfo(Builder builder) {
1278+
this.sessionId = builder.sessionId;
1279+
}
1280+
1281+
public String getSessionId() {
1282+
return sessionId;
1283+
}
1284+
1285+
static Builder newBuilder() {
1286+
return new Builder();
1287+
}
1288+
1289+
ToStringHelper toStringHelper() {
1290+
return MoreObjects.toStringHelper(this).add("sessionId", sessionId);
1291+
}
1292+
1293+
@Override
1294+
public String toString() {
1295+
return toStringHelper().toString();
1296+
}
1297+
1298+
@Override
1299+
public boolean equals(Object obj) {
1300+
return obj == this
1301+
|| obj != null
1302+
&& obj.getClass().equals(SessionInfo.class)
1303+
&& Objects.equals(toPb(), ((SessionInfo) obj).toPb());
1304+
}
1305+
1306+
@Override
1307+
public int hashCode() {
1308+
return Objects.hash(sessionId);
1309+
}
1310+
1311+
com.google.api.services.bigquery.model.SessionInfo toPb() {
1312+
com.google.api.services.bigquery.model.SessionInfo sessionInfo =
1313+
new com.google.api.services.bigquery.model.SessionInfo();
1314+
sessionInfo.setSessionId(sessionId);
1315+
return sessionInfo;
1316+
}
1317+
1318+
static SessionInfo fromPb(com.google.api.services.bigquery.model.SessionInfo sessionInfo) {
1319+
SessionInfo.Builder builder = newBuilder();
1320+
builder.setSessionId(sessionInfo.getSessionId());
1321+
return builder.build();
1322+
}
1323+
}
1324+
12541325
abstract static class Builder<T extends JobStatistics, B extends Builder<T, B>> {
12551326

12561327
private Long creationTime;
@@ -1261,6 +1332,7 @@ abstract static class Builder<T extends JobStatistics, B extends Builder<T, B>>
12611332
private ScriptStatistics scriptStatistics;
12621333
private List<ReservationUsage> reservationUsage;
12631334
private TransactionInfo transactionInfo;
1335+
private SessionInfo sessionInfo;
12641336

12651337
protected Builder() {}
12661338

@@ -1280,6 +1352,9 @@ protected Builder(com.google.api.services.bigquery.model.JobStatistics statistic
12801352
if (statisticsPb.getTransactionInfo() != null) {
12811353
this.transactionInfo = TransactionInfo.fromPb(statisticsPb.getTransactionInfo());
12821354
}
1355+
if (statisticsPb.getSessionInfo() != null) {
1356+
this.sessionInfo = SessionInfo.fromPb(statisticsPb.getSessionInfo());
1357+
}
12831358
}
12841359

12851360
@SuppressWarnings("unchecked")
@@ -1314,6 +1389,7 @@ protected JobStatistics(Builder builder) {
13141389
this.scriptStatistics = builder.scriptStatistics;
13151390
this.reservationUsage = builder.reservationUsage;
13161391
this.transactionInfo = builder.transactionInfo;
1392+
this.sessionInfo = builder.sessionInfo;
13171393
}
13181394

13191395
/** Returns the creation time of the job in milliseconds since epoch. */
@@ -1362,6 +1438,11 @@ public TransactionInfo getTransactionInfo() {
13621438
return transactionInfo;
13631439
}
13641440

1441+
/** Info of the session if this job is part of one. */
1442+
public SessionInfo getSessionInfo() {
1443+
return sessionInfo;
1444+
}
1445+
13651446
ToStringHelper toStringHelper() {
13661447
return MoreObjects.toStringHelper(this)
13671448
.add("creationTime", creationTime)
@@ -1371,7 +1452,8 @@ ToStringHelper toStringHelper() {
13711452
.add("parentJobId", parentJobId)
13721453
.add("scriptStatistics", scriptStatistics)
13731454
.add("reservationUsage", reservationUsage)
1374-
.add("transactionInfo", transactionInfo);
1455+
.add("transactionInfo", transactionInfo)
1456+
.add("sessionInfo", sessionInfo);
13751457
}
13761458

13771459
@Override
@@ -1388,7 +1470,8 @@ final int baseHashCode() {
13881470
parentJobId,
13891471
scriptStatistics,
13901472
reservationUsage,
1391-
transactionInfo);
1473+
transactionInfo,
1474+
sessionInfo);
13921475
}
13931476

13941477
final boolean baseEquals(JobStatistics jobStatistics) {
@@ -1413,6 +1496,9 @@ com.google.api.services.bigquery.model.JobStatistics toPb() {
14131496
if (transactionInfo != null) {
14141497
statistics.setTransactionInfo(transactionInfo.toPb());
14151498
}
1499+
if (sessionInfo != null) {
1500+
statistics.setSessionInfo(sessionInfo.toPb());
1501+
}
14161502
return statistics;
14171503
}
14181504

google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/QueryJobConfiguration.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public final class QueryJobConfiguration extends JobConfiguration {
5656
private final DatasetId defaultDataset;
5757
private final Priority priority;
5858
private final Boolean allowLargeResults;
59+
private final Boolean createSession;
5960
private final Boolean useQueryCache;
6061
private final Boolean flattenResults;
6162
private final Boolean dryRun;
@@ -108,6 +109,7 @@ public static final class Builder
108109
private DatasetId defaultDataset;
109110
private Priority priority;
110111
private Boolean allowLargeResults;
112+
private Boolean createSession;
111113
private Boolean useQueryCache;
112114
private Boolean flattenResults;
113115
private Boolean dryRun;
@@ -142,6 +144,7 @@ private Builder(QueryJobConfiguration jobConfiguration) {
142144
this.defaultDataset = jobConfiguration.defaultDataset;
143145
this.priority = jobConfiguration.priority;
144146
this.allowLargeResults = jobConfiguration.allowLargeResults;
147+
this.createSession = jobConfiguration.createSession;
145148
this.useQueryCache = jobConfiguration.useQueryCache;
146149
this.flattenResults = jobConfiguration.flattenResults;
147150
this.dryRun = jobConfiguration.dryRun;
@@ -185,6 +188,7 @@ private Builder(com.google.api.services.bigquery.model.JobConfiguration configur
185188
}
186189
}
187190
allowLargeResults = queryConfigurationPb.getAllowLargeResults();
191+
createSession = queryConfigurationPb.getCreateSession();
188192
useQueryCache = queryConfigurationPb.getUseQueryCache();
189193
flattenResults = queryConfigurationPb.getFlattenResults();
190194
useLegacySql = queryConfigurationPb.getUseLegacySql();
@@ -460,6 +464,16 @@ public Builder setPriority(Priority priority) {
460464
return this;
461465
}
462466

467+
/**
468+
* Sets whether to create a new session. If {@code true} a random session id will be generated
469+
* by BigQuery. If false, runs query with an existing session_id passed in ConnectionProperty,
470+
* otherwise runs query in non-session mode."
471+
*/
472+
public Builder setCreateSession(Boolean createSession) {
473+
this.createSession = createSession;
474+
return this;
475+
}
476+
463477
/**
464478
* Sets whether the job is enabled to create arbitrarily large results. If {@code true} the
465479
* query is allowed to create large results at a slight cost in performance. If {@code true}
@@ -656,6 +670,7 @@ private QueryJobConfiguration(Builder builder) {
656670
namedParameters = ImmutableMap.copyOf(builder.namedParameters);
657671
this.parameterMode = builder.parameterMode;
658672
this.allowLargeResults = builder.allowLargeResults;
673+
this.createSession = builder.createSession;
659674
this.createDisposition = builder.createDisposition;
660675
this.defaultDataset = builder.defaultDataset;
661676
this.destinationTable = builder.destinationTable;
@@ -693,6 +708,15 @@ public Boolean allowLargeResults() {
693708
return allowLargeResults;
694709
}
695710

711+
/**
712+
* Returns whether to create a new session.
713+
*
714+
* @see <a href="https://cloud.google.com/bigquery/docs/sessions-create">Create Sessions</a>
715+
*/
716+
public Boolean createSession() {
717+
return createSession;
718+
}
719+
696720
/**
697721
* Returns whether the job is allowed to create new tables.
698722
*
@@ -897,6 +921,7 @@ ToStringHelper toStringHelper() {
897921
.add("destinationEncryptionConfiguration", destinationEncryptionConfiguration)
898922
.add("defaultDataset", defaultDataset)
899923
.add("allowLargeResults", allowLargeResults)
924+
.add("createSession", createSession)
900925
.add("flattenResults", flattenResults)
901926
.add("priority", priority)
902927
.add("tableDefinitions", tableDefinitions)
@@ -928,6 +953,7 @@ public int hashCode() {
928953
return Objects.hash(
929954
baseHashCode(),
930955
allowLargeResults,
956+
createSession,
931957
createDisposition,
932958
destinationTable,
933959
defaultDataset,
@@ -988,6 +1014,9 @@ com.google.api.services.bigquery.model.JobConfiguration toPb() {
9881014
if (allowLargeResults != null) {
9891015
queryConfigurationPb.setAllowLargeResults(allowLargeResults);
9901016
}
1017+
if (createSession != null) {
1018+
queryConfigurationPb.setCreateSession(createSession);
1019+
}
9911020
if (createDisposition != null) {
9921021
queryConfigurationPb.setCreateDisposition(createDisposition.toString());
9931022
}

google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/QueryRequestInfo.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ final class QueryRequestInfo {
3737
private final String query;
3838
private final List<QueryParameter> queryParameters;
3939
private final String requestId;
40+
private final Boolean createSession;
4041
private final Boolean useQueryCache;
4142
private final Boolean useLegacySql;
4243

@@ -51,6 +52,7 @@ final class QueryRequestInfo {
5152
this.query = config.getQuery();
5253
this.queryParameters = config.toPb().getQuery().getQueryParameters();
5354
this.requestId = UUID.randomUUID().toString();
55+
this.createSession = config.createSession();
5456
this.useLegacySql = config.useLegacySql();
5557
this.useQueryCache = config.useQueryCache();
5658
}
@@ -97,6 +99,9 @@ QueryRequest toPb() {
9799
if (queryParameters != null) {
98100
request.setQueryParameters(queryParameters);
99101
}
102+
if (createSession != null) {
103+
request.setCreateSession(createSession);
104+
}
100105
if (useLegacySql != null) {
101106
request.setUseLegacySql(useLegacySql);
102107
}
@@ -118,6 +123,7 @@ public String toString() {
118123
.add("query", query)
119124
.add("requestId", requestId)
120125
.add("queryParameters", queryParameters)
126+
.add("createSession", createSession)
121127
.add("useQueryCache", useQueryCache)
122128
.add("useLegacySql", useLegacySql)
123129
.toString();
@@ -135,6 +141,7 @@ public int hashCode() {
135141
query,
136142
queryParameters,
137143
requestId,
144+
createSession,
138145
useQueryCache,
139146
useLegacySql);
140147
}

google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/JobStatisticsTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.google.cloud.bigquery.JobStatistics.ReservationUsage;
2727
import com.google.cloud.bigquery.JobStatistics.ScriptStatistics;
2828
import com.google.cloud.bigquery.JobStatistics.ScriptStatistics.ScriptStackFrame;
29+
import com.google.cloud.bigquery.JobStatistics.SessionInfo;
2930
import com.google.cloud.bigquery.JobStatistics.TransactionInfo;
3031
import com.google.cloud.bigquery.QueryStage.QueryStep;
3132
import com.google.common.collect.ImmutableList;
@@ -73,6 +74,7 @@ public class JobStatisticsTest {
7374
private static final String NAME = "reservation-name";
7475
private static final Long SLOTMS = 12545L;
7576
private static final String TRANSACTION_ID = UUID.randomUUID().toString().substring(0, 8);
77+
private static final String SESSION_ID = UUID.randomUUID().toString().substring(0, 8);
7678
private static final CopyStatistics COPY_STATISTICS =
7779
CopyStatistics.newBuilder()
7880
.setCreationTimestamp(CREATION_TIME)
@@ -222,6 +224,9 @@ public class JobStatisticsTest {
222224
private static final TransactionInfo TRANSACTION_INFO =
223225
TransactionInfo.newbuilder().setTransactionId(TRANSACTION_ID).build();
224226

227+
private static final SessionInfo SESSION_INFO =
228+
SessionInfo.newBuilder().setSessionId(SESSION_ID).build();
229+
225230
@Test
226231
public void testBuilder() {
227232
assertEquals(CREATION_TIME, EXTRACT_STATISTICS.getCreationTime());
@@ -293,6 +298,7 @@ public void testBuilder() {
293298
assertEquals(NAME, RESERVATION_USAGE.getName());
294299
assertEquals(SLOTMS, RESERVATION_USAGE.getSlotMs());
295300
assertEquals(TRANSACTION_ID, TRANSACTION_INFO.getTransactionId());
301+
assertEquals(SESSION_ID, SESSION_INFO.getSessionId());
296302
}
297303

298304
@Test
@@ -319,6 +325,7 @@ public void testToPbAndFromPb() {
319325
}
320326
compareReservation(RESERVATION_USAGE, ReservationUsage.fromPb(RESERVATION_USAGE.toPb()));
321327
compareTransactionInfo(TRANSACTION_INFO, TransactionInfo.fromPb(TRANSACTION_INFO.toPb()));
328+
compareSessionInfo(SESSION_INFO, SessionInfo.fromPb(SESSION_INFO.toPb()));
322329
}
323330

324331
@Test
@@ -441,4 +448,12 @@ private void compareTransactionInfo(TransactionInfo expected, TransactionInfo va
441448
assertEquals(expected.toPb(), value.toPb());
442449
assertEquals(expected.getTransactionId(), value.getTransactionId());
443450
}
451+
452+
private void compareSessionInfo(SessionInfo expected, SessionInfo value) {
453+
assertEquals(expected, value);
454+
assertEquals(expected.hashCode(), value.hashCode());
455+
assertEquals(expected.toString(), value.toString());
456+
assertEquals(expected.toPb(), value.toPb());
457+
assertEquals(expected.getSessionId(), value.getSessionId());
458+
}
444459
}

google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryJobConfigurationTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ public class QueryJobConfigurationTest {
7878
private static final Priority PRIORITY = Priority.BATCH;
7979
private static final boolean ALLOW_LARGE_RESULTS = true;
8080
private static final boolean USE_QUERY_CACHE = false;
81+
private static final boolean CREATE_SESSION = true;
8182
private static final boolean FLATTEN_RESULTS = true;
8283
private static final boolean USE_LEGACY_SQL = true;
8384
private static final Integer MAX_BILLING_TIER = 123;
@@ -119,6 +120,7 @@ public class QueryJobConfigurationTest {
119120
.setDestinationTable(TABLE_ID)
120121
.setWriteDisposition(WRITE_DISPOSITION)
121122
.setPriority(PRIORITY)
123+
.setCreateSession(CREATE_SESSION)
122124
.setFlattenResults(FLATTEN_RESULTS)
123125
.setUserDefinedFunctions(USER_DEFINED_FUNCTIONS)
124126
.setDryRun(true)
@@ -238,6 +240,7 @@ private void compareQueryJobConfiguration(
238240
assertEquals(expected.getCreateDisposition(), value.getCreateDisposition());
239241
assertEquals(expected.getDefaultDataset(), value.getDefaultDataset());
240242
assertEquals(expected.getDestinationTable(), value.getDestinationTable());
243+
assertEquals(expected.createSession(), value.createSession());
241244
assertEquals(expected.flattenResults(), value.flattenResults());
242245
assertEquals(expected.getPriority(), value.getPriority());
243246
assertEquals(expected.getQuery(), value.getQuery());

google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryRequestInfoTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ public class QueryRequestInfoTest {
7474
private static final WriteDisposition WRITE_DISPOSITION = WriteDisposition.WRITE_APPEND;
7575
private static final Priority PRIORITY = Priority.BATCH;
7676
private static final boolean ALLOW_LARGE_RESULTS = true;
77+
private static final boolean CREATE_SESSION = true;
7778
private static final boolean USE_QUERY_CACHE = false;
7879
private static final boolean FLATTEN_RESULTS = true;
7980
private static final boolean USE_LEGACY_SQL = true;
@@ -142,6 +143,7 @@ public class QueryRequestInfoTest {
142143
.setLabels(LABELS)
143144
.setConnectionProperties(CONNECTION_PROPERTIES)
144145
.setPositionalParameters(POSITIONAL_PARAMETER)
146+
.setCreateSession(CREATE_SESSION)
145147
.setMaxResults(100L)
146148
.build();
147149
QueryRequestInfo REQUEST_INFO_SUPPORTED = new QueryRequestInfo(QUERY_JOB_CONFIGURATION_SUPPORTED);

0 commit comments

Comments
 (0)