make it faster

This commit is contained in:
Kenta420 2023-10-18 16:20:22 +07:00
parent 728b92228b
commit 196cc8e843
2 changed files with 104 additions and 14 deletions

View file

@ -1,4 +1,4 @@
export const environment = {
production: true,
api: '',
api: 'https://recipe.taobin.io:8090/api/',
};

View file

@ -7,6 +7,7 @@ import (
"path/filepath"
"recipe-manager/models"
"sort"
"time"
)
func readFile(version string) *models.Recipe {
@ -32,10 +33,16 @@ func readFile(version string) *models.Recipe {
return data
}
type RecipeWithTimeStamps struct {
Recipe models.Recipe
TimeStamps int64
}
type Data struct {
CurrentVersion string
AllVersions []string
recipe *models.Recipe
currentRecipe *models.Recipe
recipeMap map[string]RecipeWithTimeStamps
}
func NewData() *Data {
@ -65,42 +72,102 @@ func NewData() *Data {
files[i] = filepath.Base(files[i])
}
defaultVersion := "coffeethai02_580.json"
defaultRecipe := readFile(defaultVersion)
return &Data{
CurrentVersion: "coffeethai02_580.json",
CurrentVersion: defaultVersion,
AllVersions: files,
recipe: readFile("coffeethai02_580.json"),
currentRecipe: defaultRecipe,
recipeMap: map[string]RecipeWithTimeStamps{
defaultVersion: {
Recipe: *defaultRecipe,
TimeStamps: time.Now().Unix(),
},
},
}
}
func (d *Data) GetRecipe(version string) models.Recipe {
if version == "" || version == d.CurrentVersion {
return *d.recipe
return *d.currentRecipe
}
log.Println("Change recipe to version:", version)
if recipe, ok := d.recipeMap[version]; ok {
d.CurrentVersion = version
return recipe.Recipe
}
// change current version and read new recipe
d.CurrentVersion = version
d.recipe = readFile(version)
return *d.recipe
d.currentRecipe = readFile(version)
// save to map
if len(d.recipeMap) > 5 { // limit keep in memory 5 version
// remove oldest version
var oldestVersion string
var oldestTime int64
for k, v := range d.recipeMap {
if oldestTime == 0 || v.TimeStamps < oldestTime {
oldestTime = v.TimeStamps
oldestVersion = k
}
}
delete(d.recipeMap, oldestVersion)
}
d.recipeMap[version] = RecipeWithTimeStamps{
Recipe: *d.currentRecipe,
TimeStamps: time.Now().Unix(),
}
return *d.currentRecipe
}
func (d *Data) GetRecipe01() []models.Recipe01 {
return d.recipe.Recipe01
return d.currentRecipe.Recipe01
}
func (d *Data) GetMaterialSetting(version string) []models.MaterialSetting {
result := make([]models.MaterialSetting, 0)
if version == "" || version == d.CurrentVersion {
copy(result, d.recipe.MaterialSetting)
copy(result, d.currentRecipe.MaterialSetting)
return result
}
if recipe, ok := d.recipeMap[version]; ok {
copy(result, recipe.Recipe.MaterialSetting)
d.CurrentVersion = version
return result
}
d.CurrentVersion = version
d.recipe = readFile(version)
copy(result, d.recipe.MaterialSetting)
d.currentRecipe = readFile(version)
// save to map
if len(d.recipeMap) > 5 { // limit keep in memory 5 version
// remove oldest version
var oldestVersion string
var oldestTime int64
for k, v := range d.recipeMap {
if oldestTime == 0 || v.TimeStamps < oldestTime {
oldestTime = v.TimeStamps
oldestVersion = k
}
}
delete(d.recipeMap, oldestVersion)
}
d.recipeMap[version] = RecipeWithTimeStamps{
Recipe: *d.currentRecipe,
TimeStamps: time.Now().Unix(),
}
copy(result, d.currentRecipe.MaterialSetting)
return result
}
@ -108,11 +175,34 @@ func (d *Data) GetMaterialCode(ids []uint64, version string) []models.MaterialCo
var result []models.MaterialCode
if version == "" || version == d.CurrentVersion {
result = d.recipe.MaterialCode
result = d.currentRecipe.MaterialCode
} else if recipe, ok := d.recipeMap[version]; ok {
d.CurrentVersion = version
return recipe.Recipe.MaterialCode
} else {
d.CurrentVersion = version
d.recipe = readFile(version)
result = d.recipe.MaterialCode
d.currentRecipe = readFile(version)
// save to map
if len(d.recipeMap) > 5 { // limit keep in memory 5 version
// remove oldest version
var oldestVersion string
var oldestTime int64
for k, v := range d.recipeMap {
if oldestTime == 0 || v.TimeStamps < oldestTime {
oldestTime = v.TimeStamps
oldestVersion = k
}
}
delete(d.recipeMap, oldestVersion)
}
d.recipeMap[version] = RecipeWithTimeStamps{
Recipe: *d.currentRecipe,
TimeStamps: time.Now().Unix(),
}
result = d.currentRecipe.MaterialCode
}
if len(ids) == 0 {