code: def test_partition_key_multiple_columns_query(self):
      df = get_pandas_df()
      df["second_group_by_key"] = ["a", "b", "c"]
  
      query = (
          dataframes.QueryBuilder(df, "privacy_key")
          .groupby(
              ["group_key", "second_group_by_key"],
              max_groups_contributed=8,
              max_contributions_per_group=11,
          )
          .sum("value", min_value=1, max_value=2.5)
          .build_query()
      )
  
      self.assertTrue(query._df.equals(df))
      self.assertEqual(
          query._columns,
          dataframes.Columns(
              "privacy_key",
              ["group_key", "second_group_by_key"],
              "value",
          ),
      )
      self.assertEqual(
          query._metrics_output_columns, {pipeline_dp.Metrics.SUM: None}
      )
  
imports: from absl.testing import absltest
  from absl.testing import parameterized
  from collections import namedtuple
  import pandas
  from pyspark import sql
  from unittest import mock
  from unittest.mock import patch
  from pipeline_dp import dataframes
  import pipeline_dp
label_desc: Use image node_id 16 for calling the QueryBuilderTest obj's underlying member method code with example usage: obj.test_partition_key_multiple_columns_query() without return types