Skip to content

Instantly share code, notes, and snippets.

@ValeryVerkhoturov
Created September 11, 2024 14:05
Show Gist options
  • Save ValeryVerkhoturov/f6bab41eb94a62aa8df101155c1f3884 to your computer and use it in GitHub Desktop.
Save ValeryVerkhoturov/f6bab41eb94a62aa8df101155c1f3884 to your computer and use it in GitHub Desktop.
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