in domain/sequence_feature_view.go [24:192]
func NewSequenceFeatureView(view *api.FeatureView, p *Project, entity *FeatureEntity) *SequenceFeatureView {
sequenceFeatureView := &SequenceFeatureView{
FeatureView: view,
Project: p,
FeatureEntity: entity,
}
for _, field := range view.Fields {
if field.IsPrimaryKey {
sequenceFeatureView.userIdField = field.Name
break
}
}
err := json.Unmarshal([]byte(view.Config), &sequenceFeatureView.sequenceConfig)
if err != nil {
panic("sequence featureview config unmarshal failed")
}
if sequenceFeatureView.sequenceConfig.RegistrationMode == "" {
sequenceFeatureView.sequenceConfig.RegistrationMode = constants.Seq_Registration_Mode_Full_Sequence
}
sequenceFeatureView.offline_2_online_seq_map = make(map[string]string, len(sequenceFeatureView.sequenceConfig.SeqConfig))
for _, field := range view.Fields {
if field.IsPartition {
continue
} else {
sequenceFeatureView.behaviorFields = append(sequenceFeatureView.behaviorFields, field.Name)
}
}
if sequenceFeatureView.sequenceConfig.RegistrationMode == constants.Seq_Registration_Mode_Full_Sequence {
for _, seqConfig := range sequenceFeatureView.sequenceConfig.SeqConfig {
sequenceFeatureView.offline_2_online_seq_map[seqConfig.OfflineSeqName] = seqConfig.OnlineSeqName
}
seen := make(map[string]bool)
var uniqueSeqConfigs []*api.SeqConfig
for _, seqConfig := range sequenceFeatureView.sequenceConfig.SeqConfig {
if !seen[seqConfig.OnlineSeqName] {
uniqueSeqConfigs = append(uniqueSeqConfigs, seqConfig)
seen[seqConfig.OnlineSeqName] = true
}
}
sequenceFeatureView.sequenceConfig.SeqConfig = uniqueSeqConfigs
}
requiredElements1 := []string{"user_id", "item_id", "event"}
requiredElements2 := []string{"user_id", "item_id", "event", "timestamp"}
if len(sequenceFeatureView.sequenceConfig.DeduplicationMethod) == len(requiredElements1) {
for i, v := range sequenceFeatureView.sequenceConfig.DeduplicationMethod {
if v != requiredElements1[i] {
panic("deduplication_method invalid")
}
}
sequenceFeatureView.sequenceConfig.DeduplicationMethodNum = 1
} else if len(sequenceFeatureView.sequenceConfig.DeduplicationMethod) == len(requiredElements2) {
for i, v := range sequenceFeatureView.sequenceConfig.DeduplicationMethod {
if v != requiredElements2[i] {
panic("deduplication_method invalid")
}
}
sequenceFeatureView.sequenceConfig.DeduplicationMethodNum = 2
} else {
panic("deduplication_method invalid")
}
daoConfig := dao.DaoConfig{
DatasourceType: p.OnlineDatasourceType,
PrimaryKeyField: sequenceFeatureView.userIdField,
}
if view.WriteToFeatureDB || p.OnlineDatasourceType == constants.Datasource_Type_FeatureDB {
daoConfig.DatasourceType = constants.Datasource_Type_FeatureDB
daoConfig.FeatureDBDatabaseName = p.InstanceId
daoConfig.FeatureDBSchemaName = p.ProjectName
if sequenceFeatureView.sequenceConfig.ReferencedFeatureViewId == 0 {
daoConfig.FeatureDBTableName = sequenceFeatureView.Name
} else {
daoConfig.FeatureDBTableName = sequenceFeatureView.sequenceConfig.ReferencedFeatureViewName
}
daoConfig.FeatureDBSignature = p.Signature
fieldTypeMap := make(map[string]constants.FSType, len(view.Fields))
for _, field := range view.Fields {
if field.IsPartition {
continue
} else {
fieldTypeMap[field.Name] = field.Type
}
}
daoConfig.FieldTypeMap = fieldTypeMap
daoConfig.Fields = sequenceFeatureView.behaviorFields
} else {
if sequenceFeatureView.sequenceConfig.ReferencedFeatureViewId == 0 {
switch p.OnlineDatasourceType {
case constants.Datasource_Type_Hologres:
daoConfig.HologresName = p.OnlineStore.GetDatasourceName()
daoConfig.HologresOfflineTableName = p.OnlineStore.GetSeqOfflineTableName(sequenceFeatureView)
daoConfig.HologresOnlineTableName = p.OnlineStore.GetSeqOnlineTableName(sequenceFeatureView)
case constants.Datasource_Type_TableStore:
daoConfig.TableStoreName = p.OnlineStore.GetDatasourceName()
daoConfig.TableStoreOfflineTableName = p.OnlineStore.GetSeqOfflineTableName(sequenceFeatureView)
daoConfig.TableStoreOnlineTableName = p.OnlineStore.GetSeqOnlineTableName(sequenceFeatureView)
case constants.Datasource_Type_IGraph:
daoConfig.SaveOriginalField = true
daoConfig.IGraphName = p.OnlineStore.GetDatasourceName()
daoConfig.GroupName = p.ProjectName
daoConfig.IgraphEdgeName = p.OnlineStore.GetSeqOnlineTableName(sequenceFeatureView)
fieldTypeMap := make(map[string]constants.FSType, len(view.Fields))
for _, field := range view.Fields {
if field.IsPartition {
continue
} else {
fieldTypeMap[field.Name] = field.Type
}
}
daoConfig.FieldTypeMap = fieldTypeMap
default:
}
} else {
referencedFeatureView := p.GetFeatureView(sequenceFeatureView.sequenceConfig.ReferencedFeatureViewName)
if referencedFeatureView == nil {
panic(fmt.Sprintf("referenced feature view :%s not found", sequenceFeatureView.sequenceConfig.ReferencedFeatureViewName))
}
if referencedFeatureView.GetType() != constants.Feature_View_Type_Sequence {
panic(fmt.Sprintf("referenced feature view :%s is not sequence feature view", sequenceFeatureView.sequenceConfig.ReferencedFeatureViewName))
}
referencedSeqFeatureView := referencedFeatureView.(*SequenceFeatureView)
switch p.OnlineDatasourceType {
case constants.Datasource_Type_Hologres:
daoConfig.HologresName = p.OnlineStore.GetDatasourceName()
daoConfig.HologresOfflineTableName = p.OnlineStore.GetSeqOfflineTableName(referencedSeqFeatureView)
daoConfig.HologresOnlineTableName = p.OnlineStore.GetSeqOnlineTableName(referencedSeqFeatureView)
case constants.Datasource_Type_TableStore:
daoConfig.TableStoreName = p.OnlineStore.GetDatasourceName()
daoConfig.TableStoreOfflineTableName = p.OnlineStore.GetSeqOfflineTableName(referencedSeqFeatureView)
daoConfig.TableStoreOnlineTableName = p.OnlineStore.GetSeqOnlineTableName(referencedSeqFeatureView)
case constants.Datasource_Type_IGraph:
daoConfig.SaveOriginalField = true
daoConfig.IGraphName = p.OnlineStore.GetDatasourceName()
daoConfig.GroupName = p.ProjectName
daoConfig.IgraphEdgeName = p.OnlineStore.GetSeqOnlineTableName(referencedSeqFeatureView)
fieldTypeMap := make(map[string]constants.FSType, len(view.Fields))
for _, field := range view.Fields {
if field.IsPartition {
continue
} else {
fieldTypeMap[field.Name] = field.Type
}
}
daoConfig.FieldTypeMap = fieldTypeMap
default:
}
}
}
featureViewDao := dao.NewFeatureViewDao(daoConfig)
sequenceFeatureView.featureViewDao = featureViewDao
return sequenceFeatureView
}