1313// limitations under the License.
1414
1515#include " google/cloud/bigquery/v2/minimal/benchmarks/benchmark.h"
16+ #include " google/cloud/bigquery/v2/minimal/internal/common_v2_resources.h"
1617#include " google/cloud/common_options.h"
18+ #include " google/cloud/internal/absl_str_cat_quiet.h"
1719#include " google/cloud/internal/getenv.h"
1820#include " google/cloud/internal/make_status.h"
21+ #include " google/cloud/internal/random.h"
1922#include " google/cloud/options.h"
2023#include " google/cloud/stream_range.h"
2124#include " absl/time/time.h"
@@ -34,14 +37,17 @@ using ::google::cloud::bigquery_v2_minimal_internal::Dataset;
3437using ::google::cloud::bigquery_v2_minimal_internal::DatasetClient;
3538using ::google::cloud::bigquery_v2_minimal_internal::
3639 DatasetConnectionPoolSizeOption;
40+ using ::google::cloud::bigquery_v2_minimal_internal::EvaluationKind;
3741using ::google::cloud::bigquery_v2_minimal_internal::GetDatasetRequest;
3842using ::google::cloud::bigquery_v2_minimal_internal::GetJobRequest;
3943using ::google::cloud::bigquery_v2_minimal_internal::GetQueryResults;
4044using ::google::cloud::bigquery_v2_minimal_internal::GetQueryResultsRequest;
4145using ::google::cloud::bigquery_v2_minimal_internal::GetTableRequest;
46+ using ::google::cloud::bigquery_v2_minimal_internal::IndexUsageMode;
4247using ::google::cloud::bigquery_v2_minimal_internal::InsertJobRequest;
4348using ::google::cloud::bigquery_v2_minimal_internal::Job;
4449using ::google::cloud::bigquery_v2_minimal_internal::JobClient;
50+ using ::google::cloud::bigquery_v2_minimal_internal::KeyResultStatementKind;
4551using ::google::cloud::bigquery_v2_minimal_internal::ListDatasetsRequest;
4652using ::google::cloud::bigquery_v2_minimal_internal::ListFormatDataset;
4753using ::google::cloud::bigquery_v2_minimal_internal::ListFormatJob;
@@ -87,6 +93,20 @@ std::chrono::milliseconds ToChronoMillis(int m) {
8793 return std::chrono::milliseconds (m);
8894}
8995
96+ std::string GenerateJobId (std::string const & prefix = " " ) {
97+ auto constexpr kJobPrefix = " bqOdbcJob_benchmark_test_" ;
98+ std::string job_prefix = kJobPrefix ;
99+ if (!prefix.empty ()) {
100+ absl::StrAppend (&job_prefix, " _" , prefix);
101+ }
102+ auto generator = google::cloud::internal::MakeDefaultPRNG ();
103+ auto id = google::cloud::internal::Sample (generator, 32 ,
104+ " abcdefghijklmnopqrstuvwxyz" );
105+ std::string job_id;
106+ absl::StrAppend (&job_id, job_prefix, " _" , id);
107+ return job_id;
108+ }
109+
90110} // anonymous namespace
91111
92112void Benchmark::PrintThroughputResult (std::ostream& os,
@@ -352,15 +372,50 @@ StatusOr<Job> JobBenchmark::InsertJob() {
352372 // Set request body.
353373 Job job;
354374 std::string request_body;
375+ std::string job_id;
355376 if (config_.dry_run ) {
356377 request_body = JobConfig::GetInsertJobDryRunRequestBody ();
378+ job_id = GenerateJobId (" dry-run" );
357379 } else {
358380 request_body = JobConfig::GetInsertJobRequestBody ();
381+ job_id = GenerateJobId (" real-run" );
359382 }
360383 auto json = nlohmann::json::parse (request_body, nullptr , false );
384+ if (!json.is_object ()) {
385+ return internal::InternalError (
386+ " Invalid JSON: Unable to parse request body: " + request_body,
387+ GCP_ERROR_INFO ());
388+ }
361389 from_json (json, job);
362- request.set_job (job);
363390
391+ // Set Job Id;
392+ job.job_reference .job_id = job_id;
393+
394+ // Make sure some of the required enum fields are not empty.
395+ if (job.configuration .query .script_options .key_result_statement .value
396+ .empty ()) {
397+ job.configuration .query .script_options .key_result_statement =
398+ KeyResultStatementKind::UnSpecified ();
399+ }
400+ if (job.statistics .job_query_stats .search_statistics .index_usage_mode .value
401+ .empty ()) {
402+ job.statistics .job_query_stats .search_statistics .index_usage_mode =
403+ IndexUsageMode::UnSpecified ();
404+ }
405+ if (job.statistics .script_statistics .evaluation_kind .value .empty ()) {
406+ job.statistics .script_statistics .evaluation_kind =
407+ EvaluationKind::UnSpecified ();
408+ }
409+ request.set_job (job);
410+ // Remove Json fields that shouldn't be part of the InsertJob payload for
411+ // this test case.
412+ request.set_json_filter_keys (
413+ {" statistics" , " status" , " labels" , " destinationTable" ,
414+ " maximumBytesBilled" , " userDefinedFunctionResources" , " defaultDataset" ,
415+ " schemaUpdateOptions" , " timePartitioning" , " rangePartitioning" ,
416+ " clustering" , " destinationEncryptionConfiguration" , " scriptOptions" ,
417+ " connectionProperties" , " systemVariables" , " structTypes" ,
418+ " structValues" });
364419 return job_client_->InsertJob (request);
365420}
366421
0 commit comments