From 481481a5c7ee51f30621ce733caaa4365dbc529b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Carlos=20Nieto?= <jose.carlos@menteslibres.net> Date: Fri, 12 Sep 2014 18:38:39 -0500 Subject: [PATCH] Adding benchmarks and prototyping cache functions. --- util/sqlgen/column.go | 16 ++++++++++++---- util/sqlgen/column_value.go | 25 +++++++++++++++++++++---- util/sqlgen/default.go | 1 + util/sqlgen/main.go | 17 ++++++++++++----- util/sqlgen/statement.go | 23 +++++++++++++---------- util/sqlgen/table.go | 11 +++++++++-- util/sqlgen/template.go | 17 +++++++++++++++++ 7 files changed, 85 insertions(+), 25 deletions(-) diff --git a/util/sqlgen/column.go b/util/sqlgen/column.go index 4b3f972c..a43ec871 100644 --- a/util/sqlgen/column.go +++ b/util/sqlgen/column.go @@ -14,7 +14,11 @@ type Column struct { Value interface{} } -func (self Column) Compile(layout *Template) string { +func (self Column) Compile(layout *Template) (compiled string) { + + if s, ok := layout.Cache(self); ok { + return s + } switch value := self.Value.(type) { case string: @@ -44,10 +48,14 @@ func (self Column) Compile(layout *Template) string { alias = mustParse(layout.IdentifierQuote, Raw{alias}) } - return mustParse(layout.ColumnAliasLayout, column_t{name, alias}) + compiled = mustParse(layout.ColumnAliasLayout, column_t{name, alias}) case Raw: - return value.String() + compiled = value.String() + default: + compiled = fmt.Sprintf("%v", self.Value) } - return fmt.Sprintf("%v", self.Value) + layout.SetCache(self, compiled) + + return compiled } diff --git a/util/sqlgen/column_value.go b/util/sqlgen/column_value.go index 89752972..2d8dfd15 100644 --- a/util/sqlgen/column_value.go +++ b/util/sqlgen/column_value.go @@ -16,18 +16,33 @@ type columnValue_s struct { Value string } -func (self ColumnValue) Compile(layout *Template) string { +func (self ColumnValue) Compile(layout *Template) (compiled string) { + + if s, ok := layout.Cache(self); ok { + return s + } + data := columnValue_s{ self.Column.Compile(layout), self.Operator, self.Value.Compile(layout), } - return mustParse(layout.ColumnValue, data) + + compiled = mustParse(layout.ColumnValue, data) + + return } type ColumnValues []ColumnValue -func (self ColumnValues) Compile(layout *Template) string { +func (self ColumnValues) Compile(layout *Template) (compiled string) { + + /* + if s, ok := layout.Cache(self); ok { + return s + } + */ + l := len(self) out := make([]string, l) @@ -36,5 +51,7 @@ func (self ColumnValues) Compile(layout *Template) string { out[i] = self[i].Compile(layout) } - return strings.Join(out, layout.IdentifierSeparator) + compiled = strings.Join(out, layout.IdentifierSeparator) + + return } diff --git a/util/sqlgen/default.go b/util/sqlgen/default.go index 81eb4a4b..0c855a6a 100644 --- a/util/sqlgen/default.go +++ b/util/sqlgen/default.go @@ -141,4 +141,5 @@ var defaultTemplate = &Template{ defaultDropTableLayout, defaultSelectCountLayout, defaultGroupByLayout, + nil, } diff --git a/util/sqlgen/main.go b/util/sqlgen/main.go index 41801bf9..098c113c 100644 --- a/util/sqlgen/main.go +++ b/util/sqlgen/main.go @@ -24,14 +24,21 @@ type ( Extra string ) -func mustParse(text string, data interface{}) string { +var parsedTemplates = make(map[string]*template.Template) + +func mustParse(text string, data interface{}) (compiled string) { var b bytes.Buffer + var ok bool - t := template.Must(template.New("").Parse(text)) + if _, ok = parsedTemplates[text]; ok == false { + parsedTemplates[text] = template.Must(template.New("").Parse(text)) + } - if err := t.Execute(&b, data); err != nil { - panic("t.Execute: " + err.Error()) + if err := parsedTemplates[text].Execute(&b, data); err != nil { + panic("There was an error compiling the following template:\n" + text + "\nError was: " + err.Error()) } - return b.String() + compiled = b.String() + + return } diff --git a/util/sqlgen/statement.go b/util/sqlgen/statement.go index a7a8fea4..0efd906a 100644 --- a/util/sqlgen/statement.go +++ b/util/sqlgen/statement.go @@ -29,7 +29,7 @@ type statement_s struct { Where string } -func (self *Statement) Compile(layout *Template) string { +func (self *Statement) Compile(layout *Template) (compiled string) { data := statement_s{ Table: self.Table.Compile(layout), @@ -47,21 +47,24 @@ func (self *Statement) Compile(layout *Template) string { switch self.Type { case SqlTruncate: - return mustParse(layout.TruncateLayout, data) + compiled = mustParse(layout.TruncateLayout, data) case SqlDropTable: - return mustParse(layout.DropTableLayout, data) + compiled = mustParse(layout.DropTableLayout, data) case SqlDropDatabase: - return mustParse(layout.DropDatabaseLayout, data) + compiled = mustParse(layout.DropDatabaseLayout, data) case SqlSelectCount: - return mustParse(layout.SelectCountLayout, data) + compiled = mustParse(layout.SelectCountLayout, data) case SqlSelect: - return mustParse(layout.SelectLayout, data) + compiled = mustParse(layout.SelectLayout, data) case SqlDelete: - return mustParse(layout.DeleteLayout, data) + compiled = mustParse(layout.DeleteLayout, data) case SqlUpdate: - return mustParse(layout.UpdateLayout, data) + compiled = mustParse(layout.UpdateLayout, data) case SqlInsert: - return mustParse(layout.InsertLayout, data) + compiled = mustParse(layout.InsertLayout, data) + default: + compiled = "" } - return "" + + return compiled } diff --git a/util/sqlgen/table.go b/util/sqlgen/table.go index 4802b892..50331770 100644 --- a/util/sqlgen/table.go +++ b/util/sqlgen/table.go @@ -50,8 +50,13 @@ func quotedTableName(layout *Template, input string) string { return mustParse(layout.TableAliasLayout, table_t{name, alias}) } -func (self Table) Compile(layout *Template) string { +func (self Table) Hash() string { + return self.Name +} + +func (self Table) Compile(layout *Template) (compiled string) { + // Splitting tables by a comma parts := reTableSeparator.Split(self.Name, -1) l := len(parts) @@ -60,5 +65,7 @@ func (self Table) Compile(layout *Template) string { parts[i] = quotedTableName(layout, parts[i]) } - return strings.Join(parts, layout.IdentifierSeparator) + compiled = strings.Join(parts, layout.IdentifierSeparator) + + return compiled } diff --git a/util/sqlgen/template.go b/util/sqlgen/template.go index ada77c19..ac399094 100644 --- a/util/sqlgen/template.go +++ b/util/sqlgen/template.go @@ -29,4 +29,21 @@ type Template struct { DropTableLayout string SelectCountLayout string GroupByLayout string + cache map[interface{}]string +} + +func (self *Template) SetCache(key interface{}, value string) { + if self.cache == nil { + self.cache = make(map[interface{}]string) + } + self.cache[key] = value +} + +func (self *Template) Cache(key interface{}) (string, bool) { + if self.cache != nil { + if s, ok := self.cache[key]; ok { + return s, true + } + } + return "", false } -- GitLab