Какие шаги необходимы для добавления поддержки Phoenix в ActiveJDBC?
Я пытаюсь добавить поддержку Apache Phoenix в ActiveJDBC. Я использую проект простого примера ActiveJDBC в качестве теста и вносю изменения в клон ActiveJDBC 2.0-SNAPSHOT (последний из github).
До сих пор в ActiveJDBC 2.0-SNAPSHOT у меня есть:
- создал класс PhoenixDialect в org.javalite.activejdbc.dialects для переопределения метода вставки (Phoenix использует UPSERT)
- добавлен раздел if в метод getDialect(String dbType) в конфигурации
В проекте простого примера у меня есть:
- добавил клиент Phoenix в качестве зависимости (мы используем Phoenix как часть HortonWorks HDP 2.5.3.0 на HBase 1.1.2.2.5)
- установить для database.properties значения Phoenix
- создал соответствующие таблицы в Phoenix вручную (db-migrate не работает по понятным причинам)
Тем не менее, диалект базы данных не распознается, и, я полагаю, по умолчанию используется DefaultDialect, поскольку я получаю ошибку Phoenix при использовании "INSERT", которая не распознается в грамматике Phoenix. Грамматика феникса
Есть ли дополнительные шаги, которые я пропускаю при добавлении поддержки дополнительного диалекта?
Я также подозреваю, что драйвер Phoenix jdbc может не поддерживать метод типа getDbName(), драйвер Phoenix при запросе getPropertyInfo() возвращает EMPTY_INFO, см. PhoenixEmbeddedDriver
Если драйвер не возвращает DbName, есть ли обходной путь?
Возможно, стоит упомянуть, что мы успешно взаимодействуем с Phoenix, используя стандартные классы Java jdbc (PreparedStatement и все такое хорошее), но ActiveJDBC гораздо элегантнее, и мы хотели бы использовать его.
Кусочки того, что у нас так далеко:
PhoenixDialect
import java.util.Iterator;
import java.util.Map;
import org.javalite.activejdbc.MetaModel;
import static org.javalite.common.Util.join;
public class PhoenixDialect extends DefaultDialect {
@Override
public String insert(MetaModel metaModel, Map<String, Object> attributes) {
StringBuilder query = new StringBuilder().append("UPSERT INTO ").append(metaModel.getTableName()).append(' ');
if (attributes.isEmpty()) {
appendEmptyRow(metaModel, query);
} else {
boolean addIdGeneratorCode = (metaModel.getIdGeneratorCode() != null
&& attributes.get(metaModel.getIdName()) == null); // do not use containsKey
query.append('(');
if (addIdGeneratorCode) {
query.append(metaModel.getIdName()).append(", ");
}
join(query, attributes.keySet(), ", ");
query.append(") VALUES (");
if (addIdGeneratorCode) {
query.append(metaModel.getIdGeneratorCode()).append(", ");
}
Iterator<Object> it = attributes.values().iterator();
appendValue(query, it.next());
while (it.hasNext()) {
query.append(", ");
appendValue(query, it.next());
}
query.append(')');
}
return query.toString();
}
}
конфигурация
public Dialect getDialect(String dbType) {
Dialect dialect = dialects.get(dbType);
if (dialect == null) {
if (dbType.equalsIgnoreCase("Oracle")) {
dialect = new OracleDialect();
}
else if (dbType.equalsIgnoreCase("Phoenix")) {
dialect = new PhoenixDialect();
}
else if (dbType.equalsIgnoreCase("MySQL")) {
dialect = new MySQLDialect();
}
database.properties
development.driver=org.apache.phoenix.jdbc.PhoenixDriver
development.username=anything
development.password=anything
development.url=jdbc:phoenix:hdp-c21:2181:/hbase-unsecure
1 ответ
Вот ветвь, которая использовалась для интеграции SQLServer с новым Dialect, набором тестов и другими связанными вещами:
https://github.com/javalite/activejdbc/tree/sql_server_integration
Вот ветка для h2:
https://github.com/javalite/activejdbc/commits/h2integration
С тех пор все могло измениться, но эта ветка даст вам хорошее руководство. Лучше всего, если вы разветвляете проект и по окончании отправляете свою работу в виде запроса на извлечение.