Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit181ca96

Browse files
committed
August 6, 2002
1. Reworked patch from Andrey Oktyabrski (ano@spider.ru) with functions: icount, sort, sort_asc, uniq, idx, subarray operations: #, +, -, |, &FUNCTIONS: int icount(int[]) - the number of elements in intarray int[] sort(int[], 'asc' | 'desc') - sort intarray int[] sort(int[]) - sort in ascending order int[] sort_asc(int[]),sort_desc(int[]) - shortcuts for sort int[] uniq(int[]) - returns unique elements int idx(int[], int item) - returns index of first intarray matching element to item, or '0' if matching failed. int[] subarray(int[],int START [, int LEN]) - returns part of intarray starting from element number START (from 1) and length LEN.OPERATIONS: int[] && int[] - overlap - returns TRUE if arrays has at least one common elements. int[] @ int[] - contains - returns TRUE if left array contains right array int[] ~ int[] - contained - returns TRUE if left array is contained in right array # int[] - return the number of elements in array int[] + int - push element to array ( add to end of array) int[] + int[] - merge of arrays (right array added to the end of left one) int[] - int - remove entries matched by right argument from array int[] - int[] - remove left array from right int[] | int - returns intarray - union of arguments int[] | int[] - returns intarray as a union of two arrays int[] & int[] - returns intersection of arraysOleg Bartunov
1 parentc5354df commit181ca96

File tree

5 files changed

+572
-1
lines changed

5 files changed

+572
-1
lines changed

‎contrib/intarray/README.intarray

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,42 @@ signature with length of 4096 bits to represent sets).
88

99
All work was done by Teodor Sigaev (teodor@stack.net) and Oleg Bartunov
1010
(oleg@sai.msu.su). See http://www.sai.msu.su/~megera/postgres/gist
11-
for additional information.
11+
for additional information. Andrey Oktyabrski has done a great work on
12+
adding new functions and operations.
13+
14+
15+
FUNCTIONS:
16+
17+
int icount(int[]) - the number of elements in intarray
18+
int[] sort(int[], 'asc' | 'desc') - sort intarray
19+
int[] sort(int[]) - sort in ascending order
20+
int[] sort_asc(int[]),sort_desc(int[]) - shortcuts for sort
21+
int[] uniq(int[]) - returns unique elements
22+
int idx(int[], int item) - returns index of first intarray matching element to item, or
23+
'0' if matching failed.
24+
int[] subarray(int[],int START [, int LEN]) - returns part of intarray starting from
25+
element number START (from 1) and length LEN.
26+
27+
OPERATIONS:
28+
29+
int[] && int[] - overlap - returns TRUE if arrays has at least one common elements.
30+
int[] @ int[] - contains - returns TRUE if left array contains right array
31+
int[] ~ int[] - contained - returns TRUE if left array is contained in right array
32+
# int[] - return the number of elements in array
33+
int[] + int - push element to array ( add to end of array)
34+
int[] + int[] - merge of arrays (right array added to the end of left one)
35+
int[] - int - remove entries matched by right argument from array
36+
int[] - int[] - remove left array from right
37+
int[] | int - returns intarray - union of arguments
38+
int[] | int[] - returns intarray as a union of two arrays
39+
int[] & int[] - returns intersection of arrays
1240

1341
CHANGES:
1442

43+
August 6, 2002
44+
1. Reworked patch from Andrey Oktyabrski (ano@spider.ru) with
45+
functions: icount, sort, sort_asc, uniq, idx, subarray
46+
operations: #, +, -, |, &
1547
October 1, 2001
1648
1. Change search method in array to binary
1749
September 28, 2001

‎contrib/intarray/_int.c

Lines changed: 300 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2217,3 +2217,303 @@ querytree(PG_FUNCTION_ARGS) {
22172217

22182218
PG_RETURN_POINTER(res );
22192219
}
2220+
2221+
/*
2222+
** Additional array functions
2223+
*/
2224+
staticint32intarray_match_first(ArrayType*a,int32elem);
2225+
staticArrayType*intarray_add_elem(ArrayType*a,int32elem);
2226+
staticArrayType*intarray_concat_arrays(ArrayType*a,ArrayType*b);
2227+
staticArrayType*int_to_intset(int32elem);
2228+
2229+
PG_FUNCTION_INFO_V1(intset );
2230+
PG_FUNCTION_INFO_V1(icount );
2231+
PG_FUNCTION_INFO_V1(sort );
2232+
PG_FUNCTION_INFO_V1(sort_asc );
2233+
PG_FUNCTION_INFO_V1(sort_desc );
2234+
PG_FUNCTION_INFO_V1(uniq );
2235+
PG_FUNCTION_INFO_V1(idx );
2236+
PG_FUNCTION_INFO_V1(subarray );
2237+
PG_FUNCTION_INFO_V1(intarray_push_elem );
2238+
PG_FUNCTION_INFO_V1(intarray_push_array );
2239+
PG_FUNCTION_INFO_V1(intarray_del_elem );
2240+
PG_FUNCTION_INFO_V1(intset_union_elem );
2241+
PG_FUNCTION_INFO_V1(intset_subtract );
2242+
Datumintset(PG_FUNCTION_ARGS);
2243+
Datumicount(PG_FUNCTION_ARGS);
2244+
Datumsort(PG_FUNCTION_ARGS);
2245+
Datumsort_asc(PG_FUNCTION_ARGS);
2246+
Datumsort_desc(PG_FUNCTION_ARGS);
2247+
Datumuniq(PG_FUNCTION_ARGS);
2248+
Datumidx(PG_FUNCTION_ARGS);
2249+
Datumsubarray(PG_FUNCTION_ARGS);
2250+
Datumintarray_push_elem(PG_FUNCTION_ARGS);
2251+
Datumintarray_push_array(PG_FUNCTION_ARGS);
2252+
Datumintarray_del_elem(PG_FUNCTION_ARGS);
2253+
Datumintset_union_elem(PG_FUNCTION_ARGS);
2254+
Datumintset_subtract(PG_FUNCTION_ARGS);
2255+
2256+
staticint32
2257+
intarray_match_first(ArrayType*a,int32elem) {
2258+
int32*aa,c,i;
2259+
c= (ARRISVOID(a)) ?0 :ARRNELEMS(a);
2260+
aa=ARRPTR(a);
2261+
for (i=0;i<c;i++)
2262+
if (aa[i]==elem)return (i+1);
2263+
return0;
2264+
}
2265+
2266+
staticArrayType*
2267+
intarray_add_elem(ArrayType*a,int32elem) {
2268+
ArrayType*result;
2269+
int32*r;
2270+
int32c= (ARRISVOID(a)) ?0 :ARRNELEMS(a);
2271+
result=new_intArrayType(c+1);
2272+
r=ARRPTR(result);
2273+
if (c>0)memcpy(r,ARRPTR(a),c*sizeof(int32));
2274+
r[c]=elem;
2275+
returnresult;
2276+
}
2277+
2278+
staticArrayType*
2279+
intarray_concat_arrays(ArrayType*a,ArrayType*b) {
2280+
ArrayType*result;
2281+
int32ac= (ARRISVOID(a)) ?0 :ARRNELEMS(a);
2282+
int32bc= (ARRISVOID(b)) ?0 :ARRNELEMS(b);
2283+
result=new_intArrayType(ac+bc);
2284+
if (ac )
2285+
memcpy(ARRPTR(result),ARRPTR(a),ac*sizeof(int32));
2286+
if (bc )
2287+
memcpy(ARRPTR(result)+ac,ARRPTR(b),bc*sizeof(int32));
2288+
returnresult;
2289+
}
2290+
2291+
staticArrayType*
2292+
int_to_intset(int32n) {
2293+
ArrayType*result;
2294+
int32*aa;
2295+
result=new_intArrayType(1);
2296+
aa=ARRPTR(result);
2297+
aa[0]=n;
2298+
returnresult;
2299+
}
2300+
2301+
staticint
2302+
compASC(constvoid*a,constvoid*b) {
2303+
if (*(int4*)a==*(int4*)b )return0;
2304+
return (*(int4*)a>*(int4*)b ) ?1 :-1;
2305+
}
2306+
2307+
staticint
2308+
compDESC(constvoid*a,constvoid*b) {
2309+
if (*(int4*)a==*(int4*)b )return0;
2310+
return (*(int4*)a<*(int4*)b ) ?1 :-1;
2311+
}
2312+
2313+
#defineQSORT(a,direction) \
2314+
if (ARRNELEMS(a) > 1)\
2315+
qsort((void*)ARRPTR(a), ARRNELEMS(a),sizeof(int4), \
2316+
(direction) ? compASC : compDESC )
2317+
2318+
#defineUNIX_UNIQ(a) a = resize_intArrayType(a, unix_uniq(ARRPTR(a), ARRNELEMS(a)))
2319+
2320+
staticint32
2321+
unix_uniq(int32*array,int32count) {
2322+
registerint32i,k=0;
2323+
for (i=1;i<count;i++)
2324+
if (array[k]!=array[i]) {
2325+
k++;
2326+
if (i>k)array[k]=array[i];
2327+
}
2328+
return (k+1);
2329+
}
2330+
2331+
Datum
2332+
intset(PG_FUNCTION_ARGS) {
2333+
PG_RETURN_POINTER(int_to_intset(PG_GETARG_INT32(0)));
2334+
}
2335+
2336+
Datum
2337+
icount(PG_FUNCTION_ARGS) {
2338+
ArrayType*a= (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0)));
2339+
int32count= (ARRISVOID(a)) ?0 :ARRNELEMS(a);
2340+
PG_FREE_IF_COPY(a,0);
2341+
PG_RETURN_INT32(count);
2342+
}
2343+
2344+
Datum
2345+
sort(PG_FUNCTION_ARGS) {
2346+
ArrayType*a= (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0)));
2347+
text*dirstr= (fcinfo->nargs==2 ) ?PG_GETARG_TEXT_P(1) :NULL;
2348+
int32dc= (dirstr ) ?VARSIZE(dirstr)-VARHDRSZ :0;
2349+
char*d= (dirstr ) ?VARDATA(dirstr) :NULL;
2350+
intdir=-1;
2351+
if (ARRISVOID(a)||ARRNELEMS(a)<2)PG_RETURN_POINTER(a);
2352+
2353+
if (dirstr==NULL|| (dc==3
2354+
&& (d[0]=='A'||d[0]=='a')
2355+
&& (d[1]=='S'||d[1]=='s')
2356+
&& (d[2]=='C'||d[2]=='c')))
2357+
dir=1;
2358+
elseif (dc==4
2359+
&& (d[0]=='D'||d[0]=='d')
2360+
&& (d[1]=='E'||d[1]=='e')
2361+
&& (d[2]=='S'||d[2]=='s')
2362+
&& (d[3]=='C'||d[3]=='c'))
2363+
dir=0;
2364+
if (dir==-1)
2365+
elog(ERROR,"Invalid second parameter in function sort. It must be 'ASC' or 'DESC'.");
2366+
QSORT(a,dir);
2367+
PG_RETURN_POINTER(a);
2368+
}
2369+
2370+
Datum
2371+
sort_asc(PG_FUNCTION_ARGS) {
2372+
ArrayType*a= (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0)));
2373+
if (ARRISVOID(a))PG_RETURN_POINTER(a);
2374+
QSORT(a,1);
2375+
PG_RETURN_POINTER(a);
2376+
}
2377+
2378+
Datum
2379+
sort_desc(PG_FUNCTION_ARGS) {
2380+
ArrayType*a= (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0)));
2381+
if (ARRISVOID(a))PG_RETURN_POINTER(a);
2382+
QSORT(a,0);
2383+
PG_RETURN_POINTER(a);
2384+
}
2385+
2386+
Datum
2387+
uniq(PG_FUNCTION_ARGS) {
2388+
ArrayType*a= (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0)));
2389+
if (ARRISVOID(a)||ARRNELEMS(a)<2)PG_RETURN_POINTER(a);
2390+
UNIX_UNIQ(a);
2391+
PG_RETURN_POINTER(a);
2392+
}
2393+
2394+
Datum
2395+
idx(PG_FUNCTION_ARGS) {
2396+
ArrayType*a= (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0)));
2397+
int32result= (ARRISVOID(a)) ?0 :ARRNELEMS(a);
2398+
if (result)result=intarray_match_first(a,PG_GETARG_INT32(1));
2399+
PG_FREE_IF_COPY(a,0);
2400+
PG_RETURN_INT32(result);
2401+
}
2402+
2403+
Datum
2404+
subarray(PG_FUNCTION_ARGS) {
2405+
ArrayType*a= (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0)));
2406+
ArrayType*result;
2407+
int32start= (PG_GETARG_INT32(1)>0 ) ?PG_GETARG_INT32(1)-1 :PG_GETARG_INT32(1);
2408+
int32len= (fcinfo->nargs==3 ) ?PG_GETARG_INT32(2) :0;
2409+
int32end=0;
2410+
int32c;
2411+
2412+
if (ARRISVOID(a) ) {
2413+
PG_FREE_IF_COPY(a,0);
2414+
PG_RETURN_POINTER(new_intArrayType(0) );
2415+
}
2416+
2417+
c=ARRNELEMS(a);
2418+
2419+
if (start<0 )
2420+
start=c+start;
2421+
2422+
if (len<0 )
2423+
end=c+len;
2424+
elseif (len==0 )
2425+
end=c;
2426+
else
2427+
end=start+len;
2428+
2429+
if (end>c )
2430+
end=c;
2431+
2432+
if (start<0 )
2433+
start=0;
2434+
2435+
if (start >=end||end <=0 ) {
2436+
PG_FREE_IF_COPY(a,0);
2437+
PG_RETURN_POINTER(new_intArrayType(0) );
2438+
}
2439+
2440+
2441+
result=new_intArrayType(end-start);
2442+
if (end-start>0)
2443+
memcpy(ARRPTR(result),ARRPTR(a)+start, (end-start)*sizeof(int32));
2444+
PG_FREE_IF_COPY(a,0);
2445+
PG_RETURN_POINTER(result);
2446+
}
2447+
2448+
Datum
2449+
intarray_push_elem(PG_FUNCTION_ARGS) {
2450+
ArrayType*a= (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0)));
2451+
ArrayType*result;
2452+
result=intarray_add_elem(a,PG_GETARG_INT32(1));
2453+
PG_FREE_IF_COPY(a,0);
2454+
PG_RETURN_POINTER(result);
2455+
}
2456+
2457+
Datum
2458+
intarray_push_array(PG_FUNCTION_ARGS) {
2459+
ArrayType*a= (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0)));
2460+
ArrayType*b= (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(1)));
2461+
ArrayType*result;
2462+
result=intarray_concat_arrays(a,b);
2463+
PG_FREE_IF_COPY(a,0);
2464+
PG_FREE_IF_COPY(b,1);
2465+
PG_RETURN_POINTER(result);
2466+
}
2467+
2468+
Datum
2469+
intarray_del_elem(PG_FUNCTION_ARGS) {
2470+
ArrayType*a= (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0)));
2471+
int32c= (ARRISVOID(a)) ?0 :ARRNELEMS(a);
2472+
int32*aa=ARRPTR(a);
2473+
int32n=0,i;
2474+
int32elem=PG_GETARG_INT32(1);
2475+
for (i=0;i<c;i++)
2476+
if (aa[i]!=elem) {
2477+
if (i>n)aa[n++]=aa[i];
2478+
elsen++;
2479+
}
2480+
if (c>0)a=resize_intArrayType(a,n);
2481+
PG_RETURN_POINTER(a);
2482+
}
2483+
2484+
Datum
2485+
intset_union_elem(PG_FUNCTION_ARGS) {
2486+
ArrayType*a= (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0)));
2487+
ArrayType*result;
2488+
result=intarray_add_elem(a,PG_GETARG_INT32(1));
2489+
PG_FREE_IF_COPY(a,0);
2490+
QSORT(result,1);
2491+
UNIX_UNIQ(result);
2492+
PG_RETURN_POINTER(result);
2493+
}
2494+
2495+
Datum
2496+
intset_subtract(PG_FUNCTION_ARGS) {
2497+
ArrayType*a= (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0)));
2498+
ArrayType*b= (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(1)));
2499+
ArrayType*result;
2500+
int32ca=ARRISVOID(a);
2501+
int32cb=ARRISVOID(b);
2502+
int32*aa,*bb,*r;
2503+
int32n=0,i=0,k=0;
2504+
QSORT(a,1);UNIX_UNIQ(a);ca=ARRNELEMS(a);
2505+
QSORT(b,1);UNIX_UNIQ(b);cb=ARRNELEMS(b);
2506+
result=new_intArrayType(ca);
2507+
aa=ARRPTR(a);
2508+
bb=ARRPTR(b);
2509+
r=ARRPTR(result);
2510+
while (i<ca) {
2511+
if (k==cb||aa[i]<bb[k])r[n++]=aa[i++];
2512+
elseif (aa[i]==bb[k]) {i++;k++; }
2513+
elsek++;
2514+
}
2515+
result=resize_intArrayType(result,n);
2516+
pfree(a);pfree(b);
2517+
PG_RETURN_POINTER(result);
2518+
}
2519+

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp