Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: tidwall/tile38
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 1.33.2
Choose a base ref
...
head repository: tidwall/tile38
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: master
Choose a head ref
  • 20 commits
  • 11 files changed
  • 6 contributors

Commits on Sep 3, 2024

  1. Copy the full SHA
    2451fce View commit details

Commits on Sep 6, 2024

  1. Merge pull request #752 from Kilowhisky/Fix_750

    Add 'slave_repl_offset' to the INFO replication command output
    tidwall authored Sep 6, 2024
    Copy the full SHA
    2b080f4 View commit details

Commits on Sep 30, 2024

  1. 1.33.3

    tidwall committed Sep 30, 2024
    Copy the full SHA
    a3b5db7 View commit details

Commits on Nov 1, 2024

  1. Update README.md

    tidwall authored Nov 1, 2024
    Copy the full SHA
    1ef5394 View commit details

Commits on Nov 5, 2024

  1. Use zero for undefined fields in where expressions

    This commit fixes an issue where expressions were
    silently failing when encountering undefined fields.
    Instead they should be treating the undefined field like
    the number zero. This is required to stay compatible with
    how Tile38 handles zeros.
    https://tile38.com/commands/intersects/#fields
    
    Fixes #754
    tidwall committed Nov 5, 2024
    Copy the full SHA
    aa1caa6 View commit details
  2. 1.33.4

    tidwall committed Nov 5, 2024
    Copy the full SHA
    7284512 View commit details

Commits on Nov 13, 2024

  1. Update README.md

    Fix discord link
    tidwall authored Nov 13, 2024
    Copy the full SHA
    69a36ed View commit details

Commits on Nov 16, 2024

  1. Add linestring benchmark

    tidwall committed Nov 16, 2024
    Copy the full SHA
    d445566 View commit details

Commits on Nov 25, 2024

  1. Upgrade base image in Dockerfile to alpine:3.20

    Tri Duong committed Nov 25, 2024
    Copy the full SHA
    d75dd02 View commit details

Commits on Dec 5, 2024

  1. Adds the ability to use SQS FIFO queues.

    All SQS FIFO queues have the `.fifo` suffix at the end of their URL - this is how we determine if we are using a FIFO queue or not. The `MessageGroupId` (A required field for FIFO) is set using the key & id of the event's message.
    
    Note: This commit does not add the the `MessageDeduplicationID` so the FIFO queue must have content-based deduplication enabled.
    crankycookie committed Dec 5, 2024
    Copy the full SHA
    d24fbd0 View commit details

Commits on Dec 6, 2024

  1. Merge pull request #759 from crankycookie/jkwon/add-sqs-fifo

    Adds the ability to use SQS FIFO queues.
    tidwall authored Dec 6, 2024
    Copy the full SHA
    459b3e6 View commit details

Commits on Dec 10, 2024

  1. Merge pull request #757 from tduong2049/upgrade-alpine-docker

    Upgrade base image in Dockerfile to alpine:3.20
    tidwall authored Dec 10, 2024
    Copy the full SHA
    bed590b View commit details
  2. Update to Go 1.23

    tidwall committed Dec 10, 2024
    Copy the full SHA
    2b09508 View commit details
  3. 1.34.0

    tidwall committed Dec 10, 2024
    Copy the full SHA
    5be471a View commit details

Commits on Dec 11, 2024

  1. Bump golang.org/x/crypto from 0.21.0 to 0.31.0

    Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.21.0 to 0.31.0.
    - [Commits](golang/crypto@v0.21.0...v0.31.0)
    
    ---
    updated-dependencies:
    - dependency-name: golang.org/x/crypto
      dependency-type: indirect
    ...
    
    Signed-off-by: dependabot[bot] <support@github.com>
    dependabot[bot] authored Dec 11, 2024
    Copy the full SHA
    f0cb0ee View commit details

Commits on Dec 21, 2024

  1. Merge pull request #760 from tidwall/dependabot/go_modules/golang.org…

    …/x/crypto-0.31.0
    
    Bump golang.org/x/crypto from 0.21.0 to 0.31.0
    tidwall authored Dec 21, 2024
    Copy the full SHA
    07389d8 View commit details

Commits on Jan 2, 2025

  1. Copy the full SHA
    e6f184d View commit details
  2. Copy the full SHA
    8b09cd5 View commit details

Commits on Jan 8, 2025

  1. Merge pull request #762 from tduong2049/td/bump-go-net

    Bump golang.org/x/net from v0.23.0 to v0.33.0
    tidwall authored Jan 8, 2025
    Copy the full SHA
    927f382 View commit details

Commits on Jan 14, 2025

  1. 1.34.1

    tidwall committed Jan 14, 2025
    Copy the full SHA
    2e2bd14 View commit details
Showing with 90 additions and 24 deletions.
  1. +1 −1 .github/workflows/main.yml
  2. +21 −0 CHANGELOG.md
  3. +1 −1 Dockerfile
  4. +5 −1 README.md
  5. +17 −1 cmd/tile38-benchmark/main.go
  6. +6 −6 go.mod
  7. +12 −12 go.sum
  8. +13 −1 internal/endpoint/sqs.go
  9. +2 −1 internal/server/expr.go
  10. +1 −0 internal/server/stats.go
  11. +11 −0 tests/keys_test.go
2 changes: 1 addition & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -14,7 +14,7 @@ jobs:
- name: Set up Go 1.x
uses: actions/setup-go@v2
with:
go-version: ^1.22
go-version: ^1.23

- name: Check out code
uses: actions/checkout@v2
21 changes: 21 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -2,6 +2,27 @@
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).

## [1.34.1] = 2024-01-13
### Security
- 927f382: CVE-2024-45338 golang.org/x/net #762 (@tduong2049)
- 07389d8: CVE-2024-45337 golang.org/x/crypto #760

## [1.34.0] = 2024-12-09
### Added
- 459b3e6: Added fifo support for SQS webhooks #759 (@crankycookie)

### Updated
- bed590b: Upgrade to Alpine 3.20 #757 (@tduong2049)
- 2b09508: Upgrade to Go 1.23

## [1.33.4] = 2024-11-05
### Fixed
- aa1caa6: Use zero for undefined fields in where expressions #754 (@unendingblue)

## [1.33.3] = 2024-09-29
### Fixed
- 2b080f4: Include field to INFO replication command output #752 (@Kilowhisky)

## [1.33.2] = 2024-08-02
### Fixed
- 2e3eaa7: Remove extra quote in ROLE command with JSON output #749 (@Kilowhisky)
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM alpine:3.16.2
FROM alpine:3.20

ARG VERSION
ARG TARGETOS
6 changes: 5 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -6,10 +6,14 @@
</picture>
</p>
<p align="center">
<a href="https://tile38.com/slack/"><img src="https://img.shields.io/badge/slack-channel-orange.svg" alt="Slack Channel"></a>
<a href="https://tile38.com/slack/"><img src="https://img.shields.io/badge/Slack-4A154B?logo=slack&logoColor=fff" alt="Slack"></a>
<a href="https://discord.gg/esq8ESgzms"><img src="https://img.shields.io/badge/Discord-%235865F2.svg?&logo=discord&logoColor=white" alt="Discord"></a>
<a href="https://hub.docker.com/r/tile38/tile38"><img src="https://img.shields.io/docker/pulls/tile38/tile38.svg" alt="Docker Pulls"></a>
</p>




Tile38 is an open source (MIT licensed), in-memory geolocation data store, spatial index, and realtime geofencing server.
It supports a variety of object types including lat/lon points, bounding boxes, XYZ tiles, Geohashes, and GeoJSON.

18 changes: 17 additions & 1 deletion cmd/tile38-benchmark/main.go
Original file line number Diff line number Diff line change
@@ -261,7 +261,7 @@ func main() {
)
}

case "SET", "SET-POINT", "SET-RECT", "SET-STRING":
case "SET", "SET-POINT", "SET-RECT", "SET-LINE", "SET-STRING":
if redis {
redbench.Bench("SET", addr, opts, prepFn,
func(buf []byte) []byte {
@@ -299,6 +299,22 @@ func main() {
)
}
switch strings.ToUpper(strings.TrimSpace(test)) {
case "SET", "SET-LINE":
redbench.Bench("SET (line)", addr, opts, prepFn,
func(buf []byte) []byte {
i := atomic.AddInt64(&i, 1)
alat, alon, blat, blon := randRect(10000)
if rand.Int()%2 == 0 {
alat, alon, blat, blon = blat, blon, alat, alon
}
linestring := fmt.Sprintf(`{"type":"LineString","coordinates":[[%f,%f],[%f,%f]]}`, alon, alat, blon, blat)
return redbench.AppendCommand(buf, "SET", "key:bench", "id:"+strconv.FormatInt(i, 10), "OBJECT",
linestring,
)
},
)
}
switch strings.ToUpper(strings.TrimSpace(test)) {
case "SET", "SET-STRING":
redbench.Bench("SET (string)", addr, opts, prepFn,
func(buf []byte) []byte {
12 changes: 6 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
@@ -36,8 +36,8 @@ require (
github.com/yuin/gopher-lua v1.1.0
go.uber.org/atomic v1.11.0
go.uber.org/zap v1.26.0
golang.org/x/net v0.23.0
golang.org/x/term v0.18.0
golang.org/x/net v0.33.0
golang.org/x/term v0.27.0
google.golang.org/api v0.151.0
google.golang.org/grpc v1.59.0
layeh.com/gopher-json v0.0.0-20201124131017-552bb3c4c3bf
@@ -102,11 +102,11 @@ require (
github.com/xdg-go/stringprep v1.0.4 // indirect
go.opencensus.io v0.24.0 // indirect
go.uber.org/multierr v1.10.0 // indirect
golang.org/x/crypto v0.21.0 // indirect
golang.org/x/crypto v0.31.0 // indirect
golang.org/x/oauth2 v0.13.0 // indirect
golang.org/x/sync v0.5.0 // indirect
golang.org/x/sys v0.18.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/sync v0.10.0 // indirect
golang.org/x/sys v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect
golang.org/x/time v0.4.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b // indirect
24 changes: 12 additions & 12 deletions go.sum
Original file line number Diff line number Diff line change
@@ -445,8 +445,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -514,8 +514,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM=
golang.org/x/net v0.0.0-20220809184613-07c6da5e1ced/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -534,8 +534,8 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -578,12 +578,12 @@ golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8=
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -592,8 +592,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
14 changes: 13 additions & 1 deletion internal/endpoint/sqs.go
Original file line number Diff line number Diff line change
@@ -6,6 +6,8 @@ import (
"sync"
"time"

"github.com/tidwall/gjson"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
@@ -108,11 +110,17 @@ func (conn *SQSConn) Send(msg string) error {
}

queueURL := conn.generateSQSURL()
// Send message
// Create message
sendParams := &sqs.SendMessageInput{
MessageBody: aws.String(msg),
QueueUrl: aws.String(queueURL),
}
if isFifoQueue(queueURL) {
key := gjson.Get(msg, "key")
id := gjson.Get(msg, "id")
keyValue := fmt.Sprintf("%s#%s", key.String(), id.String())
sendParams.MessageGroupId = aws.String(keyValue)
}
_, err := conn.svc.SendMessage(sendParams)
if err != nil {
fmt.Println(err)
@@ -145,3 +153,7 @@ func sqsRegionFromPlainURL(s string) string {
}
return ""
}

func isFifoQueue(s string) bool {
return strings.HasSuffix(s, ".fifo")
}
3 changes: 2 additions & 1 deletion internal/server/expr.go
Original file line number Diff line number Diff line change
@@ -91,6 +91,7 @@ func newExprPool(s *Server) *exprPool {
return resultToValue(r), nil
}
}
return expr.Number(0), nil
} else {
switch v := info.Value.Value().(type) {
case gjson.Result:
@@ -102,8 +103,8 @@ func newExprPool(s *Server) *exprPool {
return expr.Function("match"), nil
}
}
return expr.Undefined, nil
}
return expr.Undefined, nil
},
// call
func(info expr.CallInfo, ctx *expr.Context) (expr.Value, error) {
1 change: 1 addition & 0 deletions internal/server/stats.go
Original file line number Diff line number Diff line change
@@ -450,6 +450,7 @@ func (s *Server) writeInfoReplication(w *bytes.Buffer) {
fmt.Fprintf(w, "role:slave\r\n")
fmt.Fprintf(w, "master_host:%s\r\n", s.config.followHost())
fmt.Fprintf(w, "master_port:%v\r\n", s.config.followPort())
fmt.Fprintf(w, "slave_repl_offset:%v\r\n", int(s.faofsz))
if s.config.replicaPriority() >= 0 {
fmt.Fprintf(w, "slave_priority:%v\r\n", s.config.replicaPriority())
}
11 changes: 11 additions & 0 deletions tests/keys_test.go
Original file line number Diff line number Diff line change
@@ -600,6 +600,17 @@ func keys_FIELDS_test(mc *mockServer) error {
Do("SCAN", "fleet", "WHERE", "props.speed > 53", "IDS").JSON().Str(`{"ok":true,"ids":[],"count":0,"cursor":0}`),
Do("SCAN", "fleet", "WHERE", "Props.speed > 53", "IDS").JSON().Str(`{"ok":true,"ids":[],"count":0,"cursor":0}`),
Do("SCAN", "fleet", "WHERE", "Props.Speed > 53", "IDS").JSON().Str(`{"ok":true,"ids":[],"count":0,"cursor":0}`),

Do("DROP", "fleet").JSON().OK(),
Do("SET", "fleet", "1", "field", "teamId", "1", "field", "optionalId", "999", "point", "0", "0").JSON().OK(),
Do("SET", "fleet", "2", "field", "teamId", "1", "point", "0", "0").JSON().OK(),
Do("SCAN", "fleet", "COUNT").JSON().Str(`{"ok":true,"count":2,"cursor":0}`),
Do("SCAN", "fleet", "WHEREIN", "teamId", "1", "1", "COUNT").JSON().Str(`{"ok":true,"count":2,"cursor":0}`),

Do("SCAN", "fleet", "WHEREIN", "teamId", "1", "1", "WHERE", "!optionalId || optionalId == 999", "count").JSON().Str(`{"ok":true,"count":2,"cursor":0}`),
Do("SCAN", "fleet", "WHEREIN", "teamId", "1", "1", "WHERE", "!!!optionalId || optionalId == 999", "count").JSON().Str(`{"ok":true,"count":2,"cursor":0}`),
Do("SCAN", "fleet", "WHEREIN", "teamId", "1", "1", "WHERE", "optionalId == 0 || optionalId == 999", "count").JSON().Str(`{"ok":true,"count":2,"cursor":0}`),
Do("SCAN", "fleet", "WHEREIN", "teamId", "1", "1", "WHERE", "1 == 1 || optionalId == 999", "count").JSON().Str(`{"ok":true,"count":2,"cursor":0}`),
)
}