1// Copyright 2012-2015 Oliver Eilhard. All rights reserved.
2// Use of this source code is governed by a MIT-license.
3// See http://olivere.mit-license.org/license.txt for details.
4
5package elastic
6
7import (
8	"fmt"
9	"strings"
10)
11
12// SimpleQueryStringQuery is a query that uses the SimpleQueryParser
13// to parse its context. Unlike the regular query_string query,
14// the simple_query_string query will never throw an exception,
15// and discards invalid parts of the query.
16// For more details, see
17// http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html
18type SimpleQueryStringQuery struct {
19	queryText   string
20	analyzer    string
21	operator    string
22	fields      []string
23	fieldBoosts map[string]*float32
24}
25
26// Creates a new simple query string query.
27func NewSimpleQueryStringQuery(text string) SimpleQueryStringQuery {
28	q := SimpleQueryStringQuery{
29		queryText:   text,
30		fields:      make([]string, 0),
31		fieldBoosts: make(map[string]*float32),
32	}
33	return q
34}
35
36func (q SimpleQueryStringQuery) Field(field string) SimpleQueryStringQuery {
37	q.fields = append(q.fields, field)
38	return q
39}
40
41func (q SimpleQueryStringQuery) FieldWithBoost(field string, boost float32) SimpleQueryStringQuery {
42	q.fields = append(q.fields, field)
43	q.fieldBoosts[field] = &boost
44	return q
45}
46
47func (q SimpleQueryStringQuery) Analyzer(analyzer string) SimpleQueryStringQuery {
48	q.analyzer = analyzer
49	return q
50}
51
52func (q SimpleQueryStringQuery) DefaultOperator(defaultOperator string) SimpleQueryStringQuery {
53	q.operator = defaultOperator
54	return q
55}
56
57// Creates the query source for the query string query.
58func (q SimpleQueryStringQuery) Source() interface{} {
59	// {
60	//    "simple_query_string" : {
61	//      "query" : "\"fried eggs\" +(eggplant | potato) -frittata",
62	//			"analyzer" : "snowball",
63	//      "fields" : ["body^5","_all"],
64	//      "default_operator" : "and"
65	//    }
66	// }
67
68	source := make(map[string]interface{})
69
70	query := make(map[string]interface{})
71	source["simple_query_string"] = query
72
73	query["query"] = q.queryText
74
75	if len(q.fields) > 0 {
76		fields := make([]string, 0)
77		for _, field := range q.fields {
78			if boost, found := q.fieldBoosts[field]; found {
79				if boost != nil {
80					fields = append(fields, fmt.Sprintf("%s^%f", field, *boost))
81				} else {
82					fields = append(fields, field)
83				}
84			} else {
85				fields = append(fields, field)
86			}
87		}
88		query["fields"] = fields
89	}
90
91	if q.analyzer != "" {
92		query["analyzer"] = q.analyzer
93	}
94
95	if q.operator != "" {
96		query["default_operator"] = strings.ToLower(q.operator)
97	}
98
99	return source
100}
101