github.com/altipla-consulting/ravendb-go-client@v0.1.3/facet_token.go (about) 1 package ravendb 2 3 import "strings" 4 5 var _ queryToken = &facetToken{} 6 7 type facetToken struct { 8 facetSetupDocumentID string 9 aggregateByFieldName string 10 alias string 11 ranges []string 12 optionsParameterName string 13 14 aggregations []*facetAggregationToken 15 } 16 17 func (t *facetToken) GetName() string { 18 return firstNonEmptyString(t.alias, t.aggregateByFieldName) 19 } 20 21 func newFacetTokenWithID(facetSetupDocumentID string) *facetToken { 22 return &facetToken{ 23 facetSetupDocumentID: facetSetupDocumentID, 24 } 25 } 26 27 func newFacetTokenAll(aggregateByFieldName string, alias string, ranges []string, optionsParameterName string) *facetToken { 28 return &facetToken{ 29 aggregateByFieldName: aggregateByFieldName, 30 alias: alias, 31 ranges: ranges, 32 optionsParameterName: optionsParameterName, 33 } 34 } 35 36 func (t *facetToken) writeTo(writer *strings.Builder) error { 37 writer.WriteString("facet(") 38 39 if t.facetSetupDocumentID != "" { 40 writer.WriteString("id('") 41 writer.WriteString(t.facetSetupDocumentID) 42 writer.WriteString("'))") 43 44 return nil 45 } 46 47 firstArgument := false 48 49 if t.aggregateByFieldName != "" { 50 writer.WriteString(t.aggregateByFieldName) 51 } else if len(t.ranges) != 0 { 52 firstInRange := true 53 54 for _, rang := range t.ranges { 55 if !firstInRange { 56 writer.WriteString(", ") 57 } 58 59 firstInRange = false 60 writer.WriteString(rang) 61 } 62 } else { 63 firstArgument = true 64 } 65 66 for _, aggregation := range t.aggregations { 67 if !firstArgument { 68 writer.WriteString(", ") 69 } 70 firstArgument = false 71 if err := aggregation.writeTo(writer); err != nil { 72 return err 73 } 74 } 75 76 if stringIsNotBlank(t.optionsParameterName) { 77 writer.WriteString(", $") 78 writer.WriteString(t.optionsParameterName) 79 } 80 81 writer.WriteString(")") 82 83 if stringIsBlank(t.alias) || t.alias == t.aggregateByFieldName { 84 return nil 85 } 86 87 writer.WriteString(" as ") 88 writer.WriteString(t.alias) 89 90 return nil 91 } 92 93 func createFacetToken(facetSetupDocumentID string) (*facetToken, error) { 94 if stringIsBlank(facetSetupDocumentID) { 95 return nil, newIllegalArgumentError("facetSetupDocumentID cannot be null") 96 } 97 98 return newFacetTokenWithID(facetSetupDocumentID), nil 99 } 100 101 func createFacetTokenWithFacet(facet *Facet, addQueryParameter func(interface{}) string) *facetToken { 102 optionsParameterName := getOptionsParameterName(facet, addQueryParameter) 103 token := newFacetTokenAll(facet.FieldName, facet.DisplayFieldName, nil, optionsParameterName) 104 105 applyAggregations(facet, token) 106 return token 107 } 108 109 func createFacetTokenWithRangeFacet(facet *RangeFacet, addQueryParameter func(interface{}) string) (*facetToken, error) { 110 optionsParameterName := getOptionsParameterName(facet, addQueryParameter) 111 112 token := newFacetTokenAll("", facet.DisplayFieldName, facet.Ranges, optionsParameterName) 113 114 applyAggregations(facet, token) 115 116 return token, nil 117 } 118 119 func createFacetTokenWithGenericRangeFacet(facet *GenericRangeFacet, addQueryParameter func(interface{}) string) (*facetToken, error) { 120 optionsParameterName := getOptionsParameterName(facet, addQueryParameter) 121 122 var ranges []string 123 for _, rangeBuilder := range facet.Ranges { 124 r, err := genericRangeFacetParse(rangeBuilder, addQueryParameter) 125 if err != nil { 126 return nil, err 127 } 128 ranges = append(ranges, r) 129 } 130 131 token := newFacetTokenAll("", facet.DisplayFieldName, ranges, optionsParameterName) 132 133 applyAggregations(facet, token) 134 return token, nil 135 } 136 137 func createFacetTokenWithFacetBase(facet FacetBase, addQueryParameter func(interface{}) string) (*facetToken, error) { 138 // this is just a dispatcher 139 return facet.ToFacetToken(addQueryParameter) 140 } 141 142 func applyAggregations(facet FacetBase, token *facetToken) { 143 m := facet.GetAggregations() 144 145 for key, value := range m { 146 var aggregationToken *facetAggregationToken 147 switch key { 148 case FacetAggregationMax: 149 aggregationToken = facetAggregationTokenMax(value) 150 case FacetAggregationMin: 151 aggregationToken = facetAggregationTokenMin(value) 152 case FacetAggregationAverage: 153 aggregationToken = facetAggregationTokenAverage(value) 154 case FacetAggregationSum: 155 aggregationToken = facetAggregationTokenSum(value) 156 default: 157 panic("Unsupported aggregation method: " + key) 158 //throw new NotImplementedError("Unsupported aggregation method: " + aggregation.getKey()); 159 } 160 161 token.aggregations = append(token.aggregations, aggregationToken) 162 } 163 } 164 165 func getOptionsParameterName(facet FacetBase, addQueryParameter func(interface{}) string) string { 166 if facet.GetOptions() == nil || facet.GetOptions() == DefaultFacetOptions { 167 return "" 168 } 169 return addQueryParameter(facet.GetOptions()) 170 } 171 172 var _ queryToken = &facetAggregationToken{} 173 174 type facetAggregationToken struct { 175 fieldName string 176 aggregation FacetAggregation 177 } 178 179 func newFacetAggregationToken(fieldName string, aggregation FacetAggregation) *facetAggregationToken { 180 return &facetAggregationToken{ 181 fieldName: fieldName, 182 aggregation: aggregation, 183 } 184 } 185 186 func (t *facetAggregationToken) writeTo(writer *strings.Builder) error { 187 switch t.aggregation { 188 case FacetAggregationMax: 189 writer.WriteString("max(") 190 writer.WriteString(t.fieldName) 191 writer.WriteString(")") 192 case FacetAggregationMin: 193 writer.WriteString("min(") 194 writer.WriteString(t.fieldName) 195 writer.WriteString(")") 196 case FacetAggregationAverage: 197 writer.WriteString("avg(") 198 writer.WriteString(t.fieldName) 199 writer.WriteString(")") 200 case FacetAggregationSum: 201 writer.WriteString("sum(") 202 writer.WriteString(t.fieldName) 203 writer.WriteString(")") 204 default: 205 return newIllegalArgumentError("Invalid aggregation mode: " + t.aggregation) 206 } 207 return nil 208 } 209 210 func facetAggregationTokenMax(fieldName string) *facetAggregationToken { 211 panicIf(stringIsBlank(fieldName), "FieldName can not be null") 212 return newFacetAggregationToken(fieldName, FacetAggregationMax) 213 } 214 215 func facetAggregationTokenMin(fieldName string) *facetAggregationToken { 216 panicIf(stringIsBlank(fieldName), "FieldName can not be null") 217 return newFacetAggregationToken(fieldName, FacetAggregationMin) 218 } 219 220 func facetAggregationTokenAverage(fieldName string) *facetAggregationToken { 221 panicIf(stringIsBlank(fieldName), "FieldName can not be null") 222 return newFacetAggregationToken(fieldName, FacetAggregationAverage) 223 } 224 225 func facetAggregationTokenSum(fieldName string) *facetAggregationToken { 226 panicIf(stringIsBlank(fieldName), "FieldName can not be null") 227 return newFacetAggregationToken(fieldName, FacetAggregationSum) 228 }