История изменений
Исправление 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;
}