All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.trino.plugin.hudi.timeline.TimelineLayout Maven / Gradle / Ivy

There is a newer version: 465
Show newest version
/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.trino.plugin.hudi.timeline;

import io.trino.plugin.hudi.model.HudiInstant;

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public abstract class TimelineLayout
{
    private static final Map LAYOUT_MAP = new HashMap<>();

    static {
        LAYOUT_MAP.put(new TimelineLayoutVersion(TimelineLayoutVersion.VERSION_0), new TimelineLayout.TimelineLayoutV0());
        LAYOUT_MAP.put(new TimelineLayoutVersion(TimelineLayoutVersion.VERSION_1), new TimelineLayout.TimelineLayoutV1());
    }

    public static TimelineLayout getLayout(TimelineLayoutVersion version)
    {
        return LAYOUT_MAP.get(version);
    }

    public abstract Stream filterHoodieInstants(Stream instantStream);

    private static class TimelineLayoutV0
            extends TimelineLayout
    {
        @Override
        public Stream filterHoodieInstants(Stream instantStream)
        {
            return instantStream;
        }
    }

    private static class TimelineLayoutV1
            extends TimelineLayout
    {
        @Override
        public Stream filterHoodieInstants(Stream instantStream)
        {
            return instantStream.collect(Collectors.groupingBy(instant -> Map.entry(instant.getTimestamp(),
                            HudiInstant.getComparableAction(instant.getAction()))))
                    .values()
                    .stream()
                    .map(hoodieInstants ->
                            hoodieInstants.stream().reduce((x, y) -> {
                                // Pick the one with the highest state
                                if (x.getState().compareTo(y.getState()) >= 0) {
                                    return x;
                                }
                                return y;
                            }).get());
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy