Class: Libcouchbase::ResultsFiber

Inherits:
Results
  • Object
show all
Defined in:
lib/libcouchbase/results_fiber.rb

Direct Known Subclasses

ResultsEM, ResultsLibuv

Instance Attribute Summary

Attributes inherited from Results

#complete_result_set, #metadata, #query_completed, #query_in_progress

Instance Method Summary collapse

Constructor Details

#initialize(query, &row_modifier) ⇒ ResultsFiber

Returns a new instance of ResultsFiber.



7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/libcouchbase/results_fiber.rb', line 7

def initialize(query, &row_modifier)
    @query_in_progress = false
    @query_completed = false
    @complete_result_set = false

    @results = []
    @fiber = nil

    # This could be a view or n1ql query
    @query = query
    @row_modifier = row_modifier
end

Instance Method Details

#cancel ⇒ Object



139
140
141
142
143
# File 'lib/libcouchbase/results_fiber.rb', line 139

def cancel
    @cancelled = true
    @query.cancel
    resume
end

#count ⇒ Object



107
108
109
110
# File 'lib/libcouchbase/results_fiber.rb', line 107

def count
    first unless @metadata
    @query.get_count @metadata
end

#each(&blk) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/libcouchbase/results_fiber.rb', line 57

def each(&blk)
    # return a valid enumerator
    return load_all.each unless block_given?

    if @complete_result_set
        @results.each &blk
    else
        perform

        index = 0
        @fiber = Fiber.current

        begin
            while not @query_completed do
                if index < @results.length
                    yield @results[index]
                    index += 1
                else
                    resume
                end
            end
        ensure
            # cancel is executed on break or error
            cancel unless @query_completed
            @fiber = nil
        end
    end
    self
end

#first ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/libcouchbase/results_fiber.rb', line 87

def first
    if @complete_result_set || @results.length > 0
        @results[0]
    else
        perform is_complete: false, limit: 1

        @fiber = Fiber.current
        begin
            while not @query_completed do
                resume
            end
        ensure
            @fiber = nil
        end

        result = @results[0]
        result
    end
end

#options(**opts) ⇒ Object



20
21
22
23
# File 'lib/libcouchbase/results_fiber.rb', line 20

def options(**opts)
    reset
    @query.options.merge!(opts)
end

#reset ⇒ Object



50
51
52
53
54
55
# File 'lib/libcouchbase/results_fiber.rb', line 50

def reset
    raise 'query in progress' if @query_in_progress
    @query_in_progress = false
    @complete_result_set = false
    @results.clear
end

#stream(&blk) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/libcouchbase/results_fiber.rb', line 26

def stream(&blk)
    if @complete_result_set
        @results.each &blk
    else
        perform is_complete: false
        @fiber = Fiber.current

        begin
            while not @query_completed do
                if @results.length > 0
                    yield @results.shift
                else
                    resume
                end
            end
        ensure
            # cancel is executed on break or error
            cancel unless @query_completed
            @fiber = nil
        end
    end
    self
end

#take(num) ⇒ Object



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/libcouchbase/results_fiber.rb', line 112

def take(num)
    if @complete_result_set || @results.length >= num
        @results[0...num]
    else
        perform is_complete: false, limit: num

        index = 0
        @fiber = Fiber.current

        result = []
        begin
            while not @query_completed do
                if index < @results.length && index < num
                    result << @results[index]
                    index += 1
                else
                    resume
                end
            end
        ensure
            @fiber = nil
        end

        result
    end
end