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