Ejemplo n.º 1
0
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
}