From 9acb5772b411f485f0211718f79bf7479cb4cb1f Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 22 Jul 2020 16:26:32 +0200 Subject: [PATCH] [jOOQ/jOOQ#4941] Add LoaderListenerStep.onRowStart() for preprocessing input data --- .../src/main/java/org/jooq/LoaderContext.java | 13 ++++++ .../java/org/jooq/LoaderListenerStep.java | 20 ++++++++- .../main/java/org/jooq/LoaderRowListener.java | 2 +- .../main/java/org/jooq/impl/LoaderImpl.java | 43 ++++++++++++++++--- 4 files changed, 70 insertions(+), 8 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/LoaderContext.java b/jOOQ/src/main/java/org/jooq/LoaderContext.java index cc36da814a..40fdc55f8a 100644 --- a/jOOQ/src/main/java/org/jooq/LoaderContext.java +++ b/jOOQ/src/main/java/org/jooq/LoaderContext.java @@ -49,6 +49,19 @@ import org.jetbrains.annotations.NotNull; */ public interface LoaderContext { + /** + * Override the row that will be processed. Changing it has now effect on + * the {@link LoaderListenerStep#onRowEnd(LoaderRowListener)} event. + */ + @NotNull + LoaderContext row(Object[] row); + + /** + * The row that will be or has been processed. + */ + @NotNull + Object[] row(); + /** * A list of errors that might have happened during the load. */ diff --git a/jOOQ/src/main/java/org/jooq/LoaderListenerStep.java b/jOOQ/src/main/java/org/jooq/LoaderListenerStep.java index 31288fc5a9..460bd4a21c 100644 --- a/jOOQ/src/main/java/org/jooq/LoaderListenerStep.java +++ b/jOOQ/src/main/java/org/jooq/LoaderListenerStep.java @@ -37,7 +37,7 @@ */ package org.jooq; -import org.jetbrains.annotations.*; +import org.jetbrains.annotations.NotNull; /** @@ -70,8 +70,26 @@ public interface LoaderListenerStep extends LoaderLoadStep /** * Specify a listener that is invoked whenever a row has been processed. + * + * @deprecated - 3.14.0 - [#4941] - Use {@link #onRowEnd(LoaderRowListener)} + * instead. */ + @Deprecated @NotNull @Support LoaderLoadStep onRow(LoaderRowListener listener); + + /** + * Specify a listener that is invoked before a row is processed. + */ + @NotNull + @Support + LoaderLoadStep onRowStart(LoaderRowListener listener); + + /** + * Specify a listener that is invoked after a row has been processed. + */ + @NotNull + @Support + LoaderLoadStep onRowEnd(LoaderRowListener listener); } diff --git a/jOOQ/src/main/java/org/jooq/LoaderRowListener.java b/jOOQ/src/main/java/org/jooq/LoaderRowListener.java index 9b50a7a203..017611466e 100644 --- a/jOOQ/src/main/java/org/jooq/LoaderRowListener.java +++ b/jOOQ/src/main/java/org/jooq/LoaderRowListener.java @@ -47,7 +47,7 @@ package org.jooq; public interface LoaderRowListener { /** - * A row has been processed by the {@link Loader} + * A row will be or has been processed by the {@link Loader}. */ void row(LoaderContext ctx); } diff --git a/jOOQ/src/main/java/org/jooq/impl/LoaderImpl.java b/jOOQ/src/main/java/org/jooq/impl/LoaderImpl.java index db4489896e..3d800a1c4a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/LoaderImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/LoaderImpl.java @@ -178,8 +178,9 @@ final class LoaderImpl implements // Result data // ----------- - private LoaderRowListener listener; - private LoaderContext result = new DefaultLoaderContext(); + private LoaderRowListener onRowStart; + private LoaderRowListener onRowEnd; + private LoaderContext rowCtx = new DefaultLoaderContext(); private int ignored; private int processed; private int stored; @@ -645,7 +646,18 @@ final class LoaderImpl implements @Override public final LoaderImpl onRow(LoaderRowListener l) { - listener = l; + return onRowEnd(l); + } + + @Override + public final LoaderImpl onRowStart(LoaderRowListener l) { + onRowStart = l; + return this; + } + + @Override + public final LoaderImpl onRowEnd(LoaderRowListener l) { + onRowEnd = l; return this; } @@ -817,6 +829,12 @@ final class LoaderImpl implements if (fields[i].getType() == byte[].class && row[i] instanceof String) row[i] = DatatypeConverter.parseBase64Binary((String) row[i]); + rowCtx.row(row); + if (onRowStart != null) { + onRowStart.row(rowCtx); + row = rowCtx.row(); + } + // TODO: In batch mode, we can probably optimise this by not creating // new statements every time, just to convert bind values to their // appropriate target types. But beware of SQL dialects that tend to @@ -916,8 +934,8 @@ final class LoaderImpl implements } finally { - if (listener != null) - listener.row(result); + if (onRowEnd != null) + onRowEnd.row(rowCtx); } // rows: } @@ -1037,10 +1055,23 @@ final class LoaderImpl implements @Override public final LoaderContext result() { - return result; + return rowCtx; } private class DefaultLoaderContext implements LoaderContext { + Object[] row; + + @Override + public final LoaderContext row(Object[] r) { + this.row = r; + return this; + } + + @Override + public final Object[] row() { + return row; + } + @Override public final List errors() { return errors;