TreeSet.st
author Claus Gittinger <cg@exept.de>
Thu, 09 Jun 2016 12:33:06 +0200
changeset 3897 b3b62b67d0a7
parent 3712 7f02da6caef2
child 4122 d868c6e94d96
permissions -rw-r--r--
removed container
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
3712
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
     3
"{ NameSpace: Smalltalk }"
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
     4
2283
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
Collection subclass:#TreeSet
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	instanceVariableNames:'tree sortKey'
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	classVariableNames:''
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
	poolDictionaries:''
2767
155fe0112f21 category changes
Claus Gittinger <cg@exept.de>
parents: 2283
diff changeset
     9
	category:'Collections-Ordered-Trees'
2283
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
!TreeSet class methodsFor:'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
documentation
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
"
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
    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
    17
    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
    18
    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
    19
    and TSTree makes a solid basis for full-text search. 
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
    TreeSet has an interesting optimized #intersection: that lets you compare two collections without 
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
    looking at every item of either. 
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
    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
    23
    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
    24
    for instance. 
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
    [author:]
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
        Avi Bryant
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
    [license:]
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
        Dual licensed under both SqueakL and MIT. 
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
        This enables both base Squeak inclusion and 100% reuse.
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
"
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
! !
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
!TreeSet class methodsFor:'as yet unclassified'!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
keys: aBtreeKeys sortSelector: aSymbol
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
	^ self basicNew initializeWithKeys: aBtreeKeys sortSelector: aSymbol
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
new
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
	^ self sortBy: #hash
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
sortBy: aSymbol
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
	^ self keys: (BTreeKeysArray new: 64) sortSelector: aSymbol
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
! !
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
!TreeSet methodsFor:'initialize-release'!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
initializeWithKeys: aBtreeKeys sortSelector: aSymbol
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
	tree _ BTree keys: aBtreeKeys.
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
	sortKey _ aSymbol
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
! !
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
!TreeSet methodsFor:'plugs'!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
keyForValue: anObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
	^ anObject perform: sortKey
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
value: anObject matches: otherObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
	^ anObject = otherObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
! !
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
!TreeSet methodsFor:'private'!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
bucket: anArray includes: anObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
	^ anArray anySatisfy: [:ea | (self value: anObject matches: ea)]
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
tree
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
	^ tree
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
! !
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
!TreeSet methodsFor:'public'!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
add: anObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
	| key bucket |
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
	key _ self keyForValue: anObject.
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
	bucket _ tree at: key ifAbsent: [#()].
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
	(self bucket: bucket includes: anObject) ifFalse:
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
		[tree at: key put: (bucket copyWith: anObject)].
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
do: aBlock
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
	tree do: [:bucket | bucket do: aBlock]
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
includes: anObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
	| bucket |
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
	bucket _  tree at: (self keyForValue: anObject) ifAbsent: [^ false].
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
	^ self bucket: bucket includes: anObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
intersection: aCollection
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
	aCollection species = self species ifFalse: [^ super intersection: aCollection].
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
	aCollection sortSelector = self sortSelector ifFalse: [^ super intersection: aCollection].
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
	
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
	^ Array streamContents:
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
		[:s |
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
		tree commonKeysWith: aCollection tree keysAndValuesDo:
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
			[:key :left :right |
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
			s nextPutAll: (left intersection: right)]]
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
remove: anObject
3712
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   108
    "remove all occurrences of anObject
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   109
     Warning:
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   110
        This is inconsistent with the inherited collection>>remove:,
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   111
        which only remove the first occurrence.
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   112
        Should this be fixed?"
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   113
    
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   114
    | key bucket |
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   115
    
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   116
    key := self keyForValue: anObject.
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   117
    bucket := tree at: key ifAbsent: [^ self].
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   118
    (self bucket: bucket includes: anObject) ifTrue:[
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   119
        "/ cg: wrong code here: removes all, not only the first match
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   120
        bucket := bucket reject: [:ea | self value: anObject matches: ea].
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   121
        bucket isEmpty
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   122
                ifTrue: [tree removeKey: key]
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   123
                ifFalse: [tree at: key put: bucket]
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   124
    ]
2283
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
sortSelector
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
	^ sortKey
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
! !
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
3011
ff9d57003145 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2767
diff changeset
   131
!TreeSet methodsFor:'testing'!
ff9d57003145 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2767
diff changeset
   132
ff9d57003145 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2767
diff changeset
   133
isFixedSize
ff9d57003145 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2767
diff changeset
   134
    "return true if the receiver cannot grow"
ff9d57003145 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2767
diff changeset
   135
ff9d57003145 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2767
diff changeset
   136
    ^ false
ff9d57003145 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2767
diff changeset
   137
! !
ff9d57003145 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2767
diff changeset
   138
2283
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
!TreeSet class methodsFor:'documentation'!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
version_CVS
3712
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   142
    ^ '$Header$'
2283
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
! !
3011
ff9d57003145 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2767
diff changeset
   144