[ 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)