Какие шаги необходимы для добавления поддержки 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

С тех пор все могло измениться, но эта ветка даст вам хорошее руководство. Лучше всего, если вы разветвляете проект и по окончании отправляете свою работу в виде запроса на извлечение.

Другие вопросы по тегам