-
Notifications
You must be signed in to change notification settings - Fork 6
/
limit.coffee
48 lines (39 loc) · 1.51 KB
/
limit.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#= require ./relation
class Monarch.Relations.Limit extends Monarch.Relations.Relation
@deriveEquality('operand', 'count')
constructor: (@operand, @count) ->
@orderByExpressions = operand.orderByExpressions
_all: ->
@operand.all()[0...@count]
_activate: ->
@operand.activate()
super
@subscribe @operand, 'onInsert', (tuple, index, newKey, oldKey) ->
if index < @count
oldLastTuple = @at(@count - 1)
@remove(oldLastTuple) if oldLastTuple
@insert(tuple, newKey, oldKey)
@subscribe @operand, 'onUpdate', (tuple, changeset, newIndex, oldIndex, newKey, oldKey) ->
if oldIndex < @count
if newIndex < @count
@tupleUpdated(tuple, changeset, newKey, oldKey)
else
@remove(tuple, newKey, oldKey, changeset)
newLastTuple = @operand.at(@count - 1)
@insert(newLastTuple) if newLastTuple
else
if newIndex < @count
oldLastTuple = @at(@count - 1)
@remove(oldLastTuple) if oldLastTuple
@insert(tuple, newKey, oldKey)
@subscribe @operand, 'onRemove', (tuple, index, newKey, oldKey) ->
@remove(tuple, newKey, oldKey)
newLastTuple = @operand.at(@count - 1)
@insert(newLastTuple) if newLastTuple
wireRepresentation: ->
type: 'Limit'
operand: @operand.wireRepresentation()
count: @count
getColumn: (args...) -> @operand.getColumn(args...)
inferJoinColumns: (args...) -> @operand.inferJoinColumns(args...)
columns: (args...) -> @operand.columns(args...)