/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 com.aliyun.odps.local.common.utils; import java.io.File; import java.util.LinkedHashMap; import java.util.Map; import com.aliyun.odps.Column; import com.aliyun.odps.PartitionSpec; public class PartitionUtils { public static PartitionSpec convert(String[] partitions) { PartitionSpec partitionSpec = null; if (partitions != null && partitions.length > 0) { partitionSpec = new PartitionSpec(); for (String p : partitions) { String[] kv = p.split("="); if (kv.length != 2) { continue; } partitionSpec.set(kv[0], kv[1]); } } return partitionSpec; } public static PartitionSpec convert(Map<String, String> hash) { if (hash == null || hash.size() == 0) { return null; } StringBuffer sb = new StringBuffer(); for (String key : hash.keySet()) { if (sb.length() > 0) { sb.append(","); } sb.append(key + "=" + hash.get(key)); } return new PartitionSpec(sb.toString()); } public static LinkedHashMap<String, String> convert(PartitionSpec partSpec) { if (partSpec == null || partSpec.isEmpty()) { return null; } LinkedHashMap<String, String> result = new LinkedHashMap<String, String>(); for (String key : partSpec.keys()) { result.put(key, partSpec.get(key)); } return result; } public static String toString(Map<String, String> partSpec) { if (partSpec == null) { return ""; } StringBuilder sb = new StringBuilder(); for (String k : partSpec.keySet()) { if (sb.length() > 0) { sb.append('/'); } sb.append(k).append('=').append(partSpec.get(k)); } return sb.toString(); } public static String toString(PartitionSpec partSpec) { if (partSpec == null) { return ""; } StringBuilder sb = new StringBuilder(); for (String k : partSpec.keys()) { if (sb.length() > 0) { sb.append('/'); } sb.append(k).append('=').append(partSpec.get(k)); } return sb.toString(); } public static PartitionSpec convert(String partPath) { PartitionSpec spec = new PartitionSpec(); for (String kv : partPath.split("/|\\\\")) { String[] p = kv.trim().split("=", 2); if (p.length == 2) { spec.set(p[0], p[1]); } } return spec; } public static boolean valid(Column[] partitionsScheme, PartitionSpec partSpec) { if (partSpec == null || partitionsScheme == null || partitionsScheme.length == 0) { return false; } for (String key : partSpec.keys()) { boolean flag = false; for (int i = 0; !flag && i < partitionsScheme.length; i++) { if (partitionsScheme[i].getName().equals(key)) { flag = true; } } if (!flag) { return false; } } return true; } public static boolean isEqual(PartitionSpec p1, PartitionSpec p2) { if (p1 == null && p2 == null) { return true; } else if (p1 == null || p2 == null) { return false; } if (p1.keys().size() != p2.keys().size()) { return false; } boolean flag = true; for (String key : p1.keys()) { if (p1.get(key) == null || !p1.get(key).equals(p2.get(key))) { flag = false; break; } } return flag; } /** * examples: * * pattern parts return * * null p1=1/p2=1 true p1=1 p1=1/p2=1 true p1=1/p2=1 p1=1/p2=1 true p1=1/p2=2 * p1=1/p2=1 false p1=1/p2=2/p3=1 p1=1/p2=1 false */ public static boolean match(PartitionSpec pattern, PartitionSpec parts) { if (pattern == null || pattern.isEmpty()) { return true; } if (parts == null || pattern.keys().size() > parts.keys().size()) { return false; } for (String key : pattern.keys()) { String expectedValue = pattern.get(key); if (expectedValue == null) { continue; } String value = parts.get(key); if (!expectedValue.equals(value)) { return false; } } return true; } }