Created
September 11, 2024 14:05
-
-
Save ValeryVerkhoturov/f6bab41eb94a62aa8df101155c1f3884 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"gorm.io/gorm" | |
"gorm.io/gorm/clause" | |
) | |
var ( | |
db gorm.DB | |
) | |
type TDocument struct { | |
Url string `gorm:"index:idx_key,unique"` // URL документа, его уникальный идентификатор | |
PubDate uint64 // время заявляемой публикации документа | |
FetchTime uint64 `gorm:"index:idx_key,unique"` // время получения данного обновления документа, может рассматриваться как идентификатор версии. Пара (Url, FetchTime) уникальна. | |
Text string // текст документа | |
FirstFetchTime uint64 // изначально отсутствует, необходимо заполнить | |
} | |
type TDocumentDbModel struct { | |
Id uint | |
Url string `gorm:"index:idx_key,unique"` // URL документа, его уникальный идентификатор | |
PubDate uint64 // время заявляемой публикации документа | |
FetchTime uint64 `gorm:"index:idx_key,unique"` // время получения данного обновления документа, может рассматриваться как идентификатор версии. Пара (Url, FetchTime) уникальна. | |
Text string // текст документа | |
FirstFetchTime uint64 // изначально отсутствует, необходимо заполнить | |
} | |
func main() { | |
db.AutoMigrate(&TDocumentDbModel{}) | |
//fmt.Println(Process()) | |
} | |
func Process(input TDocument) *TDocument { | |
dbModel := mapTDocumentDbModel(input) | |
var tempValues []TDocumentDbModel | |
db.Clauses(clause.Locking{Strength: "UPDATE"}).Where("url = ?", dbModel.Url).Find(&tempValues) | |
db.Create(&dbModel) | |
input.cond1() | |
input.cond2() | |
input.cond3() | |
return &input | |
} | |
func DeleteTempValues() { | |
var fetchedFirst []TDocumentDbModel | |
db.Model(&TDocumentDbModel{}).Distinct("url", "fetch_time").Where("fetch_time DESC").Find(&fetchedFirst) | |
var fetchedLast []TDocumentDbModel | |
db.Model(&TDocumentDbModel{}).Distinct("url", "fetch_time").Where("fetch_time ASC").Find(&fetchedLast) | |
db.Exec("TRUNCATE TABLE t_document_db_model") | |
db.Save(&fetchedFirst) | |
db.Save(&fetchedLast) | |
} | |
func (receiver *TDocument) cond1() { | |
// Поле Text и FetchTime должны быть такими, какими были в документе с наибольшим FetchTime, полученным на данный момент | |
var fetched TDocumentDbModel | |
db.Model(&TDocumentDbModel{}).Where("url = ?", receiver.Url).Order("fetch_time DESC").First(&fetched) | |
receiver.Text = fetched.Text | |
receiver.FetchTime = fetched.FetchTime | |
} | |
func (receiver *TDocument) cond2() { | |
// Поле PubDate должно быть таким, каким было у сообщения с наименьшим FetchTime | |
var fetched TDocumentDbModel | |
db.Model(&TDocumentDbModel{}).Where("url = ?", receiver.Url).Order("fetch_time ASC").First(&fetched) | |
receiver.PubDate = fetched.PubDate | |
} | |
func (receiver *TDocument) cond3() { | |
// Поле FirstFetchTime должно быть равно минимальному значению FetchTime | |
var fetched TDocumentDbModel | |
db.Model(&TDocumentDbModel{}).Where("url = ?", receiver.Url).Order("fetch_time ASC").First(&fetched) | |
receiver.FirstFetchTime = fetched.FetchTime | |
} | |
func mapTDocumentDbModel(input TDocument) TDocumentDbModel { | |
return TDocumentDbModel{ | |
Url: input.Url, | |
PubDate: input.PubDate, | |
FetchTime: input.FetchTime, | |
Text: input.Text, | |
FirstFetchTime: input.FirstFetchTime, | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment