func NewFeatureBeDao()

in module/feature_be_dao.go [65:198]


func NewFeatureBeDao(config recconf.FeatureDaoConfig) *FeatureBeDao {
	var rtCntWins []int
	if config.FeatureType == Feature_Type_RT_Cnt {
		rtCntWinToks := strings.Split(config.RTCntWins, ",")
		for _, winTok := range rtCntWinToks {
			tWin := utils.ToInt(winTok, -1)
			if tWin <= 0 {
				log.Error(fmt.Sprintf("invalid rtCntWins: %s", winTok))
				return nil
			}
			rtCntWins = append(rtCntWins, tWin)
		}
	}
	var beRTCntFields []RTCntField
	var outRTCntFieldAlias []string
	if config.FeatureType == Feature_Type_RT_Cnt {
		if len(config.BeRTCntFieldInfo) > 0 {
			for fieldId, fieldInfo := range config.BeRTCntFieldInfo {
				tmpToks := fieldInfo.FieldNames
				for tid := range tmpToks {
					tmpToks[tid] = strings.TrimSpace(tmpToks[tid])
				}
				var delimToks []string
				if len(fieldInfo.Delims) > 0 {
					delimToks = fieldInfo.Delims
				} else {
					for i := 0; i < len(tmpToks); i++ {
						delimToks = append(delimToks, "")
					}
				}
				if len(delimToks) != len(tmpToks) {
					log.Error(fmt.Sprintf("len(fieldToks) != len(delimToks): %d vs %d, fieldId=%d, fieldTok=%s, delimStr=%s",
						len(tmpToks), len(delimToks), fieldId,
						strings.Join(fieldInfo.FieldNames, ":"),
						strings.Join(fieldInfo.Delims, ":")))
					return nil
				}
				beRTCntFields = append(beRTCntFields,
					RTCntField{tmpToks, delimToks})
				tmpAlias := strings.TrimSpace(fieldInfo.Alias)
				if len(tmpAlias) == 0 {
					tmpAlias = tmpToks[0]
				}
				outRTCntFieldAlias = append(outRTCntFieldAlias, tmpAlias)
			}
		} else { // [deprecicated], to be compatible with existing config
			rtCntFields := strings.Split(config.BeRTCntFields, ",")
			for _, fieldTok := range rtCntFields {
				tmpToks := strings.Split(fieldTok, ":")
				for tid := range tmpToks {
					tmpToks[tid] = strings.TrimSpace(tmpToks[tid])
				}
				delimToks := make([]string, len(tmpToks))
				beRTCntFields = append(beRTCntFields, RTCntField{tmpToks, delimToks})
			}
			tAliasArr := strings.Split(config.OutRTCntFieldAlias, ",")
			for _, tmpAlias := range tAliasArr {
				outRTCntFieldAlias = append(outRTCntFieldAlias,
					strings.TrimSpace(tmpAlias))
			}
			if len(beRTCntFields) != len(outRTCntFieldAlias) {
				log.Error(fmt.Sprintf("len(beRTCntFields) != len(outRTCntFieldAlias): %d vs %d", len(beRTCntFields), len(outRTCntFieldAlias)))
				return nil
			}
		}
	}

	dao := &FeatureBeDao{
		FeatureBaseDao:            NewFeatureBaseDao(&config),
		bizName:                   config.BizName,
		beRecallName:              "sequence_feature",
		userFeatureKeyName:        config.UserFeatureKeyName,
		itemFeatureKeyName:        config.ItemFeatureKeyName,
		timestampFeatureKeyName:   config.TimestampFeatureKeyName,
		eventFeatureKeyName:       config.EventFeatureKeyName,
		playTimeFeatureKeyName:    config.PlayTimeFeatureKeyName,
		tsFeatureKeyName:          config.TsFeatureKeyName,
		hasPlayTimeField:          true,
		beItemFeatureKeyName:      config.BeItemFeatureKeyName,
		beTimestampFeatureKeyName: config.BeTimestampFeatureKeyName,
		beEventFeatureKeyName:     config.BeEventFeatureKeyName,
		bePlayTimeFeatureKeyName:  config.BePlayTimeFeatureKeyName,

		beIsHomeField: strings.TrimSpace(config.BeIsHomeField),
		beRTCntFields: beRTCntFields,
		beRTTable:     strings.TrimSpace(config.BeRTTable),

		rtCntWins:     rtCntWins,
		rtCntMaxKey:   utils.ToInt(config.RTCntMaxKey, 100),
		rtCntWinDelay: utils.ToInt64(config.RTCntWinDelay, 5),

		outRTCntFeaPattern:     strings.TrimSpace(config.OutRTCntFeaPattern),
		outHomeRTCntFeaPattern: strings.TrimSpace(config.OutHomeRTCntFeaPattern),
		outRTCntWinNames:       strings.Split(config.OutRTCntWinNames, ","),
		outRTCntFieldAlias:     outRTCntFieldAlias,
		outEventName:           strings.TrimSpace(config.OutEventName),
	}
	if config.BeRecallName != "" {
		dao.beRecallName = config.BeRecallName
	}

	if dao.featureType == Feature_Type_RT_Cnt {
		for tid := range dao.outRTCntWinNames {
			dao.outRTCntWinNames[tid] = strings.TrimSpace(
				dao.outRTCntWinNames[tid])
		}

		if len(dao.rtCntWins) != len(dao.outRTCntWinNames) {
			log.Error(fmt.Sprintf("len(rtCntWins)[%d] != len(outRTCntWinNames)[%d]",
				len(dao.rtCntWins), len(dao.outRTCntWinNames)))
			return nil
		}
		if len(dao.beRTCntFields) != len(dao.outRTCntFieldAlias) {
			log.Error(fmt.Sprintf("len(beRTCntFields)[%d] != len(outRTCntFieldAlias)[%d]",
				len(dao.beRTCntFields), len(dao.outRTCntFieldAlias)))
			return nil
		}
		log.Info(fmt.Sprintf("RTCntConfig:beIsHomeField=%s", dao.beIsHomeField))
		log.Info(fmt.Sprintf("RTCntConfig:beRTTable=%s", dao.beRTTable))
		log.Info(fmt.Sprintf("RTCntConfig:rtCntWinDelay=%d", dao.rtCntWinDelay))
		log.Info(fmt.Sprintf("RTCntConfig:rtCntMaxKey=%d", dao.rtCntMaxKey))
	}

	client, err := beengine.GetBeClient(config.BeName)
	if err != nil {
		log.Error(fmt.Sprintf("error=%v", err))
		return nil
	}
	dao.beClient = client.BeClient
	if config.NoUsePlayTimeField {
		dao.hasPlayTimeField = false
	}
	return dao
}