Skip to content

Commit 8b45602

Browse files
authored
Merge pull request #25 from Arkiv-Network/rvdp/pr
Allow re-using the pagination logic
2 parents 2596515 + d4de3ee commit 8b45602

File tree

5 files changed

+119
-95
lines changed

5 files changed

+119
-95
lines changed

flake.lock

Lines changed: 7 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flake.nix

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,37 @@
11
{
22
description = "sqlite-store";
33
inputs = {
4-
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
4+
nixpkgs.url = "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz";
55

66
systems.url = "github:nix-systems/default";
7-
87
};
98

10-
outputs = { self, nixpkgs, systems, ... }@inputs:
9+
outputs =
10+
{
11+
nixpkgs,
12+
systems,
13+
...
14+
}:
1115
let
12-
eachSystem = f:
13-
nixpkgs.lib.genAttrs (import systems)
14-
(system: f system nixpkgs.legacyPackages.${system});
15-
in {
16+
eachSystem =
17+
f: nixpkgs.lib.genAttrs (import systems) (system: f system nixpkgs.legacyPackages.${system});
18+
in
19+
{
1620

17-
devShells = eachSystem (system: pkgs: {
18-
default = pkgs.mkShell {
19-
shellHook = ''
20-
# Set here the env vars you want to be available in the shell
21-
'';
22-
hardeningDisable = [ "all" ];
21+
devShells = eachSystem (
22+
system: pkgs: {
23+
default = pkgs.mkShell {
24+
shellHook = ''
25+
# Set here the env vars you want to be available in the shell
26+
'';
27+
hardeningDisable = [ "all" ];
2328

24-
packages = with pkgs; [ go sqlite ];
25-
};
26-
});
29+
packages = with pkgs; [
30+
go
31+
sqlite
32+
];
33+
};
34+
}
35+
);
2736
};
2837
}

query/exists_method.go

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func (e ExistsEvaluator) EvaluateAST(ast *AST, options *QueryOptions) (*SelectQu
4343

4444
sortingTable := fmt.Sprintf("arkiv_annotation_sorting%d", i)
4545

46-
keyPlaceholder := builder.pushArgument(orderBy.Name)
46+
keyPlaceholder := builder.PushArgument(orderBy.Name)
4747

4848
fmt.Fprintf(builder.queryBuilder,
4949
" LEFT JOIN %[1]s AS %s INDEXED BY %[4]s"+
@@ -58,7 +58,7 @@ func (e ExistsEvaluator) EvaluateAST(ast *AST, options *QueryOptions) (*SelectQu
5858
)
5959
}
6060

61-
err := builder.addPaginationArguments()
61+
err := AddPaginationArguments(&builder)
6262
if err != nil {
6363
return nil, fmt.Errorf("error adding the pagination condition: %w", err)
6464
}
@@ -70,7 +70,7 @@ func (e ExistsEvaluator) EvaluateAST(ast *AST, options *QueryOptions) (*SelectQu
7070
builder.queryBuilder.WriteString(" AND ")
7171
}
7272

73-
blockArg := builder.pushArgument(builder.options.AtBlock)
73+
blockArg := builder.PushArgument(builder.options.AtBlock)
7474
fmt.Fprintf(builder.queryBuilder, "%s BETWEEN e.from_block AND e.to_block - 1", blockArg)
7575

7676
if ast.Expr != nil {
@@ -147,22 +147,22 @@ func (ExistsEvaluator) addTermConditions(term *ASTTerm, b *QueryBuilder) error {
147147
)
148148

149149
if term.Assign != nil {
150-
key = b.pushArgument(term.Assign.Var)
150+
key = b.PushArgument(term.Assign.Var)
151151
val := term.Assign.Value
152152
if val.String != nil {
153153
attrType = "string"
154-
value = b.pushArgument(*val.String)
154+
value = b.PushArgument(*val.String)
155155
} else {
156156
attrType = "numeric"
157-
value = b.pushArgument(*val.Number)
157+
value = b.PushArgument(*val.Number)
158158
}
159159

160160
operation = "="
161161
if term.Assign.IsNot {
162162
operation = "!="
163163
}
164164
} else if term.Inclusion != nil {
165-
key = b.pushArgument(term.Inclusion.Var)
165+
key = b.PushArgument(term.Inclusion.Var)
166166
var values []string
167167
attrType = "string"
168168
if len(term.Inclusion.Values.Strings) > 0 {
@@ -171,16 +171,16 @@ func (ExistsEvaluator) addTermConditions(term *ASTTerm, b *QueryBuilder) error {
171171
if term.Inclusion.Var == OwnerAttributeKey ||
172172
term.Inclusion.Var == CreatorAttributeKey ||
173173
term.Inclusion.Var == KeyAttributeKey {
174-
values = append(values, b.pushArgument(strings.ToLower(value)))
174+
values = append(values, b.PushArgument(strings.ToLower(value)))
175175
} else {
176-
values = append(values, b.pushArgument(value))
176+
values = append(values, b.PushArgument(value))
177177
}
178178
}
179179
} else {
180180
attrType = "numeric"
181181
values = make([]string, 0, len(term.Inclusion.Values.Numbers))
182182
for _, value := range term.Inclusion.Values.Numbers {
183-
values = append(values, b.pushArgument(value))
183+
values = append(values, b.PushArgument(value))
184184
}
185185
}
186186

@@ -192,54 +192,54 @@ func (ExistsEvaluator) addTermConditions(term *ASTTerm, b *QueryBuilder) error {
192192
operation = "NOT IN"
193193
}
194194
} else if term.LessThan != nil {
195-
key = b.pushArgument(term.LessThan.Var)
195+
key = b.PushArgument(term.LessThan.Var)
196196
val := term.LessThan.Value
197197
if val.String != nil {
198198
attrType = "string"
199-
value = b.pushArgument(*val.String)
199+
value = b.PushArgument(*val.String)
200200
} else {
201201
attrType = "numeric"
202-
value = b.pushArgument(*val.Number)
202+
value = b.PushArgument(*val.Number)
203203
}
204204
operation = "<"
205205
} else if term.LessOrEqualThan != nil {
206-
key = b.pushArgument(term.LessOrEqualThan.Var)
206+
key = b.PushArgument(term.LessOrEqualThan.Var)
207207
val := term.LessOrEqualThan.Value
208208
if val.String != nil {
209209
attrType = "string"
210-
value = b.pushArgument(*val.String)
210+
value = b.PushArgument(*val.String)
211211
} else {
212212
attrType = "numeric"
213-
value = b.pushArgument(*val.Number)
213+
value = b.PushArgument(*val.Number)
214214
}
215215
operation = "<="
216216
} else if term.GreaterThan != nil {
217-
key = b.pushArgument(term.GreaterThan.Var)
217+
key = b.PushArgument(term.GreaterThan.Var)
218218
val := term.GreaterThan.Value
219219
if val.String != nil {
220220
attrType = "string"
221-
value = b.pushArgument(*val.String)
221+
value = b.PushArgument(*val.String)
222222
} else {
223223
attrType = "numeric"
224-
value = b.pushArgument(*val.Number)
224+
value = b.PushArgument(*val.Number)
225225
}
226226
operation = ">"
227227
} else if term.GreaterOrEqualThan != nil {
228-
key = b.pushArgument(term.GreaterOrEqualThan.Var)
228+
key = b.PushArgument(term.GreaterOrEqualThan.Var)
229229
val := term.GreaterOrEqualThan.Value
230230
if val.String != nil {
231231
attrType = "string"
232-
value = b.pushArgument(*val.String)
232+
value = b.PushArgument(*val.String)
233233
} else {
234234
attrType = "numeric"
235-
value = b.pushArgument(*val.Number)
235+
value = b.PushArgument(*val.Number)
236236
}
237237
operation = ">="
238238
} else if term.Glob != nil {
239-
key = b.pushArgument(term.Glob.Var)
239+
key = b.PushArgument(term.Glob.Var)
240240
val := term.Glob.Value
241241
attrType = "string"
242-
value = b.pushArgument(val)
242+
value = b.PushArgument(val)
243243

244244
operation = "GLOB"
245245
if term.Glob.IsNot {

query/query.go

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,16 @@ type SelectQuery struct {
1010
Args []any
1111
}
1212

13+
// Builder type to allow defining generic functions that can be re-used in other
14+
// packages (like query-api)
15+
type Builder interface {
16+
PushArgument(any) string
17+
WriteWhereClause(string)
18+
GetOptions() *QueryOptions
19+
}
20+
21+
var _ Builder = &QueryBuilder{}
22+
1323
type QueryBuilder struct {
1424
queryBuilder *strings.Builder
1525
args []any
@@ -26,7 +36,7 @@ func (b *QueryBuilder) nextTableName() string {
2636
return fmt.Sprintf("table_%d", b.tableCounter)
2737
}
2838

29-
func (b *QueryBuilder) pushArgument(arg any) string {
39+
func (b *QueryBuilder) PushArgument(arg any) string {
3040
b.args = append(b.args, arg)
3141
b.argsCount += 1
3242
return fmt.Sprintf("?%d", b.argsCount)
@@ -40,19 +50,36 @@ func (b *QueryBuilder) writeComma() {
4050
}
4151
}
4252

43-
func (b *QueryBuilder) addPaginationArguments() error {
53+
func (b *QueryBuilder) WriteWhereClause(s string) {
54+
if b.needsWhere {
55+
b.queryBuilder.WriteString(" WHERE ")
56+
b.needsWhere = false
57+
} else {
58+
b.queryBuilder.WriteString(" AND ")
59+
}
60+
61+
b.queryBuilder.WriteString("(")
62+
b.queryBuilder.WriteString(s)
63+
b.queryBuilder.WriteString(")")
64+
}
65+
66+
func (b *QueryBuilder) GetOptions() *QueryOptions {
67+
return &b.options
68+
}
69+
70+
func AddPaginationArguments(b Builder) error {
4471
paginationConditions := []string{}
4572

46-
if len(b.options.Cursor) > 0 {
73+
if len(b.GetOptions().Cursor) > 0 {
4774
// Pre-allocate argument counters so that we don't need to duplicate them below
48-
args := make([]string, 0, len(b.options.Cursor))
49-
for _, val := range b.options.Cursor {
50-
args = append(args, b.pushArgument(val.Value))
75+
args := make([]string, 0, len(b.GetOptions().Cursor))
76+
for _, val := range b.GetOptions().Cursor {
77+
args = append(args, b.PushArgument(val.Value))
5178
}
5279

53-
for i := range b.options.Cursor {
80+
for i := range b.GetOptions().Cursor {
5481
subcondition := []string{}
55-
for j, from := range b.options.Cursor {
82+
for j, from := range b.GetOptions().Cursor {
5683
if j > i {
5784
break
5885
}
@@ -67,11 +94,11 @@ func (b *QueryBuilder) addPaginationArguments() error {
6794

6895
arg := args[j]
6996

70-
columnIx, err := b.options.GetColumnIndex(from.ColumnName)
97+
columnIx, err := b.GetOptions().GetColumnIndex(from.ColumnName)
7198
if err != nil {
7299
return fmt.Errorf("error getting column index: %w", err)
73100
}
74-
column := b.options.Columns[columnIx]
101+
column := b.GetOptions().Columns[columnIx]
75102

76103
subcondition = append(
77104
subcondition,
@@ -87,16 +114,7 @@ func (b *QueryBuilder) addPaginationArguments() error {
87114

88115
paginationCondition := strings.Join(paginationConditions, " OR ")
89116

90-
if b.needsWhere {
91-
b.queryBuilder.WriteString(" WHERE ")
92-
b.needsWhere = false
93-
} else {
94-
b.queryBuilder.WriteString(" AND ")
95-
}
96-
97-
b.queryBuilder.WriteString("(")
98-
b.queryBuilder.WriteString(paginationCondition)
99-
b.queryBuilder.WriteString(")")
117+
b.WriteWhereClause(paginationCondition)
100118
}
101119

102120
return nil

0 commit comments

Comments
 (0)