This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 36e26cd8471 camel-parquet-avro: Add the capability to lazy load 
records during unmarshal (#12385)
36e26cd8471 is described below

commit 36e26cd84712ed971b6443aeeb7943365da2ccdd
Author: Derek Marsh <dmars...@users.noreply.github.com>
AuthorDate: Sun Dec 10 11:43:24 2023 -0600

    camel-parquet-avro: Add the capability to lazy load records during 
unmarshal (#12385)
    
    * lazy load parquet records to avoid memory issues on large files.
    
    * include generated files from addition of lazy load property to 
parquet-avro.
---
 .../camel/catalog/dataformats/parquetAvro.json     |   3 +-
 .../apache/camel/catalog/models/parquetAvro.json   |   3 +-
 .../apache/camel/catalog/schemas/camel-spring.xsd  |   9 ++
 .../avro/ParquetAvroDataFormatConfigurer.java      |   2 +
 .../camel/dataformat/parquet/avro/parquetAvro.json |   3 +-
 .../parquet/avro/ParquetAvroDataFormat.java        |  45 +++++++--
 .../dataformat/parquet/avro/ParquetIterator.java   |  68 ++++++++++++++
 .../parquet/avro/ParquetUnmarshalOnCompletion.java |  41 ++++++++
 ...ParquetAvroDataFormatUnmarshalLazyLoadTest.java | 103 +++++++++++++++++++++
 .../apache/camel/model/dataformat/parquetAvro.json |   3 +-
 .../model/dataformat/ParquetAvroDataFormat.java    |  38 ++++++++
 .../java/org/apache/camel/xml/in/ModelParser.java  |   1 +
 .../java/org/apache/camel/xml/out/ModelWriter.java |   1 +
 .../org/apache/camel/yaml/out/ModelWriter.java     |   1 +
 .../dsl/yaml/deserializers/ModelDeserializers.java |   6 ++
 .../generated/resources/schema/camelYamlDsl.json   |   5 +
 16 files changed, 319 insertions(+), 13 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/parquetAvro.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/parquetAvro.json
index 12561237247..f4cafc7e5be 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/parquetAvro.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/parquetAvro.json
@@ -18,6 +18,7 @@
   "properties": {
     "id": { "index": 0, "kind": "attribute", "displayName": "Id", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "The id of this node" },
     "compressionCodecName": { "index": 1, "kind": "attribute", "displayName": 
"Compression Codec Name", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": "GZIP", "description": "Compression codec to use when 
marshalling." },
-    "unmarshalType": { "index": 2, "kind": "attribute", "displayName": 
"Unmarshal Type", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Class to use when (un)marshalling. If omitted, parquet files 
are converted into Avro's GenericRecords for unmarshalling and input objects 
are assumed as GenericRecords for marshalling." }
+    "unmarshalType": { "index": 2, "kind": "attribute", "displayName": 
"Unmarshal Type", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Class to use when (un)marshalling. If omitted, parquet files 
are converted into Avro's GenericRecords for unmarshalling and input objects 
are assumed as GenericRecords for marshalling." },
+    "lazyLoad": { "index": 3, "kind": "attribute", "displayName": "Lazy Load", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "Whether the unmarshalling should produce an iterator of 
records or read all the records at once." }
   }
 }
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/parquetAvro.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/parquetAvro.json
index c4451799bde..048b6aa31e3 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/parquetAvro.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/parquetAvro.json
@@ -15,6 +15,7 @@
   "properties": {
     "id": { "index": 0, "kind": "attribute", "displayName": "Id", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "The id of this node" },
     "compressionCodecName": { "index": 1, "kind": "attribute", "displayName": 
"Compression Codec Name", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": "GZIP", "description": "Compression codec to use when 
marshalling." },
-    "unmarshalType": { "index": 2, "kind": "attribute", "displayName": 
"Unmarshal Type", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Class to use when (un)marshalling. If omitted, parquet files 
are converted into Avro's GenericRecords for unmarshalling and input objects 
are assumed as GenericRecords for marshalling." }
+    "unmarshalType": { "index": 2, "kind": "attribute", "displayName": 
"Unmarshal Type", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Class to use when (un)marshalling. If omitted, parquet files 
are converted into Avro's GenericRecords for unmarshalling and input objects 
are assumed as GenericRecords for marshalling." },
+    "lazyLoad": { "index": 3, "kind": "attribute", "displayName": "Lazy Load", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "Whether the unmarshalling should produce an iterator of 
records or read all the records at once." }
   }
 }
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
index f2f7982ac96..f754e021af4 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
@@ -8856,6 +8856,15 @@ Compression codec to use when marshalling. Default 
value: GZIP
 <![CDATA[
 Class to use when (un)marshalling. If omitted, parquet files are converted 
into Avro's GenericRecords for unmarshalling
 and input objects are assumed as GenericRecords for marshalling.
+]]>
+            </xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="lazyLoad" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en">
+<![CDATA[
+Whether the unmarshalling should produce an iterator of records or read all 
the records at once. Default value: false
 ]]>
             </xs:documentation>
           </xs:annotation>
diff --git 
a/components/camel-parquet-avro/src/generated/java/org/apache/camel/dataformat/parquet/avro/ParquetAvroDataFormatConfigurer.java
 
b/components/camel-parquet-avro/src/generated/java/org/apache/camel/dataformat/parquet/avro/ParquetAvroDataFormatConfigurer.java
index fef4c7f83f3..04ae2f99682 100644
--- 
a/components/camel-parquet-avro/src/generated/java/org/apache/camel/dataformat/parquet/avro/ParquetAvroDataFormatConfigurer.java
+++ 
b/components/camel-parquet-avro/src/generated/java/org/apache/camel/dataformat/parquet/avro/ParquetAvroDataFormatConfigurer.java
@@ -20,6 +20,8 @@ public class ParquetAvroDataFormatConfigurer extends 
PropertyConfigurerSupport i
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "unmarshaltype":
         case "unmarshalType": 
dataformat.setUnmarshalType(property(camelContext, java.lang.Class.class, 
value)); return true;
+        case "lazyload":
+        case "lazyLoad": dataformat.setLazyLoad(property(camelContext, 
boolean.class, value)); return true;
         default: return false;
         }
     }
diff --git 
a/components/camel-parquet-avro/src/generated/resources/org/apache/camel/dataformat/parquet/avro/parquetAvro.json
 
b/components/camel-parquet-avro/src/generated/resources/org/apache/camel/dataformat/parquet/avro/parquetAvro.json
index 12561237247..f4cafc7e5be 100644
--- 
a/components/camel-parquet-avro/src/generated/resources/org/apache/camel/dataformat/parquet/avro/parquetAvro.json
+++ 
b/components/camel-parquet-avro/src/generated/resources/org/apache/camel/dataformat/parquet/avro/parquetAvro.json
@@ -18,6 +18,7 @@
   "properties": {
     "id": { "index": 0, "kind": "attribute", "displayName": "Id", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "The id of this node" },
     "compressionCodecName": { "index": 1, "kind": "attribute", "displayName": 
"Compression Codec Name", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": "GZIP", "description": "Compression codec to use when 
marshalling." },
-    "unmarshalType": { "index": 2, "kind": "attribute", "displayName": 
"Unmarshal Type", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Class to use when (un)marshalling. If omitted, parquet files 
are converted into Avro's GenericRecords for unmarshalling and input objects 
are assumed as GenericRecords for marshalling." }
+    "unmarshalType": { "index": 2, "kind": "attribute", "displayName": 
"Unmarshal Type", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Class to use when (un)marshalling. If omitted, parquet files 
are converted into Avro's GenericRecords for unmarshalling and input objects 
are assumed as GenericRecords for marshalling." },
+    "lazyLoad": { "index": 3, "kind": "attribute", "displayName": "Lazy Load", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "Whether the unmarshalling should produce an iterator of 
records or read all the records at once." }
   }
 }
diff --git 
a/components/camel-parquet-avro/src/main/java/org/apache/camel/dataformat/parquet/avro/ParquetAvroDataFormat.java
 
b/components/camel-parquet-avro/src/main/java/org/apache/camel/dataformat/parquet/avro/ParquetAvroDataFormat.java
index b2aca2a7e6b..a4809da2bc8 100644
--- 
a/components/camel-parquet-avro/src/main/java/org/apache/camel/dataformat/parquet/avro/ParquetAvroDataFormat.java
+++ 
b/components/camel-parquet-avro/src/main/java/org/apache/camel/dataformat/parquet/avro/ParquetAvroDataFormat.java
@@ -58,10 +58,14 @@ public class ParquetAvroDataFormat extends ServiceSupport 
implements DataFormat,
 
     private Class<?> unmarshalType;
 
+    private boolean lazyLoad;
+
+    @Override
     public String getDataFormatName() {
         return "parquetAvro";
     }
 
+    @Override
     public void marshal(Exchange exchange, Object graph, OutputStream stream) 
throws Exception {
         // marshal from the Java object or GenericRecord (graph) to the 
parquet-avro type
         Configuration conf = new Configuration();
@@ -103,9 +107,9 @@ public class ParquetAvroDataFormat extends ServiceSupport 
implements DataFormat,
         }
     }
 
+    @Override
     public Object unmarshal(Exchange exchange, InputStream stream) throws 
Exception {
         // unmarshal from the input stream of parquet-avro to Java object or 
GenericRecord (graph)
-        List<Object> parquetObjects = new ArrayList<>();
         Configuration conf = new Configuration();
 
         ParquetInputStream parquetInputStream = new ParquetInputStream(
@@ -119,18 +123,26 @@ public class ParquetAvroDataFormat extends ServiceSupport 
implements DataFormat,
             model = new ReflectData(unmarshalType.getClassLoader());
         }
 
-        try (ParquetReader<?> reader = 
AvroParquetReader.builder(parquetInputStream)
+        ParquetReader.Builder<?> builder = 
AvroParquetReader.builder(parquetInputStream)
                 .withDataModel(model)
                 .disableCompatibility() // always use this (since this is a 
new project)
-                .withConf(conf)
-                .build()) {
-            Object pojo;
-            while ((pojo = type.cast(reader.read())) != null) {
-                parquetObjects.add(pojo);
+                .withConf(conf);
+
+        if (lazyLoad) {
+            ParquetIterator<?> iterator = new 
ParquetIterator<>(builder.build());
+            exchange.getExchangeExtension()
+                    .addOnCompletion(new 
ParquetUnmarshalOnCompletion(iterator));
+            return iterator;
+        } else {
+            try (ParquetReader<?> reader = builder.build()) {
+                List<Object> parquetObjects = new ArrayList<>();
+                Object pojo;
+                while ((pojo = type.cast(reader.read())) != null) {
+                    parquetObjects.add(pojo);
+                }
+                return parquetObjects;
             }
         }
-
-        return parquetObjects;
     }
 
     @Override
@@ -167,4 +179,19 @@ public class ParquetAvroDataFormat extends ServiceSupport 
implements DataFormat,
         this.unmarshalType = unmarshalType;
     }
 
+    /**
+     * Indicates whether the unmarshalling should produce an iterator of 
records or read all the records at once.
+     */
+    public boolean isLazyLoad() {
+        return lazyLoad;
+    }
+
+    /**
+     * Sets whether the unmarshalling should produce an iterator of records or 
read all the records at once.
+     */
+    public ParquetAvroDataFormat setLazyLoad(boolean lazyLoad) {
+        this.lazyLoad = lazyLoad;
+        return this;
+    }
+
 }
diff --git 
a/components/camel-parquet-avro/src/main/java/org/apache/camel/dataformat/parquet/avro/ParquetIterator.java
 
b/components/camel-parquet-avro/src/main/java/org/apache/camel/dataformat/parquet/avro/ParquetIterator.java
new file mode 100644
index 00000000000..6bac98b0196
--- /dev/null
+++ 
b/components/camel-parquet-avro/src/main/java/org/apache/camel/dataformat/parquet/avro/ParquetIterator.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dataformat.parquet.avro;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+import org.apache.camel.RuntimeCamelException;
+import org.apache.parquet.hadoop.ParquetReader;
+
+public class ParquetIterator<T> implements Iterator<T>, Closeable {
+    private final ParquetReader<T> reader;
+    private T current;
+
+    public ParquetIterator(ParquetReader<T> reader) {
+        this.reader = reader;
+    }
+
+    @Override
+    public boolean hasNext() {
+        if (current == null) {
+            current = getNext();
+        }
+        return current != null;
+    }
+
+    @Override
+    public T next() {
+        T next = current;
+        current = null;
+        if (next == null) {
+            next = getNext();
+            if (next == null) {
+                throw new NoSuchElementException("No more items available");
+            }
+        }
+        return next;
+    }
+
+    private T getNext() {
+        try {
+            return reader.read();
+        } catch (IOException e) {
+            throw new RuntimeCamelException(e);
+        }
+    }
+
+    @Override
+    public void close() throws IOException {
+        reader.close();
+    }
+}
diff --git 
a/components/camel-parquet-avro/src/main/java/org/apache/camel/dataformat/parquet/avro/ParquetUnmarshalOnCompletion.java
 
b/components/camel-parquet-avro/src/main/java/org/apache/camel/dataformat/parquet/avro/ParquetUnmarshalOnCompletion.java
new file mode 100644
index 00000000000..47ef6279f2f
--- /dev/null
+++ 
b/components/camel-parquet-avro/src/main/java/org/apache/camel/dataformat/parquet/avro/ParquetUnmarshalOnCompletion.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dataformat.parquet.avro;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.support.SynchronizationAdapter;
+
+public class ParquetUnmarshalOnCompletion extends SynchronizationAdapter {
+
+    private final Closeable closeable;
+
+    public ParquetUnmarshalOnCompletion(Closeable closeable) {
+        this.closeable = closeable;
+    }
+
+    @Override
+    public void onDone(Exchange exchange) {
+        try {
+            closeable.close();
+        } catch (IOException e) {
+            // ignore
+        }
+    }
+}
diff --git 
a/components/camel-parquet-avro/src/test/java/org/apache/camel/dataformat/parquet/avro/ParquetAvroDataFormatUnmarshalLazyLoadTest.java
 
b/components/camel-parquet-avro/src/test/java/org/apache/camel/dataformat/parquet/avro/ParquetAvroDataFormatUnmarshalLazyLoadTest.java
new file mode 100644
index 00000000000..f532745dabd
--- /dev/null
+++ 
b/components/camel-parquet-avro/src/test/java/org/apache/camel/dataformat/parquet/avro/ParquetAvroDataFormatUnmarshalLazyLoadTest.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dataformat.parquet.avro;
+
+import java.io.FileInputStream;
+import java.util.List;
+
+import org.apache.avro.Schema;
+import org.apache.avro.SchemaBuilder;
+import org.apache.avro.generic.GenericData.Record;
+import org.apache.avro.generic.GenericRecordBuilder;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class ParquetAvroDataFormatUnmarshalLazyLoadTest extends 
CamelTestSupport {
+
+    @Test
+    public void testUnmarshalLazyLoad() throws Exception {
+
+        MockEndpoint mockResults = getMockEndpoint("mock:result");
+
+        mockResults.expectedMessageCount(3);
+        mockResults.message(0).body().isEqualTo(new Pojo(1, "airport"));
+        mockResults.message(1).body().isEqualTo(new Pojo(2, "penguin"));
+        mockResults.message(2).body().isEqualTo(new Pojo(3, "verb"));
+
+        template.sendBody("direct:start", new 
FileInputStream("src/test/resources/example1.parquet"));
+
+        mockResults.assertIsSatisfied();
+    }
+
+    @Test
+    public void testUnmarshalLazyLoadNoUnmarshalType() throws Exception {
+        Schema schema = SchemaBuilder
+                .record("Pojo")
+                .fields()
+                .requiredString("data")
+                .requiredLong("id")
+                .endRecord();
+
+        Record expected1 = new GenericRecordBuilder(schema).set("data", 
"airport").set("id", 1L).build();
+        Record expected2 = new GenericRecordBuilder(schema).set("data", 
"penguin").set("id", 2L).build();
+        Record expected3 = new GenericRecordBuilder(schema).set("data", 
"verb").set("id", 3L).build();
+
+        MockEndpoint mockResults = 
getMockEndpoint("mock:resultNoUnmarshalType");
+
+        mockResults.expectedMessageCount(3);
+
+        template.sendBody("direct:startNoUnmarshalType", new 
FileInputStream("src/test/resources/example1.parquet"));
+
+        mockResults.assertIsSatisfied();
+
+        List<Exchange> exchanges = mockResults.getExchanges();
+        assertEquals(0, 
exchanges.get(0).getMessage().getBody(Record.class).compareTo(expected1));
+        assertEquals(0, 
exchanges.get(1).getMessage().getBody(Record.class).compareTo(expected2));
+        assertEquals(0, 
exchanges.get(2).getMessage().getBody(Record.class).compareTo(expected3));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+
+            @Override
+            public void configure() throws Exception {
+                ParquetAvroDataFormat format = new ParquetAvroDataFormat()
+                        .setLazyLoad(true);
+                format.setUnmarshalType(Pojo.class);
+
+                ParquetAvroDataFormat formatNoUnmarshalType = new 
ParquetAvroDataFormat()
+                        .setLazyLoad(true);
+
+                from("direct:start")
+                        .unmarshal(format)
+                        .split(body())
+                        .to("mock:result");
+
+                from("direct:startNoUnmarshalType")
+                        .unmarshal(formatNoUnmarshalType)
+                        .split(body())
+                        .to("mock:resultNoUnmarshalType");
+            }
+        };
+    }
+}
diff --git 
a/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/parquetAvro.json
 
b/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/parquetAvro.json
index c4451799bde..048b6aa31e3 100644
--- 
a/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/parquetAvro.json
+++ 
b/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/parquetAvro.json
@@ -15,6 +15,7 @@
   "properties": {
     "id": { "index": 0, "kind": "attribute", "displayName": "Id", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "The id of this node" },
     "compressionCodecName": { "index": 1, "kind": "attribute", "displayName": 
"Compression Codec Name", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": "GZIP", "description": "Compression codec to use when 
marshalling." },
-    "unmarshalType": { "index": 2, "kind": "attribute", "displayName": 
"Unmarshal Type", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Class to use when (un)marshalling. If omitted, parquet files 
are converted into Avro's GenericRecords for unmarshalling and input objects 
are assumed as GenericRecords for marshalling." }
+    "unmarshalType": { "index": 2, "kind": "attribute", "displayName": 
"Unmarshal Type", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Class to use when (un)marshalling. If omitted, parquet files 
are converted into Avro's GenericRecords for unmarshalling and input objects 
are assumed as GenericRecords for marshalling." },
+    "lazyLoad": { "index": 3, "kind": "attribute", "displayName": "Lazy Load", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "Whether the unmarshalling should produce an iterator of 
records or read all the records at once." }
   }
 }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ParquetAvroDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ParquetAvroDataFormat.java
index 2524996256b..402bc819837 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ParquetAvroDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ParquetAvroDataFormat.java
@@ -44,6 +44,10 @@ public class ParquetAvroDataFormat extends 
DataFormatDefinition {
     @XmlAttribute(name = "unmarshalType")
     private String unmarshalTypeName;
 
+    @XmlAttribute
+    @Metadata(javaType = "java.lang.Boolean")
+    private String lazyLoad;
+
     public ParquetAvroDataFormat() {
         super("parquetAvro");
     }
@@ -58,11 +62,17 @@ public class ParquetAvroDataFormat extends 
DataFormatDefinition {
         this.unmarshalType = unmarshalType;
     }
 
+    public ParquetAvroDataFormat(boolean lazyLoad) {
+        this();
+        setLazyLoad(Boolean.toString(lazyLoad));
+    }
+
     private ParquetAvroDataFormat(Builder builder) {
         this();
         this.compressionCodecName = builder.compressionCodecName;
         this.unmarshalTypeName = builder.unmarshalTypeName;
         this.unmarshalType = builder.unmarshalType;
+        this.lazyLoad = builder.lazyLoad;
     }
 
     /**
@@ -99,6 +109,17 @@ public class ParquetAvroDataFormat extends 
DataFormatDefinition {
         return unmarshalTypeName;
     }
 
+    public String getLazyLoad() {
+        return lazyLoad;
+    }
+
+    /**
+     * Whether the unmarshalling should produce an iterator of records or read 
all the records at once.
+     */
+    public void setLazyLoad(String lazyLoad) {
+        this.lazyLoad = lazyLoad;
+    }
+
     /**
      * {@code Builder} is a specific builder for {@link ParquetAvroDataFormat}.
      */
@@ -108,6 +129,7 @@ public class ParquetAvroDataFormat extends 
DataFormatDefinition {
         private String compressionCodecName;
         private Class<?> unmarshalType;
         private String unmarshalTypeName;
+        private String lazyLoad;
 
         /**
          * Compression codec to use when marshalling.
@@ -133,6 +155,22 @@ public class ParquetAvroDataFormat extends 
DataFormatDefinition {
             return this;
         }
 
+        /**
+         * Whether the unmarshalling should produce an iterator of records or 
read all the records at once.
+         */
+        public Builder lazyLoad(String lazyLoad) {
+            this.lazyLoad = lazyLoad;
+            return this;
+        }
+
+        /**
+         * Whether the unmarshalling should produce an iterator of records or 
read all the records at once.
+         */
+        public Builder lazyLoad(boolean lazyLoad) {
+            this.lazyLoad = Boolean.toString(lazyLoad);
+            return this;
+        }
+
         @Override
         public ParquetAvroDataFormat end() {
             return new ParquetAvroDataFormat(this);
diff --git 
a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java 
b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
index d633c037d78..84cf0cc12f8 100644
--- 
a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
+++ 
b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
@@ -2450,6 +2450,7 @@ public class ModelParser extends BaseParser {
         return doParse(new ParquetAvroDataFormat(), (def, key, val) -> {
             switch (key) {
                 case "compressionCodecName": def.setCompressionCodecName(val); 
break;
+                case "lazyLoad": def.setLazyLoad(val); break;
                 case "unmarshalType": def.setUnmarshalTypeName(val); break;
                 default: return identifiedTypeAttributeHandler().accept(def, 
key, val);
             }
diff --git 
a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java
 
b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java
index 3c24894bdfd..f64fde80adf 100644
--- 
a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java
+++ 
b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java
@@ -3465,6 +3465,7 @@ public class ModelWriter extends BaseWriter {
         doWriteIdentifiedTypeAttributes(def);
         doWriteAttribute("compressionCodecName", 
def.getCompressionCodecName());
         doWriteAttribute("unmarshalType", def.getUnmarshalTypeName());
+        doWriteAttribute("lazyLoad", def.getLazyLoad());
         endElement(name);
     }
     protected void doWriteProtobufDataFormat(
diff --git 
a/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java
 
b/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java
index 6cbbea60a2e..603c2ed5ac2 100644
--- 
a/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java
+++ 
b/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java
@@ -3465,6 +3465,7 @@ public class ModelWriter extends BaseWriter {
         doWriteIdentifiedTypeAttributes(def);
         doWriteAttribute("compressionCodecName", 
def.getCompressionCodecName());
         doWriteAttribute("unmarshalType", def.getUnmarshalTypeName());
+        doWriteAttribute("lazyLoad", def.getLazyLoad());
         endElement(name);
     }
     protected void doWriteProtobufDataFormat(
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
index b7b30ade16a..b913c3f78eb 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
@@ -10703,6 +10703,7 @@ public final class ModelDeserializers extends 
YamlDeserializerSupport {
             properties = {
                     @YamlProperty(name = "compressionCodecName", type = 
"string", defaultValue = "GZIP", description = "Compression codec to use when 
marshalling.", displayName = "Compression Codec Name"),
                     @YamlProperty(name = "id", type = "string", description = 
"The id of this node", displayName = "Id"),
+                    @YamlProperty(name = "lazyLoad", type = "boolean", 
description = "Whether the unmarshalling should produce an iterator of records 
or read all the records at once.", displayName = "Lazy Load"),
                     @YamlProperty(name = "unmarshalType", type = "string", 
description = "Class to use when (un)marshalling. If omitted, parquet files are 
converted into Avro's GenericRecords for unmarshalling and input objects are 
assumed as GenericRecords for marshalling.", displayName = "Unmarshal Type")
             }
     )
@@ -10736,6 +10737,11 @@ public final class ModelDeserializers extends 
YamlDeserializerSupport {
                     target.setId(val);
                     break;
                 }
+                case "lazyLoad": {
+                    String val = asText(node);
+                    target.setLazyLoad(val);
+                    break;
+                }
                 case "unmarshalType": {
                     String val = asText(node);
                     target.setUnmarshalTypeName(val);
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
index c33911e3e73..5593b355f78 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
@@ -10685,6 +10685,11 @@
               "title" : "Id",
               "description" : "The id of this node"
             },
+            "lazyLoad" : {
+              "type" : "boolean",
+              "title" : "Lazy Load",
+              "description" : "Whether the unmarshalling should produce an 
iterator of records or read all the records at once."
+            },
             "unmarshalType" : {
               "type" : "string",
               "title" : "Unmarshal Type",

Reply via email to