TreeSet.st
author Claus Gittinger <cg@exept.de>
Wed, 30 Sep 2009 15:38:40 +0200
changeset 2283 b741134fee4b
child 2767 155fe0112f21
permissions -rw-r--r--
initial checkin
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2283
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:libbasic2' }"
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
Collection subclass:#TreeSet
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
	instanceVariableNames:'tree sortKey'
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
	classVariableNames:''
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	poolDictionaries:''
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	category:'Collections-Ordered'
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
!TreeSet class methodsFor:'documentation'!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
documentation
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
"
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
    A bunch of collection classes that are useful for building large indices of things. 
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
    It's especially geared towards people using OODBs like GOODS, but can be used it in the image too: 
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
    the BTree class is great for when you need to select numeric keys by range, 
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
    and TSTree makes a solid basis for full-text search. 
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
    TreeSet has an interesting optimized #intersection: that lets you compare two collections without 
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
    looking at every item of either. 
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
    I'm also going to be rolling some code in here from Benjamin Pollack specifically aimed at indexing 
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
    by date ranges, which lets you do quick queries of all the events that overlap with a specific week, 
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
    for instance. 
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
    [author:]
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
        Avi Bryant
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
    [license:]
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
        Dual licensed under both SqueakL and MIT. 
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
        This enables both base Squeak inclusion and 100% reuse.
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
"
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
! !
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
!TreeSet class methodsFor:'as yet unclassified'!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
keys: aBtreeKeys sortSelector: aSymbol
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
	^ self basicNew initializeWithKeys: aBtreeKeys sortSelector: aSymbol
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
new
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
	^ self sortBy: #hash
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
sortBy: aSymbol
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
	^ self keys: (BTreeKeysArray new: 64) sortSelector: aSymbol
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
! !
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
!TreeSet methodsFor:'initialize-release'!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
initializeWithKeys: aBtreeKeys sortSelector: aSymbol
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
	tree _ BTree keys: aBtreeKeys.
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
	sortKey _ aSymbol
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
! !
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
!TreeSet methodsFor:'plugs'!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
keyForValue: anObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
	^ anObject perform: sortKey
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
value: anObject matches: otherObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
	^ anObject = otherObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
! !
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
!TreeSet methodsFor:'private'!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
bucket: anArray includes: anObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
	^ anArray anySatisfy: [:ea | (self value: anObject matches: ea)]
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
tree
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
	^ tree
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
! !
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
!TreeSet methodsFor:'public'!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
add: anObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
	| key bucket |
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
	key _ self keyForValue: anObject.
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
	bucket _ tree at: key ifAbsent: [#()].
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
	(self bucket: bucket includes: anObject) ifFalse:
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
		[tree at: key put: (bucket copyWith: anObject)].
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
do: aBlock
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
	tree do: [:bucket | bucket do: aBlock]
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
includes: anObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
	| bucket |
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
	bucket _  tree at: (self keyForValue: anObject) ifAbsent: [^ false].
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
	^ self bucket: bucket includes: anObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
intersection: aCollection
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
	aCollection species = self species ifFalse: [^ super intersection: aCollection].
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
	aCollection sortSelector = self sortSelector ifFalse: [^ super intersection: aCollection].
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
	
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
	^ Array streamContents:
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
		[:s |
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
		tree commonKeysWith: aCollection tree keysAndValuesDo:
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
			[:key :left :right |
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
			s nextPutAll: (left intersection: right)]]
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
remove: anObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
	| key bucket |
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
	key _ self keyForValue: anObject.
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
	bucket _ tree at: key ifAbsent: [^ self].
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
	(self bucket: bucket includes: anObject) ifTrue:
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
		[bucket _ bucket reject: [:ea | self value: anObject matches: ea].
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
		bucket isEmpty
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
			ifTrue: [tree removeKey: key]
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
			ifFalse: [tree at: key put: bucket]]
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
sortSelector
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
	^ sortKey
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
! !
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
!TreeSet class methodsFor:'documentation'!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
version_CVS
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
    ^ '$Header: /cvs/stx/stx/libbasic2/TreeSet.st,v 1.1 2009-09-30 13:38:40 cg Exp $'
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
! !