public FeatureResult getSequenceFeatures()

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;
    }