github.com/willyham/dosa@v2.3.1-0.20171024181418-1e446d37ee71+incompatible/schema/uql/uql.go (about)

     1  // Copyright (c) 2017 Uber Technologies, Inc.
     2  //
     3  // Permission is hereby granted, free of charge, to any person obtaining a copy
     4  // of this software and associated documentation files (the "Software"), to deal
     5  // in the Software without restriction, including without limitation the rights
     6  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     7  // copies of the Software, and to permit persons to whom the Software is
     8  // furnished to do so, subject to the following conditions:
     9  //
    10  // The above copyright notice and this permission notice shall be included in
    11  // all copies or substantial portions of the Software.
    12  //
    13  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    14  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    15  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    16  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    17  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    18  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    19  // THE SOFTWARE.
    20  
    21  package uql
    22  
    23  import (
    24  	"bytes"
    25  
    26  	"text/template"
    27  
    28  	"github.com/pkg/errors"
    29  	"github.com/uber-go/dosa"
    30  )
    31  
    32  var (
    33  	// map from dosa type to uql type string
    34  	uqlTypes = map[dosa.Type]string{
    35  		dosa.String:    "string",
    36  		dosa.Blob:      "blob",
    37  		dosa.Bool:      "bool",
    38  		dosa.Double:    "double",
    39  		dosa.Int32:     "int32",
    40  		dosa.Int64:     "int64",
    41  		dosa.Timestamp: "timestamp",
    42  		dosa.TUUID:     "uuid",
    43  	}
    44  
    45  	funcMap = template.FuncMap{
    46  		"toUqlType": func(t dosa.Type) string {
    47  			return uqlTypes[t]
    48  		}}
    49  )
    50  
    51  const createStmt = "CREATE TABLE {{.Name}} (\n" +
    52  	"{{range .Columns}}  {{.Name}} {{(toUqlType .Type)}};\n{{end}}" +
    53  	") PRIMARY KEY {{(.Key)}};\n"
    54  
    55  var tmpl = template.Must(template.New("uql").Funcs(funcMap).Parse(createStmt))
    56  
    57  // ToUQL translates an entity definition to UQL string of create table stmt.
    58  func ToUQL(e *dosa.EntityDefinition) (string, error) {
    59  	if err := e.EnsureValid(); err != nil {
    60  		return "", errors.Wrap(err, "EntityDefinition is invalid")
    61  	}
    62  
    63  	var buf bytes.Buffer
    64  	if err := tmpl.Execute(&buf, e); err != nil {
    65  		// shouldn't happen unless we have a bug in our code
    66  		return "", errors.Wrap(err, "failed to execute UQL template; this is most likely a DOSA bug")
    67  	}
    68  	return buf.String(), nil
    69  }