Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Добавить функцию в ядро fb3 / 12 сообщений из 12, страница 1 из 1
19.03.2016, 23:20
    #39196239
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить функцию в ядро fb3
Добрый вечер!

Как можно добавить функцию в ядро fb3, которой очень не хватает. Аналог в php similar_text?
...
Рейтинг: 0 / 0
19.03.2016, 23:24
    #39196242
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить функцию в ядро fb3
__Avenger__,

зачем же сразу в ядро. Напиши свою UDR и всё.
...
Рейтинг: 0 / 0
19.03.2016, 23:25
    #39196243
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить функцию в ядро fb3
Симонов Денис,

Надоело udr и udf таскать.
...
Рейтинг: 0 / 0
19.03.2016, 23:47
    #39196249
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить функцию в ядро fb3
__Avenger__Аналог в php similar_text?
similar to не аналог что ли?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.03.2016, 23:52
    #39196251
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить функцию в ядро fb3
Dimitry Sibiryakov,

судя по всему нет http://php.net/manual/ru/function.similar-text.php
...
Рейтинг: 0 / 0
19.03.2016, 23:54
    #39196252
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить функцию в ядро fb3
Dimitry Sibiryakov,

Нет, не аналог. similar_text возвращает релевантность двух строк по методу Ratcliff/Obershelp.
...
Рейтинг: 0 / 0
20.03.2016, 00:27
    #39196261
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить функцию в ядро fb3
Симонов Дениссудя по всему нет
Ну, тогда, после переезда на GitHub, всё стало гораздо проще: fork, implement, send pull
request, подождать пару-тройку лет - профит!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.03.2016, 04:15
    #39196292
fb user
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить функцию в ядро fb3
Симонов Денисзачем же сразу в ядро. Напиши свою UDR и всё.
Кстати сложно задекларировать udr-функцию чтобы она принимала любые строковые параметры.
Например хочется написать аналог REPLACE (str, find, repl). Как задекларировать такую функцию?
...
Рейтинг: 0 / 0
22.03.2016, 09:48
    #39197679
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить функцию в ядро fb3
Набросал функцию:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
const SysFunction SysFunction::functions[] =
		{"SIMILAR_TEXT", 1, 1, setParamsFromList, makeDoubleResult, evlSimilarText, NULL},
		
dsc* evlSimilarText(thread_db* tdbb, const SysFunction* function, const NestValueArray& args, impure_value* impure);

static inline size_t similar_str(const UChar *txt1, const size_t len1, const UChar *txt2, const size_t len2)
{
	size_t sum = 0, pos1 = 0, pos2 = 0, max = 0;
	UChar *p, *q;
	const UChar *end1 = (UChar *)txt1 + len1;
	const UChar *end2 = (UChar *)txt2 + len2;
	size_t l, l1, l2;
	UChar32 c1, c2;
	for (p = (UChar *)txt1; p < end1; p++) {
		for (q = (UChar *)txt2; q < end2; q++) {
			for (l = l1 = l2 = 0; (p + l1 < end1) && (q + l2 < end2);) {
				U16_NEXT(p, l1, len1, c1);
				U16_NEXT(q, l2, len2, c2);
				if (c1 == c2)
					l++;
				else
					break;
			}
			if (l > max) {
				max	= l;
				pos1 = p - txt1;
				pos2 = q - txt2;
			}
		}
	}
	if (max > 0) {
		sum = max;
		if ((pos1 + max < len1) && (pos2 + max < len2)) {
			sum += similar_str(txt1 + pos1 + max, len1 - pos1 - max,
							   txt2 + pos2 + max, len2 - pos2 - max);
		}
		if (pos1 && pos2) {
			sum += similar_str(txt1, pos1,
							   txt2, pos2);
		}
	}
	return sum;
}

dsc* evlSimilarText(thread_db* tdbb, const SysFunction* function, const NestValueArray& args,
	impure_value* impure)
{
	fb_assert(args.getCount() == 2);

	jrd_req* request = tdbb->getRequest();

	const dsc* str1 = EVL_expr(tdbb, request, args[0]);
	if (request->req_flags & req_null)	// return NULL if str1 is NULL
		return NULL;

	const dsc* str2 = EVL_expr(tdbb, request, args[1]);
	if (request->req_flags & req_null)	// return NULL if str2 is NULL
		return NULL;

	UCHAR* p1;
	MoveBuffer temp1;
	ULONG len1;
	len1 = MOV_make_string2(tdbb, str1, value->getCharSet(), &p1, temp1);

	UCHAR* p2;
	MoveBuffer temp2;
	ULONG len2;
	len2 = MOV_make_string2(tdbb, str2, value->getCharSet(), &p2, temp2);

	double rc;

	if (!len1 || !len2)
		rc = 0;
	else
		rc = similar_str(p1, len1, p2, len2) * 200.0 / (u_countChar32(p1, len1) + u_countChar32(p2, len2));

	impure->vlu_misc.vlu_double = rc;
	impure->vlu_desc.makeDouble(&impure->vlu_misc.vlu_double);

	return &impure->vlu_desc;
}



Где взять U16_NEXT, UChar32 и u_countChar32?
...
Рейтинг: 0 / 0
23.03.2016, 09:31
    #39198507
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить функцию в ядро fb3
Никто не знает?
...
Рейтинг: 0 / 0
23.03.2016, 09:34
    #39198510
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить функцию в ядро fb3
__Avenger__Никто не знает?
http://icu-project.org/apiref/icu4c/ustring_8h.html
...
Рейтинг: 0 / 0
23.03.2016, 09:36
    #39198512
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить функцию в ядро fb3
wadman__Avenger__Никто не знает?
http://icu-project.org/apiref/icu4c/ustring_8h.html

Это понятно, но интересует со стороны движка FB как это сделать правильно.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Добавить функцию в ядро fb3 / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]