summaryrefslogtreecommitdiffstats
path: root/src/com/android/providers/contacts/aggregation/util/RawContactMatchingCandidates.java
diff options
context:
space:
mode:
authorZheng Fu <zhengfu@google.com>2015-03-26 13:40:37 -0700
committerZheng Fu <zhengfu@google.com>2015-03-30 14:12:16 -0700
commitd6c0a1330d3e51706d70351a34631f1f4e8fb02f (patch)
tree540b4350990e31f310635d617666129c81c0bcd9 /src/com/android/providers/contacts/aggregation/util/RawContactMatchingCandidates.java
parent2ded4cc7b214d7cddee9d3130744400fcb8cc1f0 (diff)
downloadpackages_providers_ContactsProvider-d6c0a1330d3e51706d70351a34631f1f4e8fb02f.zip
packages_providers_ContactsProvider-d6c0a1330d3e51706d70351a34631f1f4e8fb02f.tar.gz
packages_providers_ContactsProvider-d6c0a1330d3e51706d70351a34631f1f4e8fb02f.tar.bz2
New contact aggregator (part 1)
Summary of the changes are: 1. In RawContactMatcher, add rawContactId and accountId to MatchScore inner class, so that match score is on raw contacts level instead] of accumulate to contact level 2. Add a wrapper RawContactMatchingCandidates to MatchScore to facilitate the aggregation. 3. In ContactAggregator2, add findRawContactMatchingCandidates() method to find the set of matching raw contacts for a given raw_contact_id. This method will use the logic of updateMatchScoresForSuggestionsBasedOnDataMatches() so that it will give a set of raw contacts candidate with matching score above threshold. 4. The second stage "Pair-wise comparison and find the connected component of all the raw contacts in RawContactMatchingCandidates" is done in new method reAggregateRawContacts(); 5. Some new methods still throw unSupportedOperationExceptions, and they will be implemented in part2. 6. Tests will be implemented in follow-up cls. Bug:19908937 Change-Id: I53483a29c24401e2f38a727168e7431cef86370a
Diffstat (limited to 'src/com/android/providers/contacts/aggregation/util/RawContactMatchingCandidates.java')
-rw-r--r--src/com/android/providers/contacts/aggregation/util/RawContactMatchingCandidates.java113
1 files changed, 113 insertions, 0 deletions
diff --git a/src/com/android/providers/contacts/aggregation/util/RawContactMatchingCandidates.java b/src/com/android/providers/contacts/aggregation/util/RawContactMatchingCandidates.java
new file mode 100644
index 0000000..39125b4
--- /dev/null
+++ b/src/com/android/providers/contacts/aggregation/util/RawContactMatchingCandidates.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * 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 com.android.providers.contacts.aggregation.util;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import static com.android.internal.util.Preconditions.checkNotNull;
+
+/**
+ * Matching candidates for a raw contact, used in the contact aggregator.
+ */
+public class RawContactMatchingCandidates {
+ private List<RawContactMatcher.MatchScore> mBestMatches;
+ private Set<Long> mRawContactIds = null;
+ private Map<Long, Long> mRawContactToContact = null;
+ private Map<Long, Long> mRawContactToAccount = null;
+
+ public RawContactMatchingCandidates(List<RawContactMatcher.MatchScore> mBestMatches) {
+ checkNotNull(mBestMatches);
+ this.mBestMatches = mBestMatches;
+ }
+
+ public RawContactMatchingCandidates() {
+ mBestMatches = new ArrayList<RawContactMatcher.MatchScore>();
+ }
+
+ public int getCount() {
+ return mBestMatches.size();
+ }
+
+ public void add(RawContactMatcher.MatchScore score) {
+ mBestMatches.add(score);
+ if (mRawContactIds != null) {
+ mRawContactIds.add(score.getRawContactId());
+ }
+ if (mRawContactToAccount != null) {
+ mRawContactToAccount.put(score.getRawContactId(), score.getAccountId());
+ }
+ if (mRawContactToContact != null) {
+ mRawContactToContact.put(score.getRawContactId(), score.getContactId());
+ }
+ }
+
+ public Set<Long> getRawContactIdSet() {
+ if (mRawContactIds == null) {
+ createRawContactIdSet();
+ }
+ return mRawContactIds;
+ }
+
+ public Map<Long, Long> getRawContactToAccount() {
+ if (mRawContactToAccount == null) {
+ createRawContactToAccountMap();
+ }
+ return mRawContactToAccount;
+ }
+
+ public Long getContactId(Long rawContactId) {
+ if (mRawContactToContact == null) {
+ createRawContactToContactMap();
+ }
+ return mRawContactToContact.get(rawContactId);
+ }
+
+ public Long getAccountId(Long rawContactId) {
+ if (mRawContactToAccount == null) {
+ createRawContactToAccountMap();
+ }
+ return mRawContactToAccount.get(rawContactId);
+ }
+
+ private void createRawContactToContactMap() {
+ mRawContactToContact = new HashMap<Long, Long>();
+ for (int i = 0; i < mBestMatches.size(); i++) {
+ mRawContactToContact.put(mBestMatches.get(i).getRawContactId(),
+ mBestMatches.get(i).getContactId());
+ }
+ }
+
+ private void createRawContactToAccountMap() {
+ mRawContactToAccount = new HashMap<Long, Long>();
+ for (int i = 0; i < mBestMatches.size(); i++) {
+ mRawContactToAccount.put(mBestMatches.get(i).getRawContactId(),
+ mBestMatches.get(i).getAccountId());
+ }
+ }
+
+ private void createRawContactIdSet() {
+ mRawContactIds = new HashSet<Long>();
+ for (int i = 0; i < mBestMatches.size(); i++) {
+ mRawContactIds.add(mBestMatches.get(i).getRawContactId());
+ }
+ }
+}