精华内容
下载资源
问答
  • codegen-源码

    2021-03-21 01:34:38
    codegen
  • GraphQL Codegen GraphQL Java Codegen makes it easy to make your Java application to follow a schema-first approach whether it is a server or client application. Following classes can be ...
  • CodeGen概述

    2020-12-15 06:08:01
    CodeGen概述 CodeGen是在协同开发环境中工作的软件开发人员可以用来生成源代码的工具。该代码可能是Synergy DBL代码,也可能是其他语言的源代码。CodeGen并不局限于为任何特定的开发环境或编程语言生成代码。 当然,...

    CodeGen概述
    CodeGen是在协同开发环境中工作的软件开发人员可以用来生成源代码的工具。该代码可能是Synergy DBL代码,也可能是其他语言的源代码。CodeGen并不局限于为任何特定的开发环境或编程语言生成代码。
    当然,你不能仅仅使用CodeGen生成任何你能想象得到的源代码。在生成代码之前,开发人员必须声明定义如何创建给定源代码的规则。这些规则在模板文件中定义。CodeGen解释开发人员在模板文件中定义的代码和指令,以便生成有用的输出。
    不过,在模板文件中定义规则只是故事的一部分。为了真正有用,CodeGen还需要另一个信息源来定义要生成的内容的上下文。
    大多数软件应用程序都围绕着数据的收集、表示、操作和存储。这些数据最终存储在某种类型的持久存储中,例如数据文件集合或关系数据库中的表中。当开发人员处理一段特定的源代码时,他们将他们所掌握的关于应用程序数据(元数据)的知识与规则或“业务逻辑”相结合,以便创建满足特定需求的源代码。CodeGen也这么做。
    当开发人员在Synergy/DE中工作时,他们可以访问称为Synergy/DE存储库的优秀元数据源。存储库包含有关应用程序使用的数据结构以及这些数据结构的属性的大量信息。存储库还可以包含有关各种数据结构之间的关系的信息,甚至包含有关底层数据存储机制的信息。Synergy存储库是非常丰富的元数据源,也是CodeGen使用的元数据的主要来源。
    对于使用Synergy/deuSynergy/DE UI Toolkiti工具箱来展示其应用程序用户界面的开发人员来说,可能还有另一个元数据源,称为窗口脚本文件。在某些情况下,CodeGen还可以使用这些文件中包含的元数据。
    都是关于元数据的!gen在一个文件中结合了一些定义好的文本结构的信息。
    基本原则
    每次开发人员使用CodeGen生成代码时,他们通常提供两个主要信息:

    1. 元数据的来源,通常是存储库结构的名称。
    2. 定义要创建的内容的规则的模板文件的名称。
      每次CodeGen生成一个输出文件时,它通常做三件事:
    3. 从元数据源(通常是存储库结构)读取信息。
    4. 从模板读取规则。
    5. 将规则与元数据合并以创建输出文件。
    展开全文
  • Codegen CLI Vert.x Codegen处理的运行器工具。 建造 使用Maven进行构建:生成一个胖子jar target/vertx-codegen-cli-3.2.0-SNAPSHOT.jar 或者你可以在得到胖子 用法 Usage: <main> [options] The list of maven ...
  • codegen.java

    2017-11-27 22:24:00
    codegen,代码生成工具,基于mybatis的code-gen修改。
  • codegen.py

    2020-02-27 11:21:58
    修改后 sqlacodegen 的codegen.py,可直接下载后替换到自己安装目录的\Python\Python37\Lib\site-packages\sqlacodegen\codegen.py 用以解决UnicodeEncodeError: 'gbk' codec can't encode character '\u02b1' in...
  • codegen库(libcodegen)旨在链接到代码中,该代码库将PCM数据缓冲区传递给该代码,并输出代码字符串。 codegen二进制文件独立运行,接受文件名作为输入,并在多线程工作程序模式下运行。 要求 对于libcodegen ...
  • graphql-java-codegen-gradle-plugin:graphql-java-codegen的Gradle插件
  • graphql-java-codegen-maven-plugin:graphql-java-codegen的Maven插件
  • ptrlVi_codegen-源码

    2021-05-09 05:17:26
    ptrlVi_codegen
  • stm32codegen-源码

    2021-02-13 06:28:36
    stm32codegen
  • echoprint-codegen 的 Docker 镜像 在 Docker 中运行 构建: $ docker build -t luis/echoprint-codegen . 跑步: $ docker run -v $(pwd)/audio:/audio luis/echoprint-codegen echoprint-codegen 是在 MIT ...
  • GraphQL Codegen:原因客户端 GraphQL Codegen的插件,可基于您的GraphQL模式生成用于客户端应用程序的ReasonML类型。 快速开始 使用npm / yarn安装: $ yarn add graphql-codegen-reason-client -D 根据GraphQL ...
  • Codegen是DartNative的一部分。 下图是青色部分(DartNative Codegen): 它仍在开发中。 运作方式如下: 安装 $ npm install -g @dartnative/codegen 要求 " node " : " >=14 " 用法 Usage: codegen [options] &...
  • leaf-codegen-源码

    2021-07-16 23:29:43
    Leaf-codegen 是一个基于项目的代码生成器。 该项目向 swagger-codegen 添加了 Leaf.io 代码生成语言和模板。 在上查看更多 用法 ` java -jar modules/swagger-codegen-cli/target/leaf-codegen-{version}.jar ...
  • 昂首阔步JS&Typescript Codegen 我们正在寻找新的维护者 该项目不再由其创建者积极维护。 如果您想成为维护者,请告诉我们。 在我们编写此程序包时,大摇大摆的还没有JavaScript或TypeScript的生成器。 现在,有。 ...
  • ⚠ If the OpenAPI/Swagger spec is obtained from an untrusted source, please make sure you've reviewed the spec before using Swagger Codegen to generate the API client, server stub or documentation as ...
  • codegen.macro-源码

    2021-05-25 20:30:22
    import codegen from 'codegen.macro' codegen `module.exports = ['a', 'b', 'c'].map(l => 'export const ' + l + ' = ' + JSON.stringify(l)).join(';')` ↓ ↓ ↓ ↓ ↓ ↓ export const a = "a" ; export ...
  • Codegen入门项目 提供一个使用Maven运行Vert.x Codegen的原始项目。 该项目从API生成Markdown文件,没有什么花哨或复杂的事情。 克隆该项目可以轻松地从代码生成开始。 一代 要从Vert.x Core生成代码,请执行以下...
  • 简单的代码生成扩展 Codegen扩展名。 结合curl扩展和markdown扩展,添加多部分支持
  • CodeGen API分析

    2020-12-15 06:36:50
    CodeGen API分析 作为使用命令行界面的替代方法,开发人员可以使用核心CodeGen环境编写自定义工具或实用程序来生成代码,从而将CodeGen更紧密地集成到开发环境中。 为了实现这一点,CodeGen提供了一个.NET API,开发...

    CodeGen API分析
    作为使用命令行界面的替代方法,开发人员可以使用核心CodeGen环境编写自定义工具或实用程序来生成代码,从而将CodeGen更紧密地集成到开发环境中。
    为了实现这一点,CodeGen提供了一个.NET API,开发人员可以直接对其进行编码以生成代码。CodeGen API中的主要类有:
    •CodeGen.Engine.CodeGenTaskSet
    •CodeGen.Engine.CodeGenTask
    •CodeGen.Engine.CodeGenerator
    CodeGen API Example
    这是使用codegen API的一个非常简单的示例。此代码段基本上与使用命令行相
    同:
    codegen -s CUSTOMER -t DataClass -r –v
    下面是示例代码:
    ;;Create a new task set
    data taskset = new CodeGenTaskSet()
    taskset.LoggingLevel = LoggingLevel.Verbose
    ;;Create a task and define what it shold do
    data task = new CodeGenTask()
    task.Structures.Add(“CUSTOMER”)
    task.Templates.Add(“DataClass”)
    task.ReplaceFiles = true

    ;;Add the task to the task set
    taskset.Tasks.Add(task)
    ;;Create a code generator and tell it about the task set
    data generator = new CodeGenerator(taskset)
    ;;Generate the code
    generator.GenerateCode()
    ;;Did it work?
    if (taskset.Complete) then
    ;;Good to go
    else
    ;;Something failed!
    当执行此代码时,不会看到任何事情发生,因为codegen API没有实现任何
    UI。但是,如果想查看作为其处理的任务集生成的消息,可以针对其中一个注册
    一个事件处理程序方法taskset.Messages.CollectionChanged或者
    task.Messages.CollectionChanged并在消息生成时监视/报告这些消息。例如,如果
    在控制台应用程序中,可以将消息记录到标准输出,如下所示:
    lambda messageFromTaskSet(sender, e)
    begin
    if (e.Action==NotifyCollectionChangedAction.Add)
    begin
    data message, String
    foreach message in e.NewItems
    if (message!=^null)
    Console.WriteLine(message)
    end
    end
    ;;Listen for messages from the taskset as it processes
    taskset.Messages.CollectionChanged += messageFromTaskSet

    展开全文
  • Swagger Codegen使用

    2019-12-29 12:40:11
    一、Swagger Codegen简介 Swagger Codegen是一个开源的代码生成器,根据Swagger定义的RESTful API可以自动建立服务端和客户端的连接。官方简介看这里:Swagger Codegen 二、Swagger简单使用 新建一个SpringBoot项目 ...

    一、Swagger Codegen简介

    Swagger Codegen是一个开源的代码生成器,根据Swagger定义的RESTful API可以自动建立服务端和客户端的连接。官方简介看这里:Swagger Codegen

    二、Swagger简单使用

    新建一个SpringBoot项目

    引入依赖

            <dependency>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-annotations</artifactId>
                <version>${swagger.version}</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>${springfox.version}</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>${springfox.version}</version>
           </dependency>
    

    使用Swagger注解:

    @Api(tags = {"user. 用户管理"})
    public class OneController {
    
        @GetMapping(value = "/{id}")
        @ApiOperation("根据id查用户")
        @ResponseStatus(code = HttpStatus.OK)
        @ApiImplicitParam(paramType = "path", dataType = "string", name = "id", value = "用户id", required = true)
        public UserDto getUser(@PathVariable String id) {
            UserDto userDto = UserDto.builder()
                    .age(10)
                    .gender("F")
                    .build();
            userDto.setId(id).setName("无名");
            return userDto;
        }
    }
    
    @ApiModel(value = "用户Dto")
    public class UserDto extends IdName {
        @ApiModelProperty("性别")
        private String gender;
    
        @ApiModelProperty("年龄")
        private int age;
    }
    

    启用项目之后,访问Swagger地址,看看效果:
    swagger ui

    三、使用Swagger Codegen根据服务生成客户端代码

    这里有两种方式,一种是使用swagger-codegen-cli的jar包,在命令行里面生成,如下:

    java -jar swagger-codegen-cli-2.3.0.jar generate 
    	-i http://localhost:8080/v2/api-docs   (swagger文档地址)
    	-l java  
    	--library resttemplate 
    	-o magellan-configuration-center-client 
    	--api-package XXX.client.api
    	--invoker-package XXX.client.invoker 
    	--model-package XXX.client.model
    	--group-id cn.XXX 
    	--artifact-id  XXX-api
    	--artifact-version 1.0.0-SNAPSHOT
    

    还有一种就是使用maven插件,引入如下插件:

    <plugin>
        <groupId>io.swagger</groupId>
        <artifactId>swagger-codegen-maven-plugin</artifactId>
        <version>2.4.9</version>
        <configuration>
            <!--FIXME:如何避免打包后转化为https-->
            <inputSpec>http://localhost:8080/v2/api-docs</inputSpec>
            <language>java</language>
            <library>resttemplate</library>
            <groupId>com.example</groupId>
            <artifactId>service-one-swagger-api-client</artifactId>
            <modelPackage>${groupId}.service-one.client.model</modelPackage>
            <apiPackage>${groupId}.service-one.client.api</apiPackage>
            <invokerPackage>${groupId}.service-one.client.invoker</invokerPackage>
            <output>${project.basedir/api-client}</output>
        </configuration>
        <executions>
            <execution>
                <id>generate-swagger-javaclient</id>
                <phase>generate-sources</phase>
                <goals>
                    <goal>generate</goal>
                </goals>
            </execution>
        </executions>
    </plugin>			
    

    然后,点击插件:
    codegen plugin
    可以生成客户端代码,我们这里指定了在api-client目录下,可以看到已经生成了如下代码结构:
    在这里插入图片描述
    编译之后将其install到本地。

    四、client的使用

    重建一个项目,引入上面Swagger Codegen生成的jar包:

       		<dependency>
                <groupId>com.example</groupId>
                <artifactId>service-one-swagger-api-client</artifactId>
                <version>1.0.0</version>
            </dependency>
    

    然后调用ServiceOne中Controller提供的getUser方法:

        @Autowired
        User_Api userApi;
    
        @Override
        public String getName() {
            Dto dto = userApi.getUserUsingGET("userIdFromProduct");
            log.info(dto.toString());
            return dto.getName();
        }
    

    此处的User_Api是Swagger自动生成的类名,根据@Api(tags = {“user. 用户管理”})
    中的tag生成的,应该是可以修改的,还需继续研究。

    在Test中调用此方法,可以看到可以正常输出方法。这也可以作为一种服务间调用的方式。

    展开全文
  • Spark Codegen原理分析

    2020-04-22 19:13:01
    Spark Codegen是在CBO&RBO后,将算子的底层逻辑用代码来实现的一种优化。 具体包括Expression级别和WholeStage级别的Codegen。 2、举例说明 ① Expression级别:摘一个网上的例子:x + (1 + 2) 用scala代码表示...

    1、背景

    Spark Codegen是在CBO&RBO后,将算子的底层逻辑用代码来实现的一种优化。
    具体包括Expression级别和WholeStage级别的Codegen。

    2、举例说明

    ① Expression级别:摘一个网上的例子:x + (1 + 2)

    用scala代码表示:

    Add(Attribute(x), Add(Literal(1), Literal(2)))
    

    语法树如下:
    在这里插入图片描述
    递归求值这棵语法树的常规代码如下:

    tree.transformUp {
      case Attribute(idx) => Literal(row.getValue(idx))
      case Add(Literal(c1),Literal(c2)) => Literal(c1+c2)
      case Literal(c) => Literal(c)
    }
    

    执行上述代码需要做很多类型匹配、虚函数调用、对象创建等额外逻辑,这些overhead远超对表达式求值本身。
    为了消除这些overhead,Spark Codegen直接拼成求值表达式的java代码并进行即时编译。具体分为三个步骤:

    1. 代码生成。根据语法树生成java代码,封装在wrapper类中:
    ... // class wrapper
    row.getValue(idx) + (1 + 2)
    ... // class wrapper
    
    1. 即时编译。使用Janino框架把生成代码编译成class文件。
    2. 加载执行。最后加载并执行。

    优化前后性能有数量级的提升。
    在这里插入图片描述

    ② WholeStage级别 举一个稍微复杂的例子,并详细分析一下

    看了上面的例子,应该先有了一个大致的印象,接下来看下:
    SQL:

    select * from test.zyz where id=1;
    

    表结构:

    CREATE TABLE `test.zyz`(
      `id` int,
      `name` string)
    PARTITIONED BY (
      `pt` int)
    ROW FORMAT SERDE
      'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
    STORED AS INPUTFORMAT
      'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
    OUTPUTFORMAT
      'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
    

    执行计划:

    Found 1 WholeStageCodegen subtrees.
    == Subtree 1 / 1 ==
    *(1) Project [id#11, name#12, pt#13]
    +- *(1) Filter (isnotnull(id#11) && (id#11 = 1))
       +- *(1) FileScan parquet test.zyz[id#11,name#12,pt#13] Batched: true, Format: Parquet, Location: CatalogFileIndex[hdfs://nameservice1/user/hive/warehouse/test.db/zyz], PartitionCount: 1, PartitionFilters: [], PushedFilters: [IsNotNull(id), EqualTo(id,1)], ReadSchema: struct<id:int,name:string>
    
    

    Codegen结果:

    public Object generate(Object[] references) {
            return new GeneratedIteratorForCodegenStage1(references);
        }
    
        // codegenStageId=1
        final class GeneratedIteratorForCodegenStage1 extends org.apache.spark.sql.execution.BufferedRowIterator {
            private Object[] references;
            private scala.collection.Iterator[] inputs;
            // SQLMetrics 记录执行耗时
            private long scan_scanTime_0;
            // batch index
            private int scan_batchIdx_0;
            // 一共3个字段
            private org.apache.spark.sql.execution.vectorized.OnHeapColumnVector[] scan_mutableStateArray_2 = new org.apache.spark.sql.execution.vectorized.OnHeapColumnVector[3];
            private org.apache.spark.sql.catalyst.expressions.codegen.UnsafeRowWriter[] scan_mutableStateArray_3 = new org.apache.spark.sql.catalyst.expressions.codegen.UnsafeRowWriter[3];
            // 一共1个分区
            private org.apache.spark.sql.vectorized.ColumnarBatch[] scan_mutableStateArray_1 = new org.apache.spark.sql.vectorized.ColumnarBatch[1];
            private scala.collection.Iterator[] scan_mutableStateArray_0 = new scala.collection.Iterator[1];
    
            public GeneratedIteratorForCodegenStage1(Object[] references) {
                this.references = references;
            }
    
            public void init(int index, scala.collection.Iterator[] inputs) {
                partitionIndex = index;
                this.inputs = inputs;
                scan_mutableStateArray_0[0] = inputs[0];
    
                // 初始化3个字段,大小32bytes
                scan_mutableStateArray_3[0] = new org.apache.spark.sql.catalyst.expressions.codegen.UnsafeRowWriter(3, 32);
                scan_mutableStateArray_3[1] = new org.apache.spark.sql.catalyst.expressions.codegen.UnsafeRowWriter(3, 32);
                scan_mutableStateArray_3[2] = new org.apache.spark.sql.catalyst.expressions.codegen.UnsafeRowWriter(3, 32);
    
            }
    
            private void scan_nextBatch_0() throws java.io.IOException {
                long getBatchStart = System.nanoTime();
                // 扫描下一批数据
                if (scan_mutableStateArray_0[0].hasNext()) {
                    scan_mutableStateArray_1[0] = (org.apache.spark.sql.vectorized.ColumnarBatch)scan_mutableStateArray_0[0].next();
                    ((org.apache.spark.sql.execution.metric.SQLMetric) references[0] /* numOutputRows */).add(scan_mutableStateArray_1[0].numRows());
                    scan_batchIdx_0 = 0;
                    scan_mutableStateArray_2[0] = (org.apache.spark.sql.execution.vectorized.OnHeapColumnVector) scan_mutableStateArray_1[0].column(0);
                    scan_mutableStateArray_2[1] = (org.apache.spark.sql.execution.vectorized.OnHeapColumnVector) scan_mutableStateArray_1[0].column(1);
                    scan_mutableStateArray_2[2] = (org.apache.spark.sql.execution.vectorized.OnHeapColumnVector) scan_mutableStateArray_1[0].column(2);
                }
                // 扫描一个batch计时
                scan_scanTime_0 += System.nanoTime() - getBatchStart;
            }
    
            protected void processNext() throws java.io.IOException {
                // 没有数据,继续扫描
                if (scan_mutableStateArray_1[0] == null) {
                    scan_nextBatch_0();
                }
                // 有数据就开始处理
                while (scan_mutableStateArray_1[0] != null) {
                    // 获取这批数据行数并计算出末位
                    int scan_numRows_0 = scan_mutableStateArray_1[0].numRows();
                    int scan_localEnd_0 = scan_numRows_0 - scan_batchIdx_0;
                    // 遍历每行数据
                    for (int scan_localIdx_0 = 0; scan_localIdx_0 < scan_localEnd_0; scan_localIdx_0++) {
                        int scan_rowIdx_0 = scan_batchIdx_0 + scan_localIdx_0;
                        do {
                            // 判断非空
                            boolean scan_isNull_0 = scan_mutableStateArray_2[0].isNullAt(scan_rowIdx_0);
                            int scan_value_0 = scan_isNull_0 ? -1 : (scan_mutableStateArray_2[0].getInt(scan_rowIdx_0));
    
                            if (!(!scan_isNull_0)) continue;
    
                            boolean filter_value_2 = false;
                            filter_value_2 = scan_value_0 == 1;
                            if (!filter_value_2) continue;
    
                            ((org.apache.spark.sql.execution.metric.SQLMetric) references[2] /* numOutputRows */).add(1);
    
                            // 非空获取value
                            boolean scan_isNull_1 = scan_mutableStateArray_2[1].isNullAt(scan_rowIdx_0);
                            UTF8String scan_value_1 = scan_isNull_1 ? null : (scan_mutableStateArray_2[1].getUTF8String(scan_rowIdx_0));
                            boolean scan_isNull_2 = scan_mutableStateArray_2[2].isNullAt(scan_rowIdx_0);
                            int scan_value_2 = scan_isNull_2 ? -1 : (scan_mutableStateArray_2[2].getInt(scan_rowIdx_0));
                            scan_mutableStateArray_3[2].reset();
    
                            scan_mutableStateArray_3[2].zeroOutNullBytes();
    
                            if (false) {
                                scan_mutableStateArray_3[2].setNullAt(0);
                            } else {
                                scan_mutableStateArray_3[2].write(0, scan_value_0);
                            }
    
                            if (scan_isNull_1) {
                                scan_mutableStateArray_3[2].setNullAt(1);
                            } else {
                                scan_mutableStateArray_3[2].write(1, scan_value_1);
                            }
    
                            if (scan_isNull_2) {
                                scan_mutableStateArray_3[2].setNullAt(2);
                            } else {
                                scan_mutableStateArray_3[2].write(2, scan_value_2);
                            }
                            // 获取三个字段value,合并输出
                            append((scan_mutableStateArray_3[2].getRow()));
    
                        } while(false);
                        // shouldStop判断了next是否还有数据,没有就return
                        if (shouldStop()) { scan_batchIdx_0 = scan_rowIdx_0 + 1; return; }
                    }
                    scan_batchIdx_0 = scan_numRows_0;
                    scan_mutableStateArray_1[0] = null;
                    scan_nextBatch_0();
                }
                // Metric记录耗时
                ((org.apache.spark.sql.execution.metric.SQLMetric) references[1] /* scanTime */).add(scan_scanTime_0 / (1000 * 1000));
                scan_scanTime_0 = 0;
            }
        }
    

    3、Spark Codegen框架

    Spark Codegen框架有三个核心组成部分

    ① 核心接口/类

    1.CodegenSupport(接口)
    实现该接口的Operator可以将自己的逻辑拼成java代码。重要方法:

    produce() // 输出本节点产出Row的java代码
    consume() // 输出本节点消费上游节点输入的Row的java代码
    

    实现类包括但不限于: ProjectExec, FilterExec, HashAggregateExec, SortMergeJoinExec。
    2.WholeStageCodegenExec(类)
    CodegenSupport的实现类之一,Stage内部所有相邻的实现CodegenSupport接口的Operator的融合,产出的代码把所有被融合的Operator的执行逻辑封装到一个Wrapper类中,该Wrapper类作为Janino即时compile的入参。
    3.InputAdapter(类)
    CodegenSupport的实现类之一,胶水类,用来连接WholeStageCodegenExec节点和未实现CodegenSupport的上游节点。
    4.BufferedRowIterator(接口)
    WholeStageCodegenExec生成的java代码的父类,重要方法:

    public InternalRow next() // 返回下一条Row
    public void append(InternalRow row) // append一条Row
    
    ② CodegenContext

    管理生成代码的核心类。主要涵盖以下功能:

    1.命名管理。保证同一Scope内无变量名冲突。
    2.变量管理。维护类变量,判断变量类型(应该声明为独立变量还是压缩到类型数组中),维护变量初始化逻辑等。
    3.方法管理。维护类方法。
    4.内部类管理。维护内部类。
    5.相同表达式管理。维护相同子表达式,避免重复计算。
    6.size管理。避免方法、类size过大,避免类变量数过多,进行比较拆分。如把表达式块拆分成多个函数;把函数、变量定义拆分到多个内部类。
    7.依赖管理。维护该类依赖的外部对象,如Broadcast对象、工具对象、度量对象等。
    8.通用模板管理。提供通用代码模板,如genComp, nullSafeExec等。

    ③ Produce-Consume Pattern

    相邻Operator通过Produce-Consume模式生成代码。
    Produce生成整体处理的框架代码,例如aggregation生成的代码框架如下:

    if (!initialized) {
      # create a hash map, then build the aggregation hash map
      # call child.produce()
      initialized = true;
    }
    while (hashmap.hasNext()) {
      row = hashmap.next();
      # build the aggregation results
      # create variables for results
      # call consume(), which will call parent.doConsume()
       if (shouldStop()) return;
    }
    

    在这里插入图片描述

    4、参考:

    Spark Codegen浅析 https://mp.weixin.qq.com/s/77hSyE-Tcf9VKiWLeeMWKQ

    展开全文
  • hamr-codegen-源码

    2021-04-23 03:53:06
    Hamr Codegen amd64:mac,linux,windows
  • 代码生成codegen

    2020-12-25 07:08:14
    代码生成codegen 该模块提供了从SymPy表达式生成直接可编译代码的功能。该codegen功能是SymPy中代码生成功能的用户界面。下面为可能希望直接使用框架的高级用户提供了一些实现细节。 注意 该codegen调用是不是自动在...
  • codegen-assets-源码

    2021-05-02 09:15:50
    Codegen for Hasura会以您的语言/框架为动作处理程序生成有效的样板代码(当前,我们将来可能会做更多!)。 使用代码生成器 要使用Hasura Codegen,请访问Hasura文档。 可以通过CLI或控制台使用它。 构建一个代码...
  • OpenAPI代码生成 ...npx -p openapi-codegen cg ... 命令行界面 cg [options] {[path]configName} {openapi-definition} Options: --help Show help [boolean] --version Show version number [boolean] --
  • shex-codegen-源码

    2021-03-29 01:47:36
    通过首选的节点软件包管理器安装软件包: npm i --save-dev shex-codegen或yarn add -D shex-codegen 将一个配置文件添加到您的项目根目录(称为shex-codegen.yml ,其结构大致如下: # path to the folder or ...
  • Swagger Codegen Generators project is a set of classes and templates (Handlebars) used by Swagger Codegen 3.0.0 project in its code generation process for a specific language or language framework....
  • Swagger大使大使Codegen模块 该项目提供了模板,用于根据OAS / Swagger定义生成。 用法 克隆此仓库并使用 mvn clean install 并与 java -cp <path>:target/ambassador-swagger-codegen-1.0.0.jar \ io.swagger....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,600
精华内容 7,040
关键字:

codegen