1// Copyright 2014 Google Inc. All rights reserved.
2// Use of this source code is governed by the Apache 2.0
3// license that can be found in the LICENSE file.
4
5package search
6
7// Field is a name/value pair. A search index's document can be loaded and
8// saved as a sequence of Fields.
9type Field struct {
10	// Name is the field name. A valid field name matches /[A-Za-z][A-Za-z0-9_]*/.
11	Name string
12	// Value is the field value. The valid types are:
13	//  - string,
14	//  - search.Atom,
15	//  - search.HTML,
16	//  - time.Time (stored with millisecond precision),
17	//  - float64,
18	//  - GeoPoint.
19	Value interface{}
20	// Language is a two-letter ISO 639-1 code for the field's language,
21	// defaulting to "en" if nothing is specified. It may only be specified for
22	// fields of type string and search.HTML.
23	Language string
24	// Derived marks fields that were calculated as a result of a
25	// FieldExpression provided to Search. This field is ignored when saving a
26	// document.
27	Derived bool
28}
29
30// Facet is a name/value pair which is used to add categorical information to a
31// document.
32type Facet struct {
33	// Name is the facet name. A valid facet name matches /[A-Za-z][A-Za-z0-9_]*/.
34	// A facet name cannot be longer than 500 characters.
35	Name string
36	// Value is the facet value.
37	//
38	// When being used in documents (for example, in
39	// DocumentMetadata.Facets), the valid types are:
40	//  - search.Atom,
41	//  - float64.
42	//
43	// When being used in SearchOptions.Refinements or being returned
44	// in FacetResult, the valid types are:
45	//  - search.Atom,
46	//  - search.Range.
47	Value interface{}
48}
49
50// DocumentMetadata is a struct containing information describing a given document.
51type DocumentMetadata struct {
52	// Rank is an integer specifying the order the document will be returned in
53	// search results. If zero, the rank will be set to the number of seconds since
54	// 2011-01-01 00:00:00 UTC when being Put into an index.
55	Rank int
56	// Facets is the set of facets for this document.
57	Facets []Facet
58}
59
60// FieldLoadSaver can be converted from and to a slice of Fields
61// with additional document metadata.
62type FieldLoadSaver interface {
63	Load([]Field, *DocumentMetadata) error
64	Save() ([]Field, *DocumentMetadata, error)
65}
66
67// FieldList converts a []Field to implement FieldLoadSaver.
68type FieldList []Field
69
70// Load loads all of the provided fields into l.
71// It does not first reset *l to an empty slice.
72func (l *FieldList) Load(f []Field, _ *DocumentMetadata) error {
73	*l = append(*l, f...)
74	return nil
75}
76
77// Save returns all of l's fields as a slice of Fields.
78func (l *FieldList) Save() ([]Field, *DocumentMetadata, error) {
79	return *l, nil, nil
80}
81
82var _ FieldLoadSaver = (*FieldList)(nil)
83