@Override public Collection<Void> handleMessage(M message, MessageCollector collector, TaskCoordinator coordinator) { K key = keyFunction.apply(message); V value = valueFunction.apply(message); Long partitionKey = key == null ? 0L : null; collector.send(new OutgoingMessageEnvelope(systemStream, partitionKey, key, value)); return Collections.emptyList(); }
@Override public Collection<Void> handleMessage(M message, MessageCollector collector, TaskCoordinator coordinator) { K key = keyFunction.apply(message); V value = valueFunction.apply(message); Long partitionKey = key == null ? 0L : null; collector.send(new OutgoingMessageEnvelope(systemStream, partitionKey, key, value)); return Collections.emptyList(); }
@Override public Collection<Void> handleMessage(M message, MessageCollector collector, TaskCoordinator coordinator) { K key = keyFunction.apply(message); V value = valueFunction.apply(message); Long partitionKey = key == null ? 0L : null; collector.send(new OutgoingMessageEnvelope(systemStream, partitionKey, key, value)); return Collections.emptyList(); }
@Override public Collection<Void> handleMessage(M message, MessageCollector collector, TaskCoordinator coordinator) { K key = keyFunction.apply(message); V value = valueFunction.apply(message); Long partitionKey = key == null ? 0L : null; collector.send(new OutgoingMessageEnvelope(systemStream, partitionKey, key, value)); return Collections.emptyList(); }
@Override public Collection<Void> handleMessage(M message, MessageCollector collector, TaskCoordinator coordinator) { K key = keyFunction.apply(message); V value = valueFunction.apply(message); Long partitionKey = key == null ? 0L : null; collector.send(new OutgoingMessageEnvelope(systemStream, partitionKey, key, value)); return Collections.emptyList(); }
List<WindowPane<K, Object>> results = new ArrayList<>(); K key = (keyFn != null) ? keyFn.apply(message) : null; long timestamp = getWindowTimestamp(message);
return timestamp; } else { K key = keyFn.apply(message);
List<WindowPane<K, Object>> results = new ArrayList<>(); K key = (keyFn != null) ? keyFn.apply(message) : null; long timestamp = getWindowTimestamp(message);
List<WindowPane<K, Object>> results = new ArrayList<>(); K key = (keyFn != null) ? keyFn.apply(message) : null; long timestamp = getWindowTimestamp(message);
List<WindowPane<K, Object>> results = new ArrayList<>(); K key = (keyFn != null) ? keyFn.apply(message) : null; long timestamp = getWindowTimestamp(message);
List<WindowPane<K, Object>> results = new ArrayList<>(); K key = (keyFn != null) ? keyFn.apply(message) : null; long timestamp = getWindowTimestamp(message);
return timestamp; } else { K key = keyFn.apply(message);
return timestamp; } else { K key = keyFn.apply(message);
return timestamp; } else { K key = keyFn.apply(message);
return timestamp; } else { K key = keyFn.apply(message);
@Test public void testMap() { StreamApplicationDescriptorImpl mockGraph = mock(StreamApplicationDescriptorImpl.class); OperatorSpec mockOpSpec = mock(OperatorSpec.class); MessageStreamImpl<TestMessageEnvelope> inputStream = new MessageStreamImpl<>(mockGraph, mockOpSpec); MapFunction<TestMessageEnvelope, TestOutputMessageEnvelope> mockMapFn = mock(MapFunction.class); inputStream.map(mockMapFn); ArgumentCaptor<OperatorSpec> registeredOpCaptor = ArgumentCaptor.forClass(OperatorSpec.class); verify(mockOpSpec).registerNextOperatorSpec(registeredOpCaptor.capture()); OperatorSpec<?, TestMessageEnvelope> registeredOpSpec = registeredOpCaptor.getValue(); assertTrue(registeredOpSpec instanceof StreamOperatorSpec); FlatMapFunction transformFn = ((StreamOperatorSpec) registeredOpSpec).getTransformFn(); assertNotNull(transformFn); assertEquals(OpCode.MAP, registeredOpSpec.getOpCode()); TestOutputMessageEnvelope mockOutput = mock(TestOutputMessageEnvelope.class); when(mockMapFn.apply(anyObject())).thenReturn(mockOutput); assertTrue(transformFn.apply(new Object()).contains(mockOutput)); when(mockMapFn.apply(anyObject())).thenReturn(null); assertTrue(transformFn.apply(null).isEmpty()); }
@Test public void testStreamOperatorSpecWithMapAndListInClosure() { List<Integer> integers = new ArrayList<>(1); integers.add(0, 100); List<String> keys = new ArrayList<>(1); keys.add(0, "test-1"); MapFunction<TestMessageEnvelope, TestOutputMessageEnvelope> mapFn = m -> new TestOutputMessageEnvelope(keys.get(m.getKey().hashCode() % 1), integers.get(m.getMessage().hashCode() % 1)); StreamOperatorSpec<TestMessageEnvelope, TestOutputMessageEnvelope> streamOperatorSpec = OperatorSpecs.createMapOperatorSpec(mapFn, "op0"); StreamOperatorSpec<TestMessageEnvelope, TestOutputMessageEnvelope> cloneOperatorSpec = (StreamOperatorSpec<TestMessageEnvelope, TestOutputMessageEnvelope>) OperatorSpecTestUtils.copyOpSpec(streamOperatorSpec); assertNotEquals(streamOperatorSpec, cloneOperatorSpec); assertTrue(streamOperatorSpec.isClone(cloneOperatorSpec)); MapFunction userFn = (MapFunction) Whitebox.getInternalState(streamOperatorSpec, "mapFn"); assertEquals(userFn, mapFn); assertNotEquals(streamOperatorSpec.getTransformFn(), cloneOperatorSpec.getTransformFn()); MapFunction clonedUserFn = (MapFunction) Whitebox.getInternalState(cloneOperatorSpec, "mapFn"); assertTrue(cloneOperatorSpec.getTransformFn() instanceof FlatMapFunction); assertTrue(clonedUserFn instanceof MapFunction); assertNotEquals(userFn, clonedUserFn); // verify changing the values in the original keys and integers list will change the result of the original map function TestMessageEnvelope mockImsg = new TestMessageEnvelope("input-key-x", new String("value-x")); assertEquals(((MapFunction) userFn).apply(mockImsg), new TestOutputMessageEnvelope("test-1", 100)); integers.set(0, 200); keys.set(0, "test-2"); assertEquals(((MapFunction) userFn).apply(mockImsg), new TestOutputMessageEnvelope("test-2", 200)); // verify that the cloned map function uses a different copy of lists and still yields the same result assertEquals(((MapFunction) clonedUserFn).apply(mockImsg), new TestOutputMessageEnvelope("test-1", 100)); }
}).when(mockExpr).execute(eq(executionContext), eq(dataContext), eq(mockInputMsg.getSamzaSqlRelRecord().getFieldValues().toArray()), eq(result)); SamzaSqlRelMessage retMsg = (SamzaSqlRelMessage) mapFn.apply(mockInputMsg); assertEquals(retMsg.getSamzaSqlRelRecord().getFieldNames(), new ArrayList<String>() {{
mapFn.apply(message); }).when(mockExpr).execute(eq(executionContext), eq(dataContext), eq(mockInputMsg.getSamzaSqlRelRecord().getFieldValues().toArray()), eq(result)); SamzaSqlRelMessage retMsg = (SamzaSqlRelMessage) mapFn.apply(mockInputMsg); assertEquals(retMsg.getSamzaSqlRelRecord().getFieldNames(), new ArrayList<String>() {{
@Test public void testCopy() { WindowInternal<Object, Object, Collection> window = new WindowInternal<Object, Object, Collection>( defaultTrigger, supplierFunction, foldFn, keyFn, timeFn, WindowType.SESSION, null, mock(Serde.class), mock(Serde.class)); window.setEarlyTrigger(earlyTrigger); WindowOperatorSpec<Object, Object, Collection> spec = new WindowOperatorSpec<>(window, "w0"); WindowOperatorSpec<Object, Object, Collection> copy = (WindowOperatorSpec<Object, Object, Collection>) OperatorSpecTestUtils.copyOpSpec(spec); Assert.assertNotEquals(spec, copy); Assert.assertTrue(spec.isClone(copy)); Assert.assertNotEquals(spec.getWindow(), copy.getWindow()); Assert.assertNotEquals(copy.getWindow().getInitializer(), supplierFunction); assertEquals(copy.getWindow().getInitializer().get(), supplierFunction.get()); Assert.assertNotEquals(copy.getWindow().getFoldLeftFunction(), foldFn); Object mockMsg = new Object(); assertEquals(copy.getWindow().getFoldLeftFunction().apply(mockMsg, new ArrayList<>()), foldFn.apply(mockMsg, new ArrayList<>())); Assert.assertNotEquals(copy.getWindow().getKeyExtractor(), keyFn); assertEquals(copy.getWindow().getKeyExtractor().apply(mockMsg), keyFn.apply(mockMsg)); Assert.assertNotEquals(copy.getWindow().getEventTimeExtractor(), timeFn); assertEquals(copy.getWindow().getEventTimeExtractor().apply(mockMsg), timeFn.apply(mockMsg)); assertEquals(copy.getDefaultTriggerMs(), 150); }