Browse Source

Reduce MySQL queries, preload User

Vova Tkach 5 years ago
parent
commit
4acd8d3ff8
5 changed files with 142 additions and 67 deletions
  1. 11 6
      engine/fetdata/fetdata.go
  2. 5 5
      modules/module_api.go
  3. 47 19
      modules/module_blog.go
  4. 28 14
      modules/module_index.go
  5. 51 23
      modules/module_shop.go

+ 11 - 6
engine/fetdata/fetdata.go

@@ -17,24 +17,29 @@ type FERData struct {
 	Shop *Shop
 }
 
-func New(wrap *wrapper.Wrapper, drow interface{}, is404 bool) *FERData {
+func New(wrap *wrapper.Wrapper, is404 bool, drow interface{}, duser *utils.MySql_user) *FERData {
 	var d_Page *Page
 	var d_Blog *Blog
 	var d_Shop *Shop
 
+	var preUser *User
+	if duser != nil {
+		preUser = &User{wrap: wrap, object: duser}
+	}
+
 	if wrap.CurrModule == "index" {
 		if o, ok := drow.(*utils.MySql_page); ok {
-			d_Page = &Page{wrap: wrap, object: o}
+			d_Page = &Page{wrap: wrap, object: o, user: preUser}
 		}
 	} else if wrap.CurrModule == "blog" {
 		if len(wrap.UrlArgs) == 3 && wrap.UrlArgs[0] == "blog" && wrap.UrlArgs[1] == "category" && wrap.UrlArgs[2] != "" {
 			if o, ok := drow.(*utils.MySql_blog_category); ok {
-				d_Blog = &Blog{wrap: wrap, category: (&BlogCategory{wrap: wrap, object: o}).load(nil)}
+				d_Blog = &Blog{wrap: wrap, category: (&BlogCategory{wrap: wrap, object: o, user: preUser}).load(nil)}
 				d_Blog.load()
 			}
 		} else if len(wrap.UrlArgs) == 2 && wrap.UrlArgs[0] == "blog" && wrap.UrlArgs[1] != "" {
 			if o, ok := drow.(*utils.MySql_blog_post); ok {
-				d_Blog = &Blog{wrap: wrap, post: (&BlogPost{wrap: wrap, object: o}).load()}
+				d_Blog = &Blog{wrap: wrap, post: (&BlogPost{wrap: wrap, object: o, user: preUser}).load()}
 			}
 		} else {
 			d_Blog = &Blog{wrap: wrap}
@@ -43,12 +48,12 @@ func New(wrap *wrapper.Wrapper, drow interface{}, is404 bool) *FERData {
 	} else if wrap.CurrModule == "shop" {
 		if len(wrap.UrlArgs) == 3 && wrap.UrlArgs[0] == "shop" && wrap.UrlArgs[1] == "category" && wrap.UrlArgs[2] != "" {
 			if o, ok := drow.(*utils.MySql_shop_category); ok {
-				d_Shop = &Shop{wrap: wrap, category: (&ShopCategory{wrap: wrap, object: o}).load(nil)}
+				d_Shop = &Shop{wrap: wrap, category: (&ShopCategory{wrap: wrap, object: o, user: preUser}).load(nil)}
 				d_Shop.load()
 			}
 		} else if len(wrap.UrlArgs) == 2 && wrap.UrlArgs[0] == "shop" && wrap.UrlArgs[1] != "" {
 			if o, ok := drow.(*utils.MySql_shop_product); ok {
-				d_Shop = &Shop{wrap: wrap, product: (&ShopProduct{wrap: wrap, object: o}).load()}
+				d_Shop = &Shop{wrap: wrap, product: (&ShopProduct{wrap: wrap, object: o, user: preUser}).load()}
 			}
 		} else {
 			d_Shop = &Shop{wrap: wrap}

+ 5 - 5
modules/module_api.go

@@ -72,7 +72,7 @@ func (this *Modules) RegisterModule_Api() *Module {
 			wrap.W.Write([]byte("Fave engine API mount point!"))
 		} else {
 			// User error 404 page
-			wrap.RenderFrontEnd("404", fetdata.New(wrap, nil, true), http.StatusNotFound)
+			wrap.RenderFrontEnd("404", fetdata.New(wrap, true, nil, nil), http.StatusNotFound)
 			return
 		}
 	}, func(wrap *wrapper.Wrapper) (string, string, string) {
@@ -116,7 +116,7 @@ func (this *Modules) RegisterModule_ApiProducts() *Module {
 				original_file := wrap.DHtdocs + string(os.PathSeparator) + "products" + string(os.PathSeparator) + "images" + string(os.PathSeparator) + wrap.UrlArgs[2] + string(os.PathSeparator) + file_name
 				if !utils.IsFileExists(original_file) {
 					// User error 404 page
-					wrap.RenderFrontEnd("404", fetdata.New(wrap, nil, true), http.StatusNotFound)
+					wrap.RenderFrontEnd("404", fetdata.New(wrap, true, nil, nil), http.StatusNotFound)
 					return
 				}
 
@@ -161,7 +161,7 @@ func (this *Modules) RegisterModule_ApiProducts() *Module {
 
 					if !ok {
 						// User error 404 page
-						wrap.RenderFrontEnd("404", fetdata.New(wrap, nil, true), http.StatusNotFound)
+						wrap.RenderFrontEnd("404", fetdata.New(wrap, true, nil, nil), http.StatusNotFound)
 						return
 					}
 
@@ -178,12 +178,12 @@ func (this *Modules) RegisterModule_ApiProducts() *Module {
 				}
 			} else {
 				// User error 404 page
-				wrap.RenderFrontEnd("404", fetdata.New(wrap, nil, true), http.StatusNotFound)
+				wrap.RenderFrontEnd("404", fetdata.New(wrap, true, nil, nil), http.StatusNotFound)
 				return
 			}
 		} else {
 			// User error 404 page
-			wrap.RenderFrontEnd("404", fetdata.New(wrap, nil, true), http.StatusNotFound)
+			wrap.RenderFrontEnd("404", fetdata.New(wrap, true, nil, nil), http.StatusNotFound)
 			return
 		}
 	}, func(wrap *wrapper.Wrapper) (string, string, string) {

+ 47 - 19
modules/module_blog.go

@@ -35,6 +35,7 @@ func (this *Modules) RegisterModule_Blog() *Module {
 		if len(wrap.UrlArgs) == 3 && wrap.UrlArgs[0] == "blog" && wrap.UrlArgs[1] == "category" && wrap.UrlArgs[2] != "" {
 			// Blog category
 			row := &utils.MySql_blog_category{}
+			rou := &utils.MySql_user{}
 			err := wrap.DB.QueryRow(`
 				SELECT
 					main.id,
@@ -44,7 +45,13 @@ func (this *Modules) RegisterModule_Blog() *Module {
 					main.lft,
 					main.rgt,
 					main.depth,
-					parent.id AS parent_id
+					parent.id AS parent_id,
+					users.id,
+					users.first_name,
+					users.last_name,
+					users.email,
+					users.admin,
+					users.active
 				FROM
 					(
 						SELECT
@@ -87,6 +94,7 @@ func (this *Modules) RegisterModule_Blog() *Module {
 					parent.depth = main.depth AND
 					main.lft > parent.lft AND
 					main.rgt < parent.rgt
+					LEFT JOIN users ON users.id = main.user
 				WHERE
 					main.id > 1 AND
 					main.alias = ?
@@ -103,6 +111,12 @@ func (this *Modules) RegisterModule_Blog() *Module {
 				&row.A_rgt,
 				&row.A_depth,
 				&row.A_parent,
+				&rou.A_id,
+				&rou.A_first_name,
+				&rou.A_last_name,
+				&rou.A_email,
+				&rou.A_admin,
+				&rou.A_active,
 			)
 
 			if err != nil && err != wrapper.ErrNoRows {
@@ -111,7 +125,7 @@ func (this *Modules) RegisterModule_Blog() *Module {
 				return
 			} else if err == wrapper.ErrNoRows {
 				// User error 404 page
-				wrap.RenderFrontEnd("404", fetdata.New(wrap, nil, true), http.StatusNotFound)
+				wrap.RenderFrontEnd("404", fetdata.New(wrap, true, nil, nil), http.StatusNotFound)
 				return
 			}
 
@@ -122,27 +136,35 @@ func (this *Modules) RegisterModule_Blog() *Module {
 			}
 
 			// Render template
-			wrap.RenderFrontEnd("blog-category", fetdata.New(wrap, row, false), http.StatusOK)
+			wrap.RenderFrontEnd("blog-category", fetdata.New(wrap, false, row, rou), http.StatusOK)
 			return
 		} else if len(wrap.UrlArgs) == 2 && wrap.UrlArgs[0] == "blog" && wrap.UrlArgs[1] != "" {
 			// Blog post
 			row := &utils.MySql_blog_post{}
+			rou := &utils.MySql_user{}
 			err := wrap.DB.QueryRow(`
 				SELECT
-					id,
-					user,
-					name,
-					alias,
-					category,
-					briefly,
-					content,
-					UNIX_TIMESTAMP(datetime) as datetime,
-					active
+					blog_posts.id,
+					blog_posts.user,
+					blog_posts.name,
+					blog_posts.alias,
+					blog_posts.category,
+					blog_posts.briefly,
+					blog_posts.content,
+					UNIX_TIMESTAMP(blog_posts.datetime) as datetime,
+					blog_posts.active,
+					users.id,
+					users.first_name,
+					users.last_name,
+					users.email,
+					users.admin,
+					users.active
 				FROM
 					blog_posts
+					LEFT JOIN users ON users.id = blog_posts.user
 				WHERE
-					active = 1 and
-					alias = ?
+					blog_posts.active = 1 and
+					blog_posts.alias = ?
 				LIMIT 1;`,
 				wrap.UrlArgs[1],
 			).Scan(
@@ -155,6 +177,12 @@ func (this *Modules) RegisterModule_Blog() *Module {
 				&row.A_content,
 				&row.A_datetime,
 				&row.A_active,
+				&rou.A_id,
+				&rou.A_first_name,
+				&rou.A_last_name,
+				&rou.A_email,
+				&rou.A_admin,
+				&rou.A_active,
 			)
 
 			if err != nil && err != wrapper.ErrNoRows {
@@ -163,7 +191,7 @@ func (this *Modules) RegisterModule_Blog() *Module {
 				return
 			} else if err == wrapper.ErrNoRows {
 				// User error 404 page
-				wrap.RenderFrontEnd("404", fetdata.New(wrap, nil, true), http.StatusNotFound)
+				wrap.RenderFrontEnd("404", fetdata.New(wrap, true, nil, nil), http.StatusNotFound)
 				return
 			}
 
@@ -174,7 +202,7 @@ func (this *Modules) RegisterModule_Blog() *Module {
 			}
 
 			// Render template
-			wrap.RenderFrontEnd("blog-post", fetdata.New(wrap, row, false), http.StatusOK)
+			wrap.RenderFrontEnd("blog-post", fetdata.New(wrap, false, row, rou), http.StatusOK)
 			return
 		} else if len(wrap.UrlArgs) == 1 && wrap.UrlArgs[0] == "blog" {
 			// Blog
@@ -186,16 +214,16 @@ func (this *Modules) RegisterModule_Blog() *Module {
 			}
 
 			// Render template
-			wrap.RenderFrontEnd("blog", fetdata.New(wrap, nil, false), http.StatusOK)
+			wrap.RenderFrontEnd("blog", fetdata.New(wrap, false, nil, nil), http.StatusOK)
 			return
 		} else if (*wrap.Config).Engine.MainModule == 1 {
 			// Render template
-			wrap.RenderFrontEnd("blog", fetdata.New(wrap, nil, false), http.StatusOK)
+			wrap.RenderFrontEnd("blog", fetdata.New(wrap, false, nil, nil), http.StatusOK)
 			return
 		}
 
 		// User error 404 page
-		wrap.RenderFrontEnd("404", fetdata.New(wrap, nil, true), http.StatusNotFound)
+		wrap.RenderFrontEnd("404", fetdata.New(wrap, true, nil, nil), http.StatusNotFound)
 	}, func(wrap *wrapper.Wrapper) (string, string, string) {
 		content := ""
 		sidebar := ""

+ 28 - 14
modules/module_index.go

@@ -27,23 +27,31 @@ func (this *Modules) RegisterModule_Index() *Module {
 	}, func(wrap *wrapper.Wrapper) {
 		// Front-end
 		row := &utils.MySql_page{}
+		rou := &utils.MySql_user{}
 		err := wrap.DB.QueryRow(`
 			SELECT
-				id,
-				user,
-				name,
-				alias,
-				content,
-				meta_title,
-				meta_keywords,
-				meta_description,
-				UNIX_TIMESTAMP(datetime) as datetime,
-				active
+				pages.id,
+				pages.user,
+				pages.name,
+				pages.alias,
+				pages.content,
+				pages.meta_title,
+				pages.meta_keywords,
+				pages.meta_description,
+				UNIX_TIMESTAMP(pages.datetime) as datetime,
+				pages.active,
+				users.id,
+				users.first_name,
+				users.last_name,
+				users.email,
+				users.admin,
+				users.active
 			FROM
 				pages
+				LEFT JOIN users ON users.id = pages.user
 			WHERE
-				active = 1 and
-				alias = ?
+				pages.active = 1 and
+				pages.alias = ?
 			LIMIT 1;`,
 			wrap.R.URL.Path,
 		).Scan(
@@ -57,6 +65,12 @@ func (this *Modules) RegisterModule_Index() *Module {
 			&row.A_meta_description,
 			&row.A_datetime,
 			&row.A_active,
+			&rou.A_id,
+			&rou.A_first_name,
+			&rou.A_last_name,
+			&rou.A_email,
+			&rou.A_admin,
+			&rou.A_active,
 		)
 		if err != nil && err != wrapper.ErrNoRows {
 			// System error 500
@@ -64,7 +78,7 @@ func (this *Modules) RegisterModule_Index() *Module {
 			return
 		} else if err == wrapper.ErrNoRows {
 			// User error 404 page
-			wrap.RenderFrontEnd("404", fetdata.New(wrap, nil, true), http.StatusNotFound)
+			wrap.RenderFrontEnd("404", fetdata.New(wrap, true, nil, nil), http.StatusNotFound)
 			return
 		}
 
@@ -75,7 +89,7 @@ func (this *Modules) RegisterModule_Index() *Module {
 		}
 
 		// Render template
-		wrap.RenderFrontEnd(tname, fetdata.New(wrap, row, false), http.StatusOK)
+		wrap.RenderFrontEnd(tname, fetdata.New(wrap, false, row, rou), http.StatusOK)
 	}, func(wrap *wrapper.Wrapper) (string, string, string) {
 		content := ""
 		sidebar := ""

+ 51 - 23
modules/module_shop.go

@@ -277,6 +277,7 @@ func (this *Modules) RegisterModule_Shop() *Module {
 		if len(wrap.UrlArgs) == 3 && wrap.UrlArgs[0] == "shop" && wrap.UrlArgs[1] == "category" && wrap.UrlArgs[2] != "" {
 			// Shop category
 			row := &utils.MySql_shop_category{}
+			rou := &utils.MySql_user{}
 			err := wrap.DB.QueryRow(`
 				SELECT
 					main.id,
@@ -286,7 +287,13 @@ func (this *Modules) RegisterModule_Shop() *Module {
 					main.lft,
 					main.rgt,
 					main.depth,
-					parent.id AS parent_id
+					parent.id AS parent_id,
+					users.id,
+					users.first_name,
+					users.last_name,
+					users.email,
+					users.admin,
+					users.active
 				FROM
 					(
 						SELECT
@@ -329,6 +336,7 @@ func (this *Modules) RegisterModule_Shop() *Module {
 					parent.depth = main.depth AND
 					main.lft > parent.lft AND
 					main.rgt < parent.rgt
+					LEFT JOIN users ON users.id = main.user
 				WHERE
 					main.id > 1 AND
 					main.alias = ?
@@ -345,6 +353,12 @@ func (this *Modules) RegisterModule_Shop() *Module {
 				&row.A_rgt,
 				&row.A_depth,
 				&row.A_parent,
+				&rou.A_id,
+				&rou.A_first_name,
+				&rou.A_last_name,
+				&rou.A_email,
+				&rou.A_admin,
+				&rou.A_active,
 			)
 
 			if err != nil && err != wrapper.ErrNoRows {
@@ -353,7 +367,7 @@ func (this *Modules) RegisterModule_Shop() *Module {
 				return
 			} else if err == wrapper.ErrNoRows {
 				// User error 404 page
-				wrap.RenderFrontEnd("404", fetdata.New(wrap, nil, true), http.StatusNotFound)
+				wrap.RenderFrontEnd("404", fetdata.New(wrap, true, nil, nil), http.StatusNotFound)
 				return
 			}
 
@@ -364,31 +378,39 @@ func (this *Modules) RegisterModule_Shop() *Module {
 			}
 
 			// Render template
-			wrap.RenderFrontEnd("shop-category", fetdata.New(wrap, row, false), http.StatusOK)
+			wrap.RenderFrontEnd("shop-category", fetdata.New(wrap, false, row, rou), http.StatusOK)
 			return
 		} else if len(wrap.UrlArgs) == 2 && wrap.UrlArgs[0] == "shop" && wrap.UrlArgs[1] != "" {
 			// Shop product
 			row := &utils.MySql_shop_product{}
+			rou := &utils.MySql_user{}
 			err := wrap.DB.QueryRow(`
 				SELECT
-					id,
-					user,
-					currency,
-					price,
-					name,
-					alias,
-					vendor,
-					quantity,
-					category,
-					briefly,
-					content,
-					UNIX_TIMESTAMP(datetime) as datetime,
-					active
+					shop_products.id,
+					shop_products.user,
+					shop_products.currency,
+					shop_products.price,
+					shop_products.name,
+					shop_products.alias,
+					shop_products.vendor,
+					shop_products.quantity,
+					shop_products.category,
+					shop_products.briefly,
+					shop_products.content,
+					UNIX_TIMESTAMP(shop_products.datetime) as datetime,
+					shop_products.active,
+					users.id,
+					users.first_name,
+					users.last_name,
+					users.email,
+					users.admin,
+					users.active
 				FROM
 					shop_products
+					LEFT JOIN users ON users.id = shop_products.user
 				WHERE
-					active = 1 and
-					alias = ?
+					shop_products.active = 1 and
+					shop_products.alias = ?
 				LIMIT 1;`,
 				wrap.UrlArgs[1],
 			).Scan(
@@ -405,6 +427,12 @@ func (this *Modules) RegisterModule_Shop() *Module {
 				&row.A_content,
 				&row.A_datetime,
 				&row.A_active,
+				&rou.A_id,
+				&rou.A_first_name,
+				&rou.A_last_name,
+				&rou.A_email,
+				&rou.A_admin,
+				&rou.A_active,
 			)
 
 			if err != nil && err != wrapper.ErrNoRows {
@@ -413,7 +441,7 @@ func (this *Modules) RegisterModule_Shop() *Module {
 				return
 			} else if err == wrapper.ErrNoRows {
 				// User error 404 page
-				wrap.RenderFrontEnd("404", fetdata.New(wrap, nil, true), http.StatusNotFound)
+				wrap.RenderFrontEnd("404", fetdata.New(wrap, true, nil, nil), http.StatusNotFound)
 				return
 			}
 
@@ -424,7 +452,7 @@ func (this *Modules) RegisterModule_Shop() *Module {
 			}
 
 			// Render template
-			wrap.RenderFrontEnd("shop-product", fetdata.New(wrap, row, false), http.StatusOK)
+			wrap.RenderFrontEnd("shop-product", fetdata.New(wrap, false, row, rou), http.StatusOK)
 			return
 		} else if len(wrap.UrlArgs) == 1 && wrap.UrlArgs[0] == "shop" {
 			// Shop
@@ -436,16 +464,16 @@ func (this *Modules) RegisterModule_Shop() *Module {
 			}
 
 			// Render template
-			wrap.RenderFrontEnd("shop", fetdata.New(wrap, nil, false), http.StatusOK)
+			wrap.RenderFrontEnd("shop", fetdata.New(wrap, false, nil, nil), http.StatusOK)
 			return
 		} else if (*wrap.Config).Engine.MainModule == 2 {
 			// Render template
-			wrap.RenderFrontEnd("shop", fetdata.New(wrap, nil, false), http.StatusOK)
+			wrap.RenderFrontEnd("shop", fetdata.New(wrap, false, nil, nil), http.StatusOK)
 			return
 		}
 
 		// User error 404 page
-		wrap.RenderFrontEnd("404", fetdata.New(wrap, nil, true), http.StatusNotFound)
+		wrap.RenderFrontEnd("404", fetdata.New(wrap, true, nil, nil), http.StatusNotFound)
 	}, func(wrap *wrapper.Wrapper) (string, string, string) {
 		content := ""
 		sidebar := ""