[ 
https://issues.apache.org/jira/browse/CALCITE-5764?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Julian Hyde resolved CALCITE-5764.
----------------------------------
    Resolution: Fixed

Fixed in 
[267326d1|https://github.com/apache/calcite/commit/267326d15e347df18af816127b5e5cef6a8bf3d4].

> Puffin, an Awk for Java
> -----------------------
>
>                 Key: CALCITE-5764
>                 URL: https://issues.apache.org/jira/browse/CALCITE-5764
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: Julian Hyde
>            Assignee: Julian Hyde
>            Priority: Major
>             Fix For: 1.35.0
>
>
> Create Puffin, which allows a programming model similar to the {{awk}} 
> scripting language.
> An {{awk}} program is a collection of rules, each of which is a pair: a 
> predicate and an action. For each line in a file, the rules are applied in 
> sequence, and if the predicate evaluates to true, the action is executed. 
> Then {{awk}} goes on to the next file.
> Here is a simple {{awk}} script that counts the number of non-comment lines 
> in a file:
> {code}
> /^#/ {
>   ++n;
> }
> END {
>   printf("counter: %d\n", n);
> }
> {code}
> Here is the equivalent Puffin program:
> {code}
>     Puffin.Program<Unit> program =
>         Puffin.builder(() -> Unit.INSTANCE, u -> new AtomicInteger())
>             .add(line -> !line.startsWith("#"),
>                 line -> line.state().incrementAndGet())
>             .after(context ->
>                 context.println("counter: " + context.state().get()))
>             .build();
> {code}
> In {{Puffin}}, each predicate is a {{Predicate<Line>>}}, and each action is a 
> {{Consumer<Line>}}. {{Line}} is a data structure that gives access to the 
> text of the line, regular expression matching, and file-local and global 
> state.
> {{Puffin}} allows thread-safe parallel processing of multiple files (or more 
> generally sources, including URLs). File-local state is allocated by a 
> factory, and each file is processed in a single thread. Therefore rules do 
> not need to coordinate with rules processing other files.
> Global state is also allocated by a factory, but it is shared, and rules must 
> coordinate when they access it. In the above example, {{u -> new 
> AtomicInteger()}} is the factory that creates global state.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to