func readQueryValue()

in pkg/data-query/parser.go [71:132]


func readQueryValue(value *fastjson.Value) (*Query, error) {
	query := &Query{
		Database: string(value.GetStringBytes("db")),
		Table:    string(value.GetStringBytes("table")),
		Flat:     value.GetBool("flat"),
	}

	switch {
	case query.Database == "":
		query.Database = "default"
	case !reDbName.MatchString(query.Database):
		return nil, http_error.NewHttpError(400, fmt.Sprintf("Database name %s contains illegal chars", query.Database))
	case query.Table != "" && !reDbName.MatchString(query.Table):
		return nil, http_error.NewHttpError(400, fmt.Sprintf("Table name %s contains illegal chars", query.Table))
	}

	err := readDimensions(value.GetArray("fields"), &query.Fields)
	if err != nil {
		return nil, err
	}

	err = readFilters(value.GetArray("filters"), query)
	if err != nil {
		return nil, err
	}

	orderValue := value.Get("order")
	if orderValue == nil {
		return nil, http_error.NewHttpError(400, "order is missing")
	}
	if orderValue.Type() == fastjson.TypeString {
		field := string(orderValue.GetStringBytes())
		if !reNestedFieldName.MatchString(field) {
			return nil, http_error.NewHttpError(400, fmt.Sprintf("Order %s is not a valid field name", field))
		}
		query.Order = []string{field}
	} else {
		for _, v := range value.GetArray("order") {
			field := string(v.GetStringBytes())
			if !reNestedFieldName.MatchString(field) {
				return nil, http_error.NewHttpError(400, fmt.Sprintf("Order %s is not a valid field name", field))
			}
			query.Order = append(query.Order, field)
		}
	}

	query.Aggregator = string(value.GetStringBytes("aggregator"))
	if query.Aggregator != "" && !reAggregator.MatchString(query.Aggregator) {
		return nil, http_error.NewHttpError(400, fmt.Sprintf("Aggregator %s contains illegal chars", query.Aggregator))
	}

	err = readDimensions(value.GetArray("dimensions"), &query.Dimensions)
	if err != nil {
		return nil, err
	}

	query.TimeDimensionFormat = string(value.GetStringBytes("timeDimensionFormat"))
	if query.Aggregator != "" && !reAggregator.MatchString(query.Aggregator) {
		return nil, http_error.NewHttpError(400, fmt.Sprintf("timeDimensionFormat %s contains illegal chars", query.TimeDimensionFormat))
	}
	return query, nil
}