Viewing contents of file '../idllib/astron/pro/dbsort.pro'
function dbsort,list,items,REVERSE = rev
;+
; NAME:
;	DBSORT
; PURPOSE:
;	Routine to sort list of entries in data base
;
; CALLING SEQUENCE: 
;	result = dbsort( list, items , [ REVERSE = ])
;
; INPUTS:
;	list - list of entry numbers to sort
;		-1 to sort all entries
;	items - list of items to sort (up to 9 items)
;
; OUTPUT:
;	result - numeric vector giving input list sorted by items
;
; OPTIONAL KEYWORD INPUT:
;	REVERSE - scalar or vector with the same number of elements as the
;	  the number of items to sort.  If the corresponding element of REVERSE 
;	  is non-zero then that item is sorted in descending rather than 
;	  ascending order.
;
; EXAMPLE:
;	Sort an astronomical catalog with RA as primary sort, and declination
;	as secondary sort (used when RA values are equal)
;
;	   IDL> NEWLIST = DBSORT( -1, 'RA,DEC' )
;
;	If for some reason, one wanted the DEC sorted in descending order, but
;	the RA in ascending order
;
;	   IDL> NEWLIST = DBSORT( -1, 'RA,DEC', REV = [ 0, 1 ] )
;
; METHOD:
;	The list is sorted such that each item is sorted into
;	asscending order starting with the last item.
; COMMON BLOCKS:
;	DBCOM
; PROCEDURES USED:
;	ZPARCHECK, BSORT, DB_ITEM
; HISTORY
;	VERSION 1  D. Lindler  Oct. 86
;       Added REVERSE keyword   W. Landsman        August, 1991
;	Converted to IDL V5.0   W. Landsman   September 1997
;-
 if N_params() LT 2 then begin
     print,'Syntax: newlist = dbsort( list, items, [ REVERSE = ] )'
     return, -1
 endif
;---------------------------------------------------------
; data base common block, see DBOPEN for meanings

 common db_com,QDB,QITEMS,QLINK

; check parameters

 zparcheck, 'DBSORT', list, 1, [1,2,3], [0,1], 'entry list'
 zparcheck, 'DBSORT', items, 2, [1,2,3,7], [0,1], 'item list'

; extract values of items

 db_item, items, it
 nitems = N_elements(it)                    ;Number of items
 if nitems GT 9 then message, $
	'ERROR -  Can only sort on nine items or less'

                                            ;Verify REVERSE vector
 if not keyword_set(REV) then rev = bytarr(nitems) else $
         if N_elements(rev) NE nitems then $
             message,'ERROR - REVERSE vector must contain ' + $
                   strtrim(nitems,2) + ' elements'

; make list vector

 qnentry = long(qdb,84)
 if list[0] EQ -1 then vlist = lindgen(qnentry)+1 else vlist = list

; create line to execute in the form:
;	dbext, vlist, it, v1,v2,...,v(nitems)
 case nitems of 
	1: dbext, vlist, it, v1
	2: dbext, vlist, it, v1, v2
	3: dbext, vlist, it, v1, v2, v3
	4: dbext, vlist, it, v1, v2, v3, v4
	5: dbext, vlist, it, v1, v2, v3, v4, v5
	6: dbext, vlist, it, v1, v2, v3, v4, v5, v6
	7: dbext, vlist, it, v1, v2, v3, v4, v5, v6, v7
	8: dbext, vlist, it, v1, v2, v3, v4, v5, v6, v7, v8
	9: dbext, vlist, it, v1, v2, v3, v4, v5, v6, v7, v8, v9
 endcase

; sort on each item

 sub = lindgen(N_elements(vlist))		;list of subscripts
 for i = 0,nitems-1 do begin

; get item

	j = nitems-i
	st = 'v=v' + strtrim(j,2)
	status = execute(st)

; perform previous sorts on item

	v = v[sub]

; sort item

	sortsub = bsort( v, REVERSE = rev[j-1] )

; sort sub array

	sub = sub[sortsub]
 end

; return sorted list

 return, vlist[sub]
 end