func (b *Backend) ExecQuery(statement FieldedExpression) ([]interface{}, apperror.Error) { translator := b.translator.New() if err := translator.PrepareExpression(statement); err != nil { return nil, err } if err := translator.Translate(statement); err != nil { return nil, err } sql := translator.String() args := translator.RawArguments() res := b.SqlExec(sql, args...) if res.Err() != nil { return nil, apperror.Wrap(res.Err(), "orient_error") } defer res.Close() var rawData interface{} if err := res.All(&rawData); err != nil { return nil, apperror.Wrap(err, "orient_result_retrieval_error") } rows, ok := rawData.([]orient.OIdentifiable) if !ok { return nil, apperror.New("invalid_non_record_orient_result") } items := make([]interface{}, len(rows), len(rows)) var info *db.ModelInfo if sel, ok := statement.(*SelectStmt); ok { info = b.ModelInfos().Find(sel.Collection()) } for i, rawItem := range rows { document, ok := rawItem.(*orient.Document) if !ok { continue } data := make(map[string]interface{}) if info != nil && info.PkAttribute() != nil { data[info.PkAttribute().Name()] = document.RId } for _, docEntry := range document.Fields() { data[docEntry.Name] = docEntry.Value } items[i] = data } return items, nil }