LINUX.ORG.RU

История изменений

Исправление foror, (текущая версия) :

Почему порочная концепция? Мне нравится, в некоторой степени, концепция RethinkDB и не только мне.

я видел и работал с DB2, в которой куча хранимок была написана на Java

Ну видимо эти хранимки были написаны отдельными файлами и никак не шарились с общим кодом в IDE? В моём случае у меня есть классы в Eclipse, в некоторых из них есть статичные методы с аннотацией @Function/@Trigger.

Мой ORM фреймворк автоматически подхватывает данные классы и статичные методы, после чего маппит их на таблицы (добавляет констрейнты, тригеры из статичных методов), домены (класс только с одним полем и логикой для проверки этого поля) или композитные типы (если я не хочу маппить класс на таблицу, например javax.money).

Т.е. все функции/тригеры лежат прямо в классах, с которыми я тут же работаю на клиенте-БД/сервере-http обрабатывая http запросы. А не в каких-то левых файлах, в которых IDE в лучшем случае подсветит синтаксис.

А потому работает рефакторинг и автодополнение. Очень удобно. Примерно вот так:

public class Inn {
    
    public enum message {
        bad_checksum,
        bad_length;
    }    

    private static final int[] MULT_N1 = { 7, 2, 4, 10, 3, 5, 9, 4, 6, 8 };
    private static final int[] MULT_N2 = { 3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8 };
    private static final int[] MULT_N =  { 2, 4, 10, 3, 5, 9, 4, 6, 8 };      

    public final long value;
    
    public Inn(long value) {
        this.value = value;
    }

    @Function(schema="check", name="inn")
    public static boolean check(long value) throws SQLException {
        int length = (int)(Math.log10(value) + 1);
        boolean valid = false;
        
        switch (length) {
        case 12:
            int n1 = getChecksum(value / 100, MULT_N1);
            int n2 = getChecksum(value / 10, MULT_N2);
            valid = value % 10 == n2 && (value / 10) % 10 == n1;
            break;
            
        case 10:
            int n = getChecksum(value / 10, MULT_N);
            valid = value % 10 == n;
            break;
        default:
            throw new SQLException(message.bad_length.name());
        }
        
        if (valid)
            return true;
        
        throw new SQLException(message.bad_checksum.name());
    }
    
    private static int getChecksum(long value, int[] multipliers) {
        int checksum = 0;
        
        for (int i = multipliers.length - 1; i >= 0; i--) {
            checksum += (value % 10) * multipliers[i];
            value /= 10;
        }
        
        return (checksum % 11) % 10;
    }     
}

В БД будет создан домен:

CREATE DOMAIN public.inn
  AS bigint
  CONSTRAINT inn_check CHECK (check.inn(VALUE));

Теперь моя ORM может маппить всё это дело, например так:

public class Customer {
    private Inn inn;
}

CREATE TABLE public.customer
(
  inn inn
)

Исправление foror, :

Почему порочная концепция? Мне нравится, в некоторой степени, концепция RethinkDB и не только мне.

я видел и работал с DB2, в которой куча хранимок была написана на Java

Ну видимо эти хранимки были написаны отдельными файлами и никак не шарились с общим кодом в IDE? В моём случае у меня есть классы в Eclipse, в некоторых из них есть статичные методы с аннотацией @Function/@Trigger.

Мой ORM фреймворк автоматически подхватывает данные классы и статичные методы, после чего маппит их на таблицы (добавляет констрейнты, тригеры из статичных методов), домены (класс только с одним полем и логикой для проверки этого поля) или композитные типы (если я не хочу маппить класс на таблицу, например javax.money).

Т.е. все функции/тригеры лежат прямо в классах, с которыми я тут же работаю на клиенте-БД/сервере-http обрабатывая http запросы. А не в каких-то левых файлах, в которых IDE в лучшем случае подсветит синтаксис.

А потому работает рефакторинг и автодополнение. Очень удобно. Примерно вот так:

public class Inn {
    
    public enum message {
        bad_checksum,
        bad_length;
    }    

    private static final int[] MULT_N1 = { 7, 2, 4, 10, 3, 5, 9, 4, 6, 8 };
    private static final int[] MULT_N2 = { 3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8 };
    private static final int[] MULT_N =  { 2, 4, 10, 3, 5, 9, 4, 6, 8 };      

    public final long value;
    
    public Inn(long value) {
        this.value = value;
    }

    @Function(schema="check", name="inn")
    public static boolean check(long value) throws SQLException {
        int length = (int)(Math.log10(value) + 1);
        boolean valid = false;
        
        switch (length) {
        case 12:
            int n1 = getChecksum(value / 100, MULT_N1);
            int n2 = getChecksum(value / 10, MULT_N2);
            valid = value % 10 == n2 && (value / 10) % 10 == n1;
            break;
            
        case 10:
            int n = getChecksum(value / 10, MULT_N);
            valid = value % 10 == n;
            break;
        default:
            throw new SQLException(message.bad_length.name());
        }
        
        if (valid)
            return true;
        
        throw new SQLException(message.bad_checksum.name());
    }
    
    private static int getChecksum(long value, int[] multipliers) {
        int checksum = 0;
        
        for (int i = multipliers.length - 1; i >= 0; i--) {
            checksum += (value % 10) * multipliers[i];
            value /= 10;
        }
        
        return (checksum % 11) % 10;
    }     
}

В БД будет создан домен:

CREATE DOMAIN public.inn
  AS bigint
  CONSTRAINT inn_check CHECK (check.inn(VALUE));

Теперь моя ORM может маппить всё это дело, например так:

public class Customer {
    private Inn inn;
}

Исходная версия foror, :

Почему порочная концепция? Мне нравится, в некоторой степени, концепция RethinkDB и не только мне.

я видел и работал с DB2, в которой куча хранимок была написана на Java

Ну видимо эти хранимки были написаны отдельными файлами и никак не шарились с общим кодом в IDE? В моём случае у меня есть классы в Eclipse, в некоторых из них есть статичные методы с аннотацией @Function/@Trigger.

Мой ORM фреймворк автоматически подхватывает данные классы и статичные поля, после чего маппит их на таблицы (добавляет констрейнты, тригеры из статичных методов), домены (класс только с одним полем и логикой для проверки этого поля) или композитные типы (если я не хочу маппить класс на таблицу, например javax.money).

Т.е. все функции/тригеры лежат прямо в классах, с которыми я тут же работаю на клиенте-БД/сервере-http обрабатывая http запросы. А не в каких-то левых файлах, в которых IDE в лучшем случае подсветит синтаксис.

А потому работает рефакторинг и автодополнение. Очень удобно. Примерно вот так:

public class Inn {
    
    public enum message {
        bad_checksum,
        bad_length;
    }    

    private static final int[] MULT_N1 = { 7, 2, 4, 10, 3, 5, 9, 4, 6, 8 };
    private static final int[] MULT_N2 = { 3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8 };
    private static final int[] MULT_N =  { 2, 4, 10, 3, 5, 9, 4, 6, 8 };      

    public final long value;
    
    public Inn(long value) {
        this.value = value;
    }

    @Function(schema="check", name="inn")
    public static boolean check(long value) throws SQLException {
        int length = (int)(Math.log10(value) + 1);
        boolean valid = false;
        
        switch (length) {
        case 12:
            int n1 = getChecksum(value / 100, MULT_N1);
            int n2 = getChecksum(value / 10, MULT_N2);
            valid = value % 10 == n2 && (value / 10) % 10 == n1;
            break;
            
        case 10:
            int n = getChecksum(value / 10, MULT_N);
            valid = value % 10 == n;
            break;
        default:
            throw new SQLException(message.bad_length.name());
        }
        
        if (valid)
            return true;
        
        throw new SQLException(message.bad_checksum.name());
    }
    
    private static int getChecksum(long value, int[] multipliers) {
        int checksum = 0;
        
        for (int i = multipliers.length - 1; i >= 0; i--) {
            checksum += (value % 10) * multipliers[i];
            value /= 10;
        }
        
        return (checksum % 11) % 10;
    }     
}

В БД будет создан домен:

CREATE DOMAIN public.inn
  AS bigint
  CONSTRAINT inn_check CHECK (check.inn(VALUE));

Теперь моя ORM может маппить всё это дело, например так:

public class Customer {
    private Inn inn;
}