Exemplo n.º 1
0
func buildSelectQuery(q straumur.Query) (string, []interface{}) {

	var buffer bytes.Buffer
	args := []interface{}{}
	paramCount := 1
	delimiter := " and "
	writeDelimiter := false

	buffer.WriteString("select * from event")

	//Early exit, query is empty
	if q.IsEmpty() {
		buffer.WriteString(" order by created desc;")
		return buffer.String(), args
	}

	buffer.WriteString(" where ")

	if q.Key != "" {
		buffer.WriteString("key in (")
		keys := strings.Split(q.Key, "OR")
		for arrIdx, s := range keys {
			args = append(args, strings.TrimSpace(s))
			buffer.WriteString(fmt.Sprintf("$%d", paramCount))
			paramCount++
			if arrIdx+1 < len(keys) {
				buffer.WriteString(", ")
			}
		}
		buffer.WriteString(")")
		writeDelimiter = true
	}

	if q.Origin != "" {
		if writeDelimiter {
			buffer.WriteString(delimiter)
		}
		buffer.WriteString(fmt.Sprintf("origin = $%d", paramCount))
		args = append(args, q.Origin)
		paramCount++
		writeDelimiter = true
	}

	if !q.From.IsZero() {
		if writeDelimiter {
			buffer.WriteString(delimiter)
		}
		buffer.WriteString(fmt.Sprintf("created >= $%d", paramCount))
		args = append(args, q.From)
		paramCount++
		writeDelimiter = true
	}

	if !q.To.IsZero() {
		if writeDelimiter {
			buffer.WriteString(delimiter)
		}
		buffer.WriteString(fmt.Sprintf("created < $%d", paramCount))
		args = append(args, q.To)
		paramCount++
		writeDelimiter = true
	}

	//Array fields
	array_fields := make(map[string][]string)
	array_fields["entities"] = q.Entities
	array_fields["actors"] = q.Actors

	for db_name, array_field := range array_fields {

		if len(array_field) > 0 {
			if writeDelimiter {
				buffer.WriteString(delimiter)
			}
			nextParam, s := writeArray(paramCount, &args, db_name, array_field)
			paramCount = nextParam
			buffer.WriteString(s)
			writeDelimiter = true
		}

	}

	//todo add sort to query
	buffer.WriteString(" order by created desc;")

	return buffer.String(), args
}