
br.com.objectos.db.AbstractSqlBuilder Maven / Gradle / Ivy
/*
* Copyright 2015 Objectos, Fábrica de Software LTDA.
*
* Licensed 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 br.com.objectos.db;
import java.util.Objects;
/**
* @author [email protected] (Marcio Endo)
*/
public abstract class AbstractSqlBuilder implements SqlBuilder {
protected final Name name;
protected final Space space;
protected final StringBuilder sql;
protected AbstractSqlBuilder(Name name, Space space, StringBuilder sql) {
this.name = name;
this.space = space;
this.sql = sql;
}
@Override
public final SqlBuilder accept(SqlElement element) {
return element.accept(this);
}
@Override
public final SqlBuilder add(char character) {
write(character);
return self();
}
@Override
public final SqlBuilder add(String string) {
Objects.requireNonNull(string);
write(string);
return self();
}
@Override
public final SqlBuilder autoSpaceOff() {
return factory(name, Space.OFF, sql);
}
@Override
public final SqlBuilder autoSpaceOn() {
return factory(name, Space.ON, sql);
}
@Override
public SqlBuilder autoSpaceOnNext() {
return factoryDelayed(name, sql);
}
@Override
public final SqlBuilder identifier(String identifier) {
Objects.requireNonNull(identifier);
identifier0(identifier);
return self();
}
@Override
public final SqlBuilder identifier(String id0, String id1) {
Objects.requireNonNull(id0);
Objects.requireNonNull(id1);
qualifiedName(id0, id1);
return self();
}
@Override
public final SqlBuilder identifier(String id0, String id1, String id2) {
Objects.requireNonNull(id0);
Objects.requireNonNull(id1);
Objects.requireNonNull(id2);
qualifiedName(id0, id1, id2);
return self();
}
@Override
public final SqlBuilder identifier(String id0, String id1, String id2, String id3) {
Objects.requireNonNull(id0);
Objects.requireNonNull(id1);
Objects.requireNonNull(id2);
Objects.requireNonNull(id3);
qualifiedName(id0, id1, id3);
return self();
}
@Override
public final SqlBuilder keyword(String keyword) {
write(keyword);
return self();
}
@Override
public final SqlBuilderOn on(char separator) {
return on(String.valueOf(separator));
}
@Override
public final SqlBuilderOn on(String separator) {
Objects.requireNonNull(separator);
return new SqlBuilderOn() {
@Override
public SqlBuilder join(SqlElement... elements) {
return join0(self(), elements);
}
@Override
public SqlBuilder join(char prefix, char suffix, SqlElement... elements) {
write(prefix);
SqlBuilder s = join0(autoSpaceOff(), elements);
sql.append(suffix);
return s;
}
private SqlBuilder join0(SqlBuilder s, SqlElement... elements) {
if (elements.length == 0) {
return s;
}
elements[0].accept(s);
if (elements.length == 1) {
return s;
}
s = autoSpaceOff();
for (int i = 1; i < elements.length; i++) {
s.add(separator);
elements[i].accept(s);
}
return s.autoSpaceOn();
}
};
}
@Override
public final SqlBuilder qualifiedNamesOff() {
return factory(Name.SIMPLE, space, sql);
}
@Override
public final SqlBuilder qualifiedNamesOn() {
return factory(Name.QUALIFIED, space, sql);
}
@Override
public final String toString() {
return sql.toString();
}
protected abstract SqlBuilder factory(Name name, Space space, StringBuilder sql);
protected abstract SqlBuilder factoryDelayed(Name name, StringBuilder sql);
protected SqlBuilder self() {
return this;
}
protected String quote(String text) {
return text;
}
private void identifier0(String identifier) {
write(quote(identifier));
}
private void qualifiedName(String... identifiers) {
write(name.write(this::quote, identifiers));
}
private void write(char c) {
space.write(sql);
sql.append(c);
}
private void write(String text) {
space.write(sql);
sql.append(text);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy