diff --git a/src/go/mongolib/explain/explain.go b/src/go/mongolib/explain/explain.go index 8e58d0e1..f38a3172 100644 --- a/src/go/mongolib/explain/explain.go +++ b/src/go/mongolib/explain/explain.go @@ -16,9 +16,21 @@ func New(session pmgo.SessionManager) *explain { } } -func (e *explain) Explain(eq proto.ExampleQuery) ([]byte, error) { +func (e *explain) Explain(db string, query []byte) ([]byte, error) { + var err error + var eq proto.ExampleQuery + + err = bson.UnmarshalJSON(query, &eq) + if err != nil { + return nil, err + } + + if db == "" { + db = eq.Db() + } + var result proto.BsonD - err := e.session.DB(eq.Db()).Run(eq.ExplainCmd(), &result) + err = e.session.DB(db).Run(eq.ExplainCmd(), &result) if err != nil { return nil, err } diff --git a/src/go/mongolib/explain/explain_test.go b/src/go/mongolib/explain/explain_test.go index ee0b8ad0..0d8e7cf7 100644 --- a/src/go/mongolib/explain/explain_test.go +++ b/src/go/mongolib/explain/explain_test.go @@ -138,21 +138,23 @@ func TestExplain(t *testing.T) { if err != nil { t.Fatalf("cannot load sample %s: %s", dir+file.Name(), err) } - got, err := ex.Explain(eq) + query, err := bson.MarshalJSON(eq) + if err != nil { + t.Fatalf("cannot marshal json %s: %s", dir+file.Name(), err) + } + got, err := ex.Explain("", query) expectErrMsg := expectError[file.Name()] gotErrMsg := fmt.Sprintf("%v", err) if gotErrMsg != expectErrMsg { t.Fatalf("explain error should be '%s' but was '%s'", expectErrMsg, gotErrMsg) } - if err != nil { - return - } - - result := proto.BsonD{} - err = bson.UnmarshalJSON(got, &result) - if err != nil { - t.Fatalf("cannot unmarshal json explain result: %s", err) + if err == nil { + result := proto.BsonD{} + err = bson.UnmarshalJSON(got, &result) + if err != nil { + t.Fatalf("cannot unmarshal json explain result: %s", err) + } } }) }