Set missing score for contacts
We borrow the formula from GMSCore to set the score for the contacts.
Right now it is calculated based on:
Base_score(1) + # of addtionalNames + # of contactPoints
Bug: b/228444665
Test: ContactsIndexerTests
Change-Id: I56184094279875ed963f163dd1b43fbc33beecfe
diff --git a/service/java/com/android/server/appsearch/contactsindexer/PersonBuilderHelper.java b/service/java/com/android/server/appsearch/contactsindexer/PersonBuilderHelper.java
index 50bdd2f..0cddb53 100644
--- a/service/java/com/android/server/appsearch/contactsindexer/PersonBuilderHelper.java
+++ b/service/java/com/android/server/appsearch/contactsindexer/PersonBuilderHelper.java
@@ -47,6 +47,7 @@
public final class PersonBuilderHelper {
static final String TAG = "PersonBuilderHelper";
static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
+ static final int BASE_SCORE = 1;
// We want to store id separately even if we do have it set in the builder, since we
// can't get its value out of the builder, which will be used to fetch fingerprints.
@@ -80,12 +81,19 @@
mBuilder.addContactPoint(builder.build());
}
// Set the fingerprint and creationTimestamp to 0 to calculate the actual fingerprint.
+ mBuilder.setScore(0);
mBuilder.setFingerprint(EMPTY_BYTE_ARRAY);
mBuilder.setCreationTimestampMillis(0);
// Build a person for generating the fingerprint.
Person contactForFingerPrint = mBuilder.build();
try {
byte[] fingerprint = generateFingerprintMD5(contactForFingerPrint);
+ // This is an "a priori" document score that doesn't take any usage into account.
+ // Hence, the heuristic that's used to assign the document score is to add the
+ // presence or count of all the salient properties of the contact.
+ int score = BASE_SCORE + contactForFingerPrint.getContactPoints().length
+ + contactForFingerPrint.getAdditionalNames().length;
+ mBuilder.setScore(score);
mBuilder.setFingerprint(fingerprint);
mBuilder.setCreationTimestampMillis(mCreationTimestampMillis);
} catch (NoSuchAlgorithmException e) {
diff --git a/service/java/com/android/server/appsearch/contactsindexer/appsearchtypes/Person.java b/service/java/com/android/server/appsearch/contactsindexer/appsearchtypes/Person.java
index 42e4f31..2c77da5 100644
--- a/service/java/com/android/server/appsearch/contactsindexer/appsearchtypes/Person.java
+++ b/service/java/com/android/server/appsearch/contactsindexer/appsearchtypes/Person.java
@@ -405,7 +405,6 @@
setPropertyLong(PERSON_PROPERTY_ADDITIONAL_NAME_TYPES, primitiveNameTypes);
setPropertyString(PERSON_PROPERTY_ADDITIONAL_NAMES,
mAdditionalNames.toArray(new String[0]));
-
setPropertyString(PERSON_PROPERTY_AFFILIATIONS,
mAffiliations.toArray(new String[0]));
setPropertyString(PERSON_PROPERTY_RELATIONS,
diff --git a/testing/contactsindexertests/src/com/android/server/appsearch/contactsindexer/PersonBuilderHelperTest.java b/testing/contactsindexertests/src/com/android/server/appsearch/contactsindexer/PersonBuilderHelperTest.java
index de2da3c..e004175 100644
--- a/testing/contactsindexertests/src/com/android/server/appsearch/contactsindexer/PersonBuilderHelperTest.java
+++ b/testing/contactsindexertests/src/com/android/server/appsearch/contactsindexer/PersonBuilderHelperTest.java
@@ -240,4 +240,42 @@
assertThat(person.getFingerprint()).isNotEqualTo(person2.getFingerprint());
}
+
+ @Test
+ public void testScore_setCorrectly() {
+ String namespace = "namespace";
+ String id = "id";
+ String name = "name";
+ List<String> additionalNames = Arrays.asList("name1", "name2");
+ Person.Builder personBuilder = new Person.Builder(namespace, id, name)
+ .addAdditionalName(Person.TYPE_NICKNAME, additionalNames.get(0))
+ .addAdditionalName(Person.TYPE_PHONETIC_NAME, additionalNames.get(1));
+ ContactPoint contact1 = new ContactPoint.Builder(namespace, id + "1", "Home")
+ .addAddress("addr1")
+ .addPhone("phone1")
+ .addEmail("email1")
+ .addAppId("appId1")
+ .build();
+ ContactPoint contact2 = new ContactPoint.Builder(namespace, id + "2", "Work")
+ .addAddress("addr2")
+ .addPhone("phone2")
+ .addEmail("email2")
+ .addAppId("appId2")
+ .build();
+ ContactPoint contact3 = new ContactPoint.Builder(namespace, id + "3", "Other")
+ .addAddress("addr3")
+ .addPhone("phone3")
+ .addEmail("email3")
+ .addAppId("appId3")
+ .build();
+ personBuilder.addContactPoint(contact1)
+ .addContactPoint(contact2)
+ .addContactPoint(contact3);
+
+ Person person = new PersonBuilderHelper(id, personBuilder).setCreationTimestampMillis(
+ 0).setCreationTimestampMillis(0).buildPerson();
+
+ // Score should be set as base(1) + # of contactPoints + # of additionalNames.
+ assertThat(person.getScore()).isEqualTo(6);
+ }
}
diff --git a/testing/contactsindexertests/src/com/android/server/appsearch/contactsindexer/appsearchtypes/PersonTest.java b/testing/contactsindexertests/src/com/android/server/appsearch/contactsindexer/appsearchtypes/PersonTest.java
index 2f9859b..70c8082 100644
--- a/testing/contactsindexertests/src/com/android/server/appsearch/contactsindexer/appsearchtypes/PersonTest.java
+++ b/testing/contactsindexertests/src/com/android/server/appsearch/contactsindexer/appsearchtypes/PersonTest.java
@@ -32,6 +32,7 @@
long creationTimestamp = 12345L;
String namespace = "namespace";
String id = "id";
+ int score = 3;
String name = "name";
String givenName = "givenName";
String middleName = "middleName";
@@ -57,6 +58,12 @@
.addEmail("email2")
.addAppId("appId2")
.build();
+ ContactPoint contact3 = new ContactPoint.Builder(namespace, id + "3", "Other")
+ .addAddress("addr3")
+ .addPhone("phone3")
+ .addEmail("email3")
+ .addAppId("appId3")
+ .build();
List<String> additionalNames = ImmutableList.of("nickname", "phoneticName");
@Person.NameType
List<Long> additionalNameTypes = ImmutableList.of((long) Person.TYPE_NICKNAME,
@@ -64,6 +71,7 @@
Person person = new Person.Builder(namespace, id, name)
.setCreationTimestampMillis(creationTimestamp)
+ .setScore(score)
.setGivenName(givenName)
.setMiddleName(middleName)
.setFamilyName(lastName)
@@ -83,9 +91,11 @@
.setFingerprint(fingerprint)
.addContactPoint(contact1)
.addContactPoint(contact2)
+ .addContactPoint(contact3)
.build();
assertThat(person.getCreationTimestampMillis()).isEqualTo(creationTimestamp);
+ assertThat(person.getScore()).isEqualTo(score);
assertThat(person.getNamespace()).isEqualTo(namespace);
assertThat(person.getId()).isEqualTo(id);
assertThat(person.getName()).isEqualTo(name);
@@ -102,6 +112,7 @@
assertThat(person.getAdditionalNameTypes()).asList().isEqualTo(additionalNameTypes);
assertThat(person.getAffiliations()).asList().isEqualTo(affiliations);
assertThat(person.getRelations()).asList().isEqualTo(relations);
- assertThat(person.getContactPoints()).asList().containsExactly(contact1, contact2);
+ assertThat(person.getContactPoints()).asList().containsExactly(contact1, contact2,
+ contact3);
}
}
\ No newline at end of file