in src/main/java/com/aliyun/openservices/paifeaturestore/dao/FeatureViewFeatureDBDao.java [610:690]
public FeatureResult getSequenceFeatures(String[] keys, String userIdField, FeatureViewSeqConfig featureViewSeqConfig) {
FeatureStoreResult featureStoreResult = new FeatureStoreResult();
String[] selectFields = null;
if (!StringUtils.isEmpty(featureViewSeqConfig.getPlayTimeField())) {
selectFields = new String[]{featureViewSeqConfig.getItemIdField(), featureViewSeqConfig.getEventField(), featureViewSeqConfig.getPlayTimeField(), featureViewSeqConfig.getTimestampField()};
} else {
selectFields = new String[]{featureViewSeqConfig.getItemIdField(), featureViewSeqConfig.getEventField(), featureViewSeqConfig.getTimestampField()};
}
long currentime = System.currentTimeMillis() / 1000;
HashMap<String, Double> playtimefilter = new HashMap<>();
if (!StringUtils.isEmpty(featureViewSeqConfig.getPlayTimeFilter())) {
for (String event : Strings.split(featureViewSeqConfig.getPlayTimeFilter(), ';')) {
String[] s = Strings.split(event, ':');
if (s.length == 2) {//key有值
playtimefilter.put(s[0], Double.valueOf(s[1]));
}
}
}
String[] events = new String[featureViewSeqConfig.getSeqConfigs().length];
for (int i = 0; i < events.length; i++) {
events[i] = featureViewSeqConfig.getSeqConfigs()[i].getSeqEvent();
}
Set<String> featureFieldList = new HashSet<>();
List<Map<String, Object>> featureDataList = new ArrayList<>();
for (String key : keys) {
HashMap<String, String> keyEventsDatasOnline = new HashMap<>();
for (String event : events) {
List<SequenceInfo> onlineSequence = fetchData(key, playtimefilter, featureViewSeqConfig, event, userIdField, currentime, true);
List<SequenceInfo> offlineSequence = new ArrayList<>();
onlineSequence = MergeOnOfflineSeq(onlineSequence, offlineSequence, featureViewSeqConfig, event);
Map<String, String> resultData = disposeDB(onlineSequence, selectFields, featureViewSeqConfig, event, currentime);
if (onlineSequence.size() > 0) {
keyEventsDatasOnline.putAll(resultData);
}
}
if (keyEventsDatasOnline.size() > 0) {
keyEventsDatasOnline.put(this.primaryKeyField, key);
}
if (!keyEventsDatasOnline.isEmpty()) {
featureFieldList.addAll(keyEventsDatasOnline.keySet());
boolean found = false;
for (Map<String, Object> features : featureDataList) {
if (features.containsKey(keyEventsDatasOnline.get(this.primaryKeyField))) {
for (Map.Entry<String, String> entry : keyEventsDatasOnline.entrySet()) {
features.put(entry.getKey(), entry.getKey());
}
found = true;
break;
}
}
if (!found) {
Map<String, Object> featureData = new HashMap<>();
for (Map.Entry<String, String> entry : keyEventsDatasOnline.entrySet()) {
featureData.put(entry.getKey(), entry.getValue());
}
featureDataList.add(featureData);
}
}
}
String[] fields = new String[featureFieldList.size()];
int f = 0;
for (String field : featureFieldList) {
fields[f++] = field;
}
Map<String, FSType> featureFieldTypeMap = new HashMap<>();
for (String featureName : featureFieldList) {
featureFieldTypeMap.put(featureName, FSType.FS_STRING);
}
featureStoreResult.setFeatureFields(featureFieldList.toArray(new String[0]));
featureStoreResult.setFeatureFieldTypeMap(featureFieldTypeMap);
featureStoreResult.setFeatureFields(fields);
featureStoreResult.setFeatureDataList(featureDataList);
return featureStoreResult;
}