Rambler's Top100

(c)2009-2017 openinfotech.ru

СУБД HyTech

Документация
Функция htGroupByUser

htGroupByUser - Пользовательская обработка групп на подмножестве записей

Назначение:

Функция предназначена для обсчета заданных полей на некотором множестве записей с группировкой по нескольким полям. Отличается от описанной выше функции более полным контролем пользователя над процессом построения групп и их обработки.

Общий порядок выполнения операции таков:

  • начитываются значения полей, образующих группу (их номера заданы как массив fpnGroup, размерностью nGroupCnt), из записей заданного подмножества; образуется матрица значений, каждая строка которой состоит из нескольких столбцов - значений заданных полей, выбранных из очередной записи подмножества;
  • начитанная матрица значений сортируется, при этом сравнение строк матрицы производится либо столбец за столбцом по их типу, либо функцией пользователя;
  • выполняется разбиение строк матрицы на группы следующим образом:
    • первая строка матрицы считается первым элементом группы;
    • следующая строка матрицы сравнивается с текущим элементом группы (т.е. первой строкой); сравнение выполняется либо побайтовым сравнением строк, либо вызовом пользовательской функции;
    • если строки равны (в точности или с точки зрения пользователя) очередная строка рассмативается как относящаяся к текущему элементу группы и ведется обсчет ее функционалов;
    • если строки матрицы отличаются друг от друга, элемент группы считается сформированным, выполняется его окончательный обсчет (например, подсчет среднего значения) и вызывается функция фильтрации, по результатам которой элемент отбрасывается или выводится в результат; начинается формирование нового элемента группы, за который принимается новая, отличная от предыдущих, строка матрицы.

Пользователь может определить функцию сравнения элементов (fpfSort) и, тем самым, контролировать сортировку полей, отбираемых в качестве полей группы. Обычно поля, образующие группу, сортируются слева направо, в соответствии с их типом. Порядок сортировки (по возрастанию или убыванию) определяется знаком у номера поля (положительный - по возрастанию, отрицательный - по убыванию).

Функция-параметр fpfSort может задать другое правило ранжирования полей, образующих группу, в результате чего массив значений полей будет отсортирован требуемым образом. Кроме того, пользователь может определить функцию, регулирующую процесс определения элементов группы. Обычно в качестве элемента группы рассматривается подмножество записей, имеющих одинаковые значения заданных полей. Стоит только одному из значений полей измениться, считается что начался новый элемент группы, но сначала выполняется обсчет сформированного ранее элемента группы и вызов функции fpfHavingTo.

Функция-параметр fpfDiff может определить другое правило составления элементов группы. Если она вернет 0, считается что заданные значения полей относятся к одному элементу группы, иначе - начался новый элемент группы. Обе функции fpfSort и fpfDiff будут получать в качестве параметров адреса двух сравниваемых областей памяти, содержащих значения полей, образующих группу. Третьим параметром будет передаваться пользовательский параметр.

Прототип:

int HTAPI htGroupByUser(
	LPSAB		fpDst, 		/* Для приема результата */
	LPSAB		fpSrc, 		/* БДС, задающий подмножество записей */
	int far 	*fpnGroup, 	/* Номера полей, образующих группу */
	int 		nGroupCnt, 	/* Число таких полей (до MAX_SORT_ORDER+1) */
	LPGROUP 	fpsFunc, 	/* Описатели вычислимых выражений */
	int 		nFuncCnt, 	/* Их число */
	LPOFUNC	 	fpSort,		/* Функция сравнения для сортировки */
	LPOFUNC	 	fpDiff,		/* Функция сравнения для группировки */
	LPHAVING 	fpfHavingTo, 	/* Функция, реализующая условие HavingTo */
	void far 	*fpUser		/* Пользовательский параметр */
);

Параметры

fpDst
задает адрес БДС, предназначенного для приема результата
fpSrc
задает адрес БДС, определяющего обрабатываемое множество записей
fpnGroup
задает адрес массива целых, содержащих порядковые номера полей, образующих группу. Группировка записей множества будет выполняться по полям группы. В качестве группы будет рассматриваться подмножество записей, имеющих одинаковые значения заданных полей. По сути дела, будет выполнена сортировка записей по значениям полей группы, поэтому номера полей можно задавать как отрицательные числа: сортировка по этим полям будет выполнена в порядке убывания. Длина полей, составляющих группу, не должна превышать MAX_SORT_LEN байтов
nGroupCnt
определяет число полей, входящих в группу. Число полей, образующих группу не должно превышать MAX_SORT_ORDER+1.
fpsFunc
задает адрес массива структур, описывающих функции, выполняемые для элементов группы. Структура имеет тип GROUP
nFuncCnt
определяет число вычисляемых выражений
fpSort
Функция сравнения для сортировки. Функция должна иметь прототип OFUNC. Если задан NULL - сортировка определяется типом полей группы
fpDiff
Функция сравнения для группировки. . Функция должна иметь прототип OFUNC. Если задан NULL - то сравнение осуществляется функцией memcmp
fpfHavingTo
задает адрес пользовательской функции фильтрации групп. Функция будет вызываться для каждого нового значения группы. Эта функция имеет прототип HAVING Если такая фильтрация не нужна, следует задать NULL
fpUser
параметр - необязательный. Задает адрес дополнительного параметра, передаваемого в пользовательскую функцию фильтрации

Результат:

0 при успешном завершении
отрицательное число код ошибки