Search in sources :

Example 6 with DEFINE

use of org.jdbi.v3.core.internal.lexer.DefineStatementLexer.DEFINE in project jdbi by jdbi.

the class JdbiFactoryBean method createInstance.

@Override
protected Jdbi createInstance() throws Exception {
    final Jdbi jdbi = Jdbi.create(new SpringConnectionFactory(dataSource));
    if (autoInstallPlugins) {
        jdbi.installPlugins();
    }
    plugins.forEach(jdbi::installPlugin);
    globalDefines.forEach(jdbi::define);
    return jdbi;
}
Also used : Jdbi(org.jdbi.v3.core.Jdbi)

Example 7 with DEFINE

use of org.jdbi.v3.core.internal.lexer.DefineStatementLexer.DEFINE in project jdbi by jdbi.

the class TestHashPrefixSqlParser method render.

private String render(String sql, Map<String, Object> attributes) {
    StatementContext ctx = StatementContextAccess.createContext();
    attributes.forEach(ctx::define);
    return templateEngine.render(sql, ctx);
}
Also used : StatementContext(org.jdbi.v3.core.statement.StatementContext)

Example 8 with DEFINE

use of org.jdbi.v3.core.internal.lexer.DefineStatementLexer.DEFINE in project jdbi by jdbi.

the class SqlStatement method bindMethodsList.

/**
 * For each value given, create a tuple by invoking each given method in order, and bind the tuple into
 * a {@code VALUES (...)} format insert clause.
 * @param key attribute name
 * @param values list of values that will be comma-spliced into the defined attribute value
 * @param methodNames list of methods that will be invoked on the values
 * @return this
 * @throws IllegalArgumentException if the list of values or properties is empty.
 * @throws UnableToCreateStatementException if the method cannot be found
 */
public final This bindMethodsList(String key, Iterable<?> values, List<String> methodNames) {
    final Iterator<?> valueIter = values.iterator();
    if (!valueIter.hasNext()) {
        throw new IllegalArgumentException(getClass().getSimpleName() + ".bindMethodsList was called with no values.");
    }
    if (methodNames.isEmpty()) {
        throw new IllegalArgumentException(getClass().getSimpleName() + ".bindMethodsList was called with no values.");
    }
    final StringBuilder names = new StringBuilder();
    final StatementContext ctx = getContext();
    for (int valueIndex = 0; valueIter.hasNext(); valueIndex++) {
        if (valueIndex > 0) {
            names.append(',');
        }
        final Object bean = valueIter.next();
        final ObjectMethodArguments beanMethods = new ObjectMethodArguments(null, bean);
        names.append('(');
        for (int methodIndex = 0; methodIndex < methodNames.size(); methodIndex++) {
            if (methodIndex > 0) {
                names.append(',');
            }
            final String methodName = methodNames.get(methodIndex);
            final String name = key + valueIndex + '.' + methodName;
            names.append(':').append(name);
            final Argument argument = beanMethods.find(methodName, ctx).orElseThrow(() -> new UnableToCreateStatementException("Unable to get " + methodName + " argument for " + bean, ctx));
            bind(name, argument);
        }
        names.append(')');
    }
    return define(key, names.toString());
}
Also used : InputStreamArgument(org.jdbi.v3.core.argument.InputStreamArgument) NullArgument(org.jdbi.v3.core.argument.NullArgument) ObjectArgument(org.jdbi.v3.core.argument.ObjectArgument) Argument(org.jdbi.v3.core.argument.Argument) CharacterStreamArgument(org.jdbi.v3.core.argument.CharacterStreamArgument) ObjectMethodArguments(org.jdbi.v3.core.argument.ObjectMethodArguments)

Example 9 with DEFINE

use of org.jdbi.v3.core.internal.lexer.DefineStatementLexer.DEFINE in project jdbi by jdbi.

the class DefinedAttributeTemplateEngine method parse.

@Override
public Optional<Function<StatementContext, String>> parse(String template, ConfigRegistry config) {
    StringBuilder buf = new StringBuilder();
    List<BiConsumer<StatementContext, StringBuilder>> preparation = new ArrayList<>();
    Runnable pushBuf = () -> {
        // NOPMD
        if (buf.length() > 0) {
            String bit = buf.toString();
            buf.setLength(0);
            preparation.add((ctx, b) -> b.append(bit));
        }
    };
    DefineStatementLexer lexer = new DefineStatementLexer(CharStreams.fromString(template));
    lexer.addErrorListener(new ErrorListener());
    Token t = lexer.nextToken();
    while (t.getType() != EOF) {
        switch(t.getType()) {
            case COMMENT:
            case LITERAL:
            case QUOTED_TEXT:
            case DOUBLE_QUOTED_TEXT:
                buf.append(t.getText());
                break;
            case DEFINE:
                pushBuf.run();
                String text = t.getText();
                String key = text.substring(1, text.length() - 1);
                preparation.add((ctx, b) -> {
                    Object value = ctx.getAttribute(key);
                    if (value == null) {
                        throw new UnableToCreateStatementException("Undefined attribute for token '" + text + "'", ctx);
                    }
                    b.append(value);
                });
                break;
            case ESCAPED_TEXT:
                buf.append(t.getText().substring(1));
                break;
            default:
                break;
        }
        t = lexer.nextToken();
    }
    pushBuf.run();
    return Optional.of(ctx -> {
        try {
            StringBuilder result = new StringBuilder();
            preparation.forEach(a -> a.accept(ctx, result));
            return result.toString();
        } catch (RuntimeException e) {
            throw new UnableToCreateStatementException("Error rendering SQL template: '" + template + "'", e, ctx);
        }
    });
}
Also used : ESCAPED_TEXT(org.jdbi.v3.core.internal.lexer.DefineStatementLexer.ESCAPED_TEXT) LITERAL(org.jdbi.v3.core.internal.lexer.DefineStatementLexer.LITERAL) Token(org.antlr.v4.runtime.Token) COMMENT(org.jdbi.v3.core.internal.lexer.DefineStatementLexer.COMMENT) QUOTED_TEXT(org.jdbi.v3.core.internal.lexer.DefineStatementLexer.QUOTED_TEXT) Function(java.util.function.Function) ConfigRegistry(org.jdbi.v3.core.config.ConfigRegistry) DOUBLE_QUOTED_TEXT(org.jdbi.v3.core.internal.lexer.DefineStatementLexer.DOUBLE_QUOTED_TEXT) ArrayList(java.util.ArrayList) List(java.util.List) CharStreams(org.antlr.v4.runtime.CharStreams) DEFINE(org.jdbi.v3.core.internal.lexer.DefineStatementLexer.DEFINE) BiConsumer(java.util.function.BiConsumer) Optional(java.util.Optional) ErrorListener(org.jdbi.v3.core.statement.internal.ErrorListener) DefineStatementLexer(org.jdbi.v3.core.internal.lexer.DefineStatementLexer) EOF(org.antlr.v4.runtime.Recognizer.EOF) ArrayList(java.util.ArrayList) Token(org.antlr.v4.runtime.Token) ErrorListener(org.jdbi.v3.core.statement.internal.ErrorListener) DefineStatementLexer(org.jdbi.v3.core.internal.lexer.DefineStatementLexer) BiConsumer(java.util.function.BiConsumer)

Example 10 with DEFINE

use of org.jdbi.v3.core.internal.lexer.DefineStatementLexer.DEFINE in project jdbi by jdbi.

the class TestStatementContext method testFoo.

@Test
public void testFoo() {
    Handle h = h2Extension.openHandle();
    final int inserted = h.createUpdate("insert into <table> (id, name) values (:id, :name)").bind("id", 7).bind("name", "Martin").define("table", "something").execute();
    assertThat(inserted).isEqualTo(1);
}
Also used : Handle(org.jdbi.v3.core.Handle) Test(org.junit.jupiter.api.Test)

Aggregations

Annotation (java.lang.annotation.Annotation)2 Method (java.lang.reflect.Method)2 Parameter (java.lang.reflect.Parameter)2 Type (java.lang.reflect.Type)2 List (java.util.List)2 Jdbi (org.jdbi.v3.core.Jdbi)2 Argument (org.jdbi.v3.core.argument.Argument)2 CharacterStreamArgument (org.jdbi.v3.core.argument.CharacterStreamArgument)2 InputStreamArgument (org.jdbi.v3.core.argument.InputStreamArgument)2 NullArgument (org.jdbi.v3.core.argument.NullArgument)2 ObjectArgument (org.jdbi.v3.core.argument.ObjectArgument)2 DefineStatementLexer (org.jdbi.v3.core.internal.lexer.DefineStatementLexer)2 SqlStatementCustomizerFactory (org.jdbi.v3.sqlobject.customizer.SqlStatementCustomizerFactory)2 SqlStatementParameterCustomizer (org.jdbi.v3.sqlobject.customizer.SqlStatementParameterCustomizer)2 ParameterUtil (org.jdbi.v3.sqlobject.internal.ParameterUtil)2 ArrayList (java.util.ArrayList)1 Arrays (java.util.Arrays)1 Objects (java.util.Objects)1 Optional (java.util.Optional)1 BiConsumer (java.util.function.BiConsumer)1