TreeSet.st
author Claus Gittinger <cg@exept.de>
Sat, 02 May 2020 21:40:13 +0200
changeset 5476 7355a4b11cb6
parent 4269 c5eb06e78a7d
permissions -rw-r--r--
#FEATURE by cg class: Socket class added: #newTCPclientToHost:port:domain:domainOrder:withTimeout: changed: #newTCPclientToHost:port:domain:withTimeout:
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
"
4122
d868c6e94d96 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3712
diff changeset
    16
    BTree and TSTree
d868c6e94d96 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3712
diff changeset
    17
4211
4881ec8d1572 #OTHER by mawalch
mawalch
parents: 4122
diff changeset
    18
    A bunch of collection classes that are useful for building large indices of things.
4881ec8d1572 #OTHER by mawalch
mawalch
parents: 4122
diff changeset
    19
    It's especially geared towards people using OODBs like GOODS, but can be used it in the image too:
4881ec8d1572 #OTHER by mawalch
mawalch
parents: 4122
diff changeset
    20
    the BTree class is great for when you need to select numeric keys by range,
4881ec8d1572 #OTHER by mawalch
mawalch
parents: 4122
diff changeset
    21
    and TSTree makes a solid basis for full-text search.
4881ec8d1572 #OTHER by mawalch
mawalch
parents: 4122
diff changeset
    22
    TreeSet has an interesting optimized #intersection: that lets you compare two collections without
4881ec8d1572 #OTHER by mawalch
mawalch
parents: 4122
diff changeset
    23
    looking at every item of either.
4881ec8d1572 #OTHER by mawalch
mawalch
parents: 4122
diff changeset
    24
    I'm also going to be rolling some code in here from Benjamin Pollack specifically aimed at indexing
4881ec8d1572 #OTHER by mawalch
mawalch
parents: 4122
diff changeset
    25
    by date ranges, which lets you do quick queries of all the events that overlap with a specific week,
4881ec8d1572 #OTHER by mawalch
mawalch
parents: 4122
diff changeset
    26
    for instance.
2283
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
    [author:]
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
        Avi Bryant
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
    [license:]
4211
4881ec8d1572 #OTHER by mawalch
mawalch
parents: 4122
diff changeset
    32
        Dual licensed under both SqueakL and MIT.
2283
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
        This enables both base Squeak inclusion and 100% reuse.
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
"
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
! !
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
4211
4881ec8d1572 #OTHER by mawalch
mawalch
parents: 4122
diff changeset
    37
!TreeSet class methodsFor:'instance creation'!
2283
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
keys: aBtreeKeys sortSelector: aSymbol
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
	^ self basicNew initializeWithKeys: aBtreeKeys sortSelector: aSymbol
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
new
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
	^ self sortBy: #hash
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
sortBy: aSymbol
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
	^ self keys: (BTreeKeysArray new: 64) sortSelector: aSymbol
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
! !
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
!TreeSet methodsFor:'initialize-release'!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
initializeWithKeys: aBtreeKeys sortSelector: aSymbol
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
	tree _ BTree keys: aBtreeKeys.
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
	sortKey _ aSymbol
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
! !
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
!TreeSet methodsFor:'plugs'!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
keyForValue: anObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
	^ anObject perform: sortKey
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
value: anObject matches: otherObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
	^ anObject = otherObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
! !
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
!TreeSet methodsFor:'private'!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
bucket: anArray includes: anObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
	^ anArray anySatisfy: [:ea | (self value: anObject matches: ea)]
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
tree
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
	^ tree
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
! !
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
!TreeSet methodsFor:'public'!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
add: anObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
	| key bucket |
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
	key _ self keyForValue: anObject.
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
	bucket _ tree at: key ifAbsent: [#()].
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
	(self bucket: bucket includes: anObject) ifFalse:
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
		[tree at: key put: (bucket copyWith: anObject)].
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
do: aBlock
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
	tree do: [:bucket | bucket do: aBlock]
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
includes: anObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
	| bucket |
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
	bucket _  tree at: (self keyForValue: anObject) ifAbsent: [^ false].
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
	^ self bucket: bucket includes: anObject
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
4269
c5eb06e78a7d #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4211
diff changeset
    98
intersect:aCollection 
c5eb06e78a7d #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4211
diff changeset
    99
    aCollection species ~~ self species ifTrue:[
c5eb06e78a7d #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4211
diff changeset
   100
        ^ super intersect:aCollection
c5eb06e78a7d #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4211
diff changeset
   101
    ].
c5eb06e78a7d #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4211
diff changeset
   102
    aCollection sortSelector ~= self sortSelector ifTrue:[
c5eb06e78a7d #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4211
diff changeset
   103
        ^ super intersect:aCollection
c5eb06e78a7d #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4211
diff changeset
   104
    ].
c5eb06e78a7d #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4211
diff changeset
   105
    ^ Array 
c5eb06e78a7d #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4211
diff changeset
   106
        streamContents:[:s | 
c5eb06e78a7d #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4211
diff changeset
   107
            tree commonKeysWith:aCollection tree
c5eb06e78a7d #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4211
diff changeset
   108
                keysAndValuesDo:[:key :left :right | s nextPutAll:(left intersect:right)]
c5eb06e78a7d #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4211
diff changeset
   109
        ]
c5eb06e78a7d #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4211
diff changeset
   110
c5eb06e78a7d #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4211
diff changeset
   111
    "Created: / 20-01-2017 / 19:23:01 / stefan"
2283
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
remove: anObject
3712
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   115
    "remove all occurrences of anObject
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   116
     Warning:
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   117
        This is inconsistent with the inherited collection>>remove:,
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   118
        which only remove the first occurrence.
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   119
        Should this be fixed?"
4211
4881ec8d1572 #OTHER by mawalch
mawalch
parents: 4122
diff changeset
   120
3712
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   121
    | key bucket |
4211
4881ec8d1572 #OTHER by mawalch
mawalch
parents: 4122
diff changeset
   122
3712
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   123
    key := self keyForValue: anObject.
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   124
    bucket := tree at: key ifAbsent: [^ self].
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   125
    (self bucket: bucket includes: anObject) ifTrue:[
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   126
        "/ cg: wrong code here: removes all, not only the first match
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   127
        bucket := bucket reject: [:ea | self value: anObject matches: ea].
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   128
        bucket isEmpty
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   129
                ifTrue: [tree removeKey: key]
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   130
                ifFalse: [tree at: key put: bucket]
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   131
    ]
2283
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
sortSelector
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
	^ sortKey
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
! !
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
3011
ff9d57003145 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2767
diff changeset
   138
!TreeSet methodsFor:'testing'!
ff9d57003145 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2767
diff changeset
   139
ff9d57003145 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2767
diff changeset
   140
isFixedSize
ff9d57003145 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2767
diff changeset
   141
    "return true if the receiver cannot grow"
ff9d57003145 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2767
diff changeset
   142
ff9d57003145 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2767
diff changeset
   143
    ^ false
ff9d57003145 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2767
diff changeset
   144
! !
ff9d57003145 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2767
diff changeset
   145
2283
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
!TreeSet class methodsFor:'documentation'!
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
version_CVS
3712
7f02da6caef2 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 3011
diff changeset
   149
    ^ '$Header$'
2283
b741134fee4b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
! !
3011
ff9d57003145 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2767
diff changeset
   151