As you can see from existing tests, Beam doesn't materialize the output
array directly. Instead you must use the PAssert API. I agree with Tyson's
suggestion to use `satisfies`, which lets you do arbitrary assertions on
the output data.

On Tue, Mar 2, 2021 at 3:57 AM Sonam Ramchand <
sonam.ramch...@venturedive.com> wrote:

> Is there any way I can access the output array resulting from the sql
> query? Then maybe I can sort and compare both *output array* and *expected
> output array *for the test to pass.
>
> On Tue, Mar 2, 2021 at 12:24 AM Kenneth Knowles <k...@apache.org> wrote:
>
>> Yea, the reason is that SQL relations are not ordered. So any ordering of
>> [1, 2, 3, 4] and [5, 6] and [7, 8, 9] is possible and correct.
>>
>> Kenn
>>
>> On Mon, Mar 1, 2021 at 11:01 AM Tyson Hamilton <tyso...@google.com>
>> wrote:
>>
>>> I didn't find anything like that after a brief look. What you could do
>>> instead is something like:
>>>
>>> PAssert.thatSingleton(stream).satisfies( row -> assertThat("array_field
>>> containsInAnyOrder", row.getArray("array_field"),
>>> containsInAnyOrder(Arrays.asList(...)));
>>>
>>> using junit/hamcrest matchers. I didn't verify this works myself but it
>>> should give you an idea for some next steps.
>>>
>>>
>>> On Mon, Mar 1, 2021 at 12:37 AM Sonam Ramchand <
>>> sonam.ramch...@venturedive.com> wrote:
>>>
>>>> Hi Devs,
>>>> I have implemented the ARRAY_CONCAT_AGG function for zetasql dialect. I
>>>> am trying to validate the test as:
>>>>
>>>> @Test
>>>> public void testArrayConcatAggZetasql() {
>>>>   String sql =
>>>>       "SELECT ARRAY_CONCAT_AGG(x) AS array_concat_agg FROM (SELECT [1, 2, 
>>>> 3, 4] AS x UNION ALL SELECT [5, 6] UNION ALL SELECT [7, 8, 9])";
>>>>
>>>>   ZetaSQLQueryPlanner zetaSQLQueryPlanner = new 
>>>> ZetaSQLQueryPlanner(config);
>>>>   BeamRelNode beamRelNode = zetaSQLQueryPlanner.convertToBeamRel(sql);
>>>>   PCollection<Row> stream = BeamSqlRelUtils.toPCollection(pipeline, 
>>>> beamRelNode);
>>>>
>>>>   Schema schema = Schema.builder().addArrayField("array_field", 
>>>> FieldType.INT64).build();
>>>>   PAssert.that(stream)
>>>>       .containsInAnyOrder(
>>>>           Row.withSchema(schema).addArray(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 
>>>> 9L).build());
>>>>   
>>>> pipeline.run().waitUntilFinish(Duration.standardMinutes(PIPELINE_EXECUTION_WAITTIME_MINUTES));
>>>> }
>>>>
>>>> Expected Output is: 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L.
>>>> But I am getting randomly different outputs:
>>>> 1. 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L
>>>> 2. 5L, 6L, 7L, 8L, 9L, 1L, 2L, 3L, 4L
>>>> 3. 7L, 8L, 9L, 5L, 6L, 1L, 2L, 3L, 4L
>>>>
>>>> As per my understanding, it is because of containsInAnyOrder function.
>>>> Is there anything Like:
>>>>
>>>>    PAssert.that(stream)
>>>>         .containsAnyOfThem(
>>>>             Row.withSchema(schema).addArray(1L, 2L, 3L, 4L, 5L, 6L, 7L, 
>>>> 8L, 9L).build(),
>>>>                 Row.withSchema(schema).addArray(5L, 6L, 7L, 8L, 9L, 1L, 
>>>> 2L, 3L, 4L).build(),
>>>>                 Row.withSchema(schema).addArray(7L, 8L, 9L, 5L, 6L, 1L, 
>>>> 2L, 3L, 4L).build());
>>>>
>>>> I would really appreciate if anyone can help me in knowing how to
>>>> handle such scenario in Beam.
>>>>
>>>> Thanks!
>>>> --
>>>> Regards,
>>>> *Sonam*
>>>> Software Engineer
>>>> Mobile: +92 3088337296 <+92%20308%208337296>
>>>>
>>>> <http://venturedive.com/>
>>>>
>>>
>
> --
>
> Regards,
> *Sonam*
> Software Engineer
> Mobile: +92 3088337296 <+92%20308%208337296>
>
> <http://venturedive.com/>
>

Reply via email to