1d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro/* 2d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro * Copyright (C) 2010 The Android Open Source Project 3d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro * 4d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro * Licensed under the Apache License, Version 2.0 (the "License"); 5d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro * you may not use this file except in compliance with the License. 6d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro * You may obtain a copy of the License at 7d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro * 8d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro * http://www.apache.org/licenses/LICENSE-2.0 9d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro * 10d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro * Unless required by applicable law or agreed to in writing, software 11d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro * distributed under the License is distributed on an "AS IS" BASIS, 12d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro * See the License for the specific language governing permissions and 14d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro * limitations under the License 15d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro */ 16d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro 17d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoropackage com.android.common.content; 18d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro 19d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoroimport java.util.Arrays; 20d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoroimport java.util.HashMap; 21d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoroimport java.util.Map; 22d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro 23d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro/** 24d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro * A convenience wrapper for a projection map. Makes it easier to create and use projection maps. 25d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro */ 26d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoropublic class ProjectionMap extends HashMap<String, String> { 27d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro 28d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro public static class Builder { 29d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro 30d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro private ProjectionMap mMap = new ProjectionMap(); 31d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro 32d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro public Builder add(String column) { 33d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro mMap.putColumn(column, column); 34d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro return this; 35d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro } 36d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro 37d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro public Builder add(String alias, String expression) { 38d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro mMap.putColumn(alias, expression + " AS " + alias); 39d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro return this; 40d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro } 41d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro 422e07adb85194abf5b1264aad95b421558f41a5baDave Santoro public Builder addAll(String[] columns) { 432e07adb85194abf5b1264aad95b421558f41a5baDave Santoro for (String column : columns) { 442e07adb85194abf5b1264aad95b421558f41a5baDave Santoro add(column); 452e07adb85194abf5b1264aad95b421558f41a5baDave Santoro } 462e07adb85194abf5b1264aad95b421558f41a5baDave Santoro return this; 472e07adb85194abf5b1264aad95b421558f41a5baDave Santoro } 482e07adb85194abf5b1264aad95b421558f41a5baDave Santoro 49d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro public Builder addAll(ProjectionMap map) { 50d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro for (Map.Entry<String, String> entry : map.entrySet()) { 51d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro mMap.putColumn(entry.getKey(), entry.getValue()); 52d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro } 53d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro return this; 54d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro } 55d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro 56d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro public ProjectionMap build() { 57d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro String[] columns = new String[mMap.size()]; 58d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro mMap.keySet().toArray(columns); 59d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro Arrays.sort(columns); 60d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro mMap.mColumns = columns; 61d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro return mMap; 62d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro } 63d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro 64d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro } 65d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro 66d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro private String[] mColumns; 67d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro 68d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro public static Builder builder() { 69d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro return new Builder(); 70d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro } 71d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro 72d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro /** 73d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro * Returns a sorted array of all column names in the projection map. 74d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro */ 75d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro public String[] getColumnNames() { 76d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro return mColumns; 77d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro } 78d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro 79d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro private void putColumn(String alias, String column) { 80d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro super.put(alias, column); 81d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro } 82d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro 83d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro @Override 84d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro public String put(String key, String value) { 85d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro throw new UnsupportedOperationException(); 86d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro } 87d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro 88d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro @Override 89d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro public void putAll(Map<? extends String, ? extends String> map) { 90d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro throw new UnsupportedOperationException(); 91d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro } 92d2fda1ec4db8d261bf0f5ca6dc43f8c204edbd87Dave Santoro} 93