From d86183b940f64f2d05029387b4d8de0a3e173836 Mon Sep 17 00:00:00 2001
From: Anton Sattarov <dirty.mew@gmail.com>
Date: Thu, 5 Oct 2023 12:43:34 +0200
Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?=
 =?UTF-8?q?=D0=BD=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20=D0=BF=D0=BE=20=D0=B8?=
 =?UTF-8?q?=D0=B4=D0=B5=D0=BD=D1=82=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=82?=
 =?UTF-8?q?=D0=BE=D1=80=D1=83=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D0=B8=20?=
 =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BB=D1=83=D1=87=D0=B0=D1=8F=20?=
 =?UTF-8?q?=D0=BA=D0=BE=D0=B3=D0=B4=D0=B0=20=D0=BD=D0=B5=20=D1=83=D0=BA?=
 =?UTF-8?q?=D0=B0=D0=B7=D0=B0=D0=BD=D0=BE=20=D0=B2=D1=8B=D1=80=D0=B0=D0=B6?=
 =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=BB=D1=8F=20=D1=84=D0=B8?=
 =?UTF-8?q?=D0=BB=D1=8C=D1=82=D1=80=D0=B0=D1=86=D0=B8=D0=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pkg/expr/mongo.go      | 7 ++++++-
 pkg/expr/mongo_test.go | 3 ++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/pkg/expr/mongo.go b/pkg/expr/mongo.go
index 70bd6f05..95f4b6be 100644
--- a/pkg/expr/mongo.go
+++ b/pkg/expr/mongo.go
@@ -62,7 +62,12 @@ func convertToMongo(ctx context.Context, tree *parser.Tree, env map[string]inter
 	case bson.M:
 		b = e
 	case string:
-		b = bson.M{"$text": bson.M{"$search": e}}
+		b = bson.M{
+			"$or": bson.A{
+				bson.M{"_id": e},
+				bson.M{"$text": bson.M{"$search": e}},
+			},
+		}
 	default:
 		err = fmt.Errorf("invalid expression")
 	}
diff --git a/pkg/expr/mongo_test.go b/pkg/expr/mongo_test.go
index 46f92b55..9fe237e3 100644
--- a/pkg/expr/mongo_test.go
+++ b/pkg/expr/mongo_test.go
@@ -50,6 +50,7 @@ func TestConvertToMongo(t *testing.T) {
 		{"time", fmt.Sprintf("d > Time.Time('%s')", now.Format(time.RFC3339)), nil, bson.M{"d": bson.M{"$gt": tm}}, false},
 		{"in", "In(s, [1,2,3])", nil, bson.M{"s": bson.M{"$in": []interface{}{1, 2, 3}}}, false},
 		{"in", "In(s, 1)", nil, bson.M{"s": bson.M{"$in": []interface{}{1}}}, false},
+		{"text search or id", "id", nil, bson.M{"$or": bson.A{bson.M{"_id": "id"}, bson.M{"$text": bson.M{"$search": "id"}}}}, false},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -72,7 +73,7 @@ func BenchmarkConvertToMongo(b *testing.B) {
 	//fmt.Println(len(exp))
 
 	for i := 0; i < b.N; i++ {
-		ConvertToMongo(ctx, exp, nil, nil, expr.Patch(&testVisitor{}))
+		_, _ = ConvertToMongo(ctx, exp, nil, nil, expr.Patch(&testVisitor{}))
 	}
 }
 
-- 
GitLab