[ 
https://issues.apache.org/jira/browse/FLINK-5929?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15897444#comment-15897444
 ] 

ASF GitHub Bot commented on FLINK-5929:
---------------------------------------

Github user aljoscha commented on the issue:

    https://github.com/apache/flink/pull/3479
  
    One quick initial remark: instead of each time having an anonymous inner 
class for the `Context` you can create a reusable class for that like this:
    ```
    class InternalProcessWindowContext<IN, OUT, KEY, W extends Window>
            extends ProcessWindowFunction<IN, OUT, KEY, W>.Context {
    
        W window;
        InternalWindowFunction.InternalWindowContext internalContext;
    
        InternalProcessWindowContext(ProcessWindowFunction<IN, OUT, KEY, W> 
function) {
            function.super();
        }
    
        @Override
        public W window() {
            return window;
        }
    
        @Override
        public KeyedStateStore windowState() {
            return internalContext.windowState();
        }
    
        @Override
        public KeyedStateStore globalState() {
            return internalContext.globalState();
        }
    }
    ```
    
    The `function.super()` call in there makes it work even though `Context` is 
itself defined as an inner abstract class of `ProcessWindowFunction`. It's a 
bit of black magic and not really too well known, I think. 😉


> Allow Access to Per-Window State in ProcessWindowFunction
> ---------------------------------------------------------
>
>                 Key: FLINK-5929
>                 URL: https://issues.apache.org/jira/browse/FLINK-5929
>             Project: Flink
>          Issue Type: Improvement
>          Components: DataStream API
>            Reporter: Aljoscha Krettek
>
> Right now, the state that a {{WindowFunction}} or {{ProcessWindowFunction}} 
> can access is scoped to the key of the window but not the window itself. That 
> is, state is global across all windows for a given key.
> For some use cases it is beneficial to keep state scoped to a window. For 
> example, if you expect to have several {{Trigger}} firings (due to early and 
> late firings) a user can keep state per window to keep some information 
> between those firings.
> The per-window state has to be cleaned up in some way. For this I see two 
> options:
>  - Keep track of all state that a user uses and clean up when we reach the 
> window GC horizon.
>  - Add a method {{cleanup()}} to {{ProcessWindowFunction}} which is called 
> when we reach the window GC horizon that users can/should use to clean up 
> their state.
> On the API side, we can add a method {{windowState()}} on 
> {{ProcessWindowFunction.Context}} that retrieves the per-window state and 
> {{globalState()}} that would allow access to the (already available) global 
> state. The {{Context}} would then look like this:
> {code}
> /**
>  * The context holding window metadata
>  */
> public abstract class Context {
>     /**
>      * @return The window that is being evaluated.
>      */
>     public abstract W window();
>     /**
>      * State accessor for per-key and per-window state.
>      */
>     KeyedStateStore windowState();
>     /**
>      * State accessor for per-key global state.
>      */
>     KeyedStateStore globalState();
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to