From f29a88c365de17600d335eabd364d5bc6aeda5db Mon Sep 17 00:00:00 2001 From: Kerem Sahin Date: Wed, 2 Oct 2019 18:04:33 -0700 Subject: [PATCH] metadata-models 38.1.6 -> 38.1.8: 38.1.8: Add getFilter method as a search util 38.1.7: Add index builder for corp groups MP_VERSION=corp-identity-gms:1.0.25 MP_VERSION=metadata-models:38.1.8 MP_VERSION=wherehows-samza:1.0.30 This commit is automaticaly generated by li-opensource tool. --- .../builders/search/BuilderUtils.java | 25 ++++++++ .../search/CorpGroupIndexBuilder.java | 58 +++++++++++++++++++ .../search/CorpUserInfoIndexBuilder.java | 1 + .../search/CorpGroupIndexBuilderTest.java | 51 ++++++++++++++++ .../metadata/dao/utils/SearchUtilsTest.java | 26 +++++++++ .../metadata/search/CorpGroupDocument.pdsc | 49 ++++++++++++++++ 6 files changed, 210 insertions(+) create mode 100644 metadata-builders/src/main/java/com/linkedin/metadata/builders/search/CorpGroupIndexBuilder.java create mode 100644 metadata-builders/src/test/java/com/linkedin/metadata/builders/search/CorpGroupIndexBuilderTest.java create mode 100644 metadata-dao-impl/elasticsearch-dao/src/test/java/com/linkedin/metadata/dao/utils/SearchUtilsTest.java create mode 100644 metadata-models/src/main/pegasus/com/linkedin/metadata/search/CorpGroupDocument.pdsc diff --git a/metadata-builders/src/main/java/com/linkedin/metadata/builders/search/BuilderUtils.java b/metadata-builders/src/main/java/com/linkedin/metadata/builders/search/BuilderUtils.java index f3f1524172..0f2350e673 100644 --- a/metadata-builders/src/main/java/com/linkedin/metadata/builders/search/BuilderUtils.java +++ b/metadata-builders/src/main/java/com/linkedin/metadata/builders/search/BuilderUtils.java @@ -1,5 +1,7 @@ package com.linkedin.metadata.builders.search; +import com.linkedin.common.CorpGroupUrnArray; +import com.linkedin.common.CorpuserUrnArray; import com.linkedin.common.MultiLocaleString; import com.linkedin.common.Owner; import com.linkedin.common.Ownership; @@ -7,6 +9,7 @@ import com.linkedin.common.urn.CorpuserUrn; import com.linkedin.common.urn.Urn; import com.linkedin.data.template.StringArray; import java.net.URISyntaxException; +import java.util.stream.Collectors; import javax.annotation.Nonnull; import lombok.extern.slf4j.Slf4j; @@ -47,6 +50,28 @@ public final class BuilderUtils { return ldap; } + /** + * Given {@link CorpuserUrnArray} return list of corp user names from each of the urns + * + * @param corpuserUrns {@link CorpuserUrnArray} + * @return list of user names extracted from urns + */ + @Nonnull + public static StringArray getCorpUsernames(@Nonnull CorpuserUrnArray corpuserUrns) { + return corpuserUrns.stream().map(urn -> urn.getUsernameEntity()).collect(Collectors.toCollection(StringArray::new)); + } + + /** + * Given {@link CorpGroupUrnArray} return list of corp group names from each of the urns + * + * @param corpgroupUrns {@link CorpGroupUrnArray} + * @return list of group names extracted from urns + */ + @Nonnull + public static StringArray getCorpGroupnames(@Nonnull CorpGroupUrnArray corpgroupUrns) { + return corpgroupUrns.stream().map(urn -> urn.getGroupNameEntity()).collect(Collectors.toCollection(StringArray::new)); + } + /** * Convert a Multi locale String to users preferred language * @param multiLocaleString diff --git a/metadata-builders/src/main/java/com/linkedin/metadata/builders/search/CorpGroupIndexBuilder.java b/metadata-builders/src/main/java/com/linkedin/metadata/builders/search/CorpGroupIndexBuilder.java new file mode 100644 index 0000000000..5bf1a077fc --- /dev/null +++ b/metadata-builders/src/main/java/com/linkedin/metadata/builders/search/CorpGroupIndexBuilder.java @@ -0,0 +1,58 @@ +package com.linkedin.metadata.builders.search; + +import com.linkedin.common.urn.CorpGroupUrn; +import com.linkedin.data.template.RecordTemplate; +import com.linkedin.identity.CorpGroupInfo; +import com.linkedin.metadata.search.CorpGroupDocument; +import com.linkedin.metadata.snapshot.CorpGroupSnapshot; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import javax.annotation.Nonnull; +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +public class CorpGroupIndexBuilder extends BaseIndexBuilder { + + public CorpGroupIndexBuilder() { + super(Collections.singletonList(CorpGroupSnapshot.class), CorpGroupDocument.class); + } + + @Nonnull + private CorpGroupDocument getDocumentToUpdateFromAspect(@Nonnull CorpGroupUrn urn, + @Nonnull CorpGroupInfo corpGroupInfo) { + return new CorpGroupDocument().setUrn(urn) + .setAdmins(BuilderUtils.getCorpUsernames(corpGroupInfo.getAdmins())) + .setMembers(BuilderUtils.getCorpUsernames(corpGroupInfo.getMembers())) + .setGroups(BuilderUtils.getCorpGroupnames(corpGroupInfo.getGroups())) + .setEmail(corpGroupInfo.getEmail()); + } + + @Nonnull + private List getDocumentsToUpdateFromSnapshotType(@Nonnull CorpGroupSnapshot corpGroupSnapshot) { + final CorpGroupUrn urn = corpGroupSnapshot.getUrn(); + return corpGroupSnapshot.getAspects().stream().map(aspect -> { + if (aspect.isCorpGroupInfo()) { + return getDocumentToUpdateFromAspect(urn, aspect.getCorpGroupInfo()); + } + return null; + }).filter(Objects::nonNull).collect(Collectors.toList()); + } + + @Override + @Nonnull + public final List getDocumentsToUpdate(@Nonnull RecordTemplate genericSnapshot) { + if (genericSnapshot instanceof CorpGroupSnapshot) { + return getDocumentsToUpdateFromSnapshotType((CorpGroupSnapshot) genericSnapshot); + } + return Collections.emptyList(); + } + + @Override + @Nonnull + public Class getDocumentType() { + return CorpGroupDocument.class; + } +} \ No newline at end of file diff --git a/metadata-builders/src/main/java/com/linkedin/metadata/builders/search/CorpUserInfoIndexBuilder.java b/metadata-builders/src/main/java/com/linkedin/metadata/builders/search/CorpUserInfoIndexBuilder.java index 8013de0d77..014b640581 100644 --- a/metadata-builders/src/main/java/com/linkedin/metadata/builders/search/CorpUserInfoIndexBuilder.java +++ b/metadata-builders/src/main/java/com/linkedin/metadata/builders/search/CorpUserInfoIndexBuilder.java @@ -70,6 +70,7 @@ public class CorpUserInfoIndexBuilder extends BaseIndexBuilder getDocumentType() { return CorpUserInfoDocument.class; } diff --git a/metadata-builders/src/test/java/com/linkedin/metadata/builders/search/CorpGroupIndexBuilderTest.java b/metadata-builders/src/test/java/com/linkedin/metadata/builders/search/CorpGroupIndexBuilderTest.java new file mode 100644 index 0000000000..889762d2c0 --- /dev/null +++ b/metadata-builders/src/test/java/com/linkedin/metadata/builders/search/CorpGroupIndexBuilderTest.java @@ -0,0 +1,51 @@ +package com.linkedin.metadata.builders.search; + +import com.linkedin.common.CorpGroupUrnArray; +import com.linkedin.common.CorpuserUrnArray; +import com.linkedin.common.urn.CorpGroupUrn; +import com.linkedin.common.urn.CorpuserUrn; +import com.linkedin.identity.CorpGroupInfo; +import com.linkedin.metadata.aspect.CorpGroupAspect; +import com.linkedin.metadata.aspect.CorpGroupAspectArray; +import com.linkedin.metadata.search.CorpGroupDocument; +import com.linkedin.metadata.snapshot.CorpGroupSnapshot; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import org.testng.annotations.Test; + +import static org.testng.Assert.*; + + +public class CorpGroupIndexBuilderTest { + + @Test + public void testGetDocumentsToUpdateFromDatasetSnapshot() { + CorpGroupUrn corpGroupUrn = new CorpGroupUrn("foo"); + CorpGroupSnapshot corpGroupSnapshot = new CorpGroupSnapshot().setUrn(corpGroupUrn).setAspects(new CorpGroupAspectArray()); + String groupName = "bar"; + String member = "baz"; + String email = "xyz@linkedin.com"; + String admin1 = "admin1"; + String admin2 = "admin2"; + CorpuserUrn corpMember = new CorpuserUrn(member); + CorpGroupUrn corpGroup = new CorpGroupUrn(groupName); + CorpuserUrn corpAdmin1 = new CorpuserUrn(admin1); + CorpuserUrn corpAdmin2 = new CorpuserUrn(admin2); + CorpGroupInfo corpGroupInfo = new CorpGroupInfo().setAdmins(new CorpuserUrnArray(Arrays.asList(corpAdmin1, corpAdmin2))).setEmail(email) + .setGroups(new CorpGroupUrnArray(Collections.singleton(corpGroup))) + .setMembers(new CorpuserUrnArray(Collections.singleton(corpMember))); + CorpGroupAspect corpGroupAspect = new CorpGroupAspect(); + corpGroupAspect.setCorpGroupInfo(corpGroupInfo); + corpGroupSnapshot.getAspects().add(corpGroupAspect); + + List actualDocs = new CorpGroupIndexBuilder().getDocumentsToUpdate(corpGroupSnapshot); + + assertEquals(actualDocs.size(), 1); + assertEquals(actualDocs.get(0).getUrn(), corpGroupUrn); + assertEquals(actualDocs.get(0).getAdmins(), Arrays.asList(admin1, admin2)); + assertEquals(actualDocs.get(0).getMembers(), Collections.singletonList(member)); + assertEquals(actualDocs.get(0).getGroups(), Collections.singletonList(groupName)); + assertEquals(actualDocs.get(0).getEmail(), email); + } +} \ No newline at end of file diff --git a/metadata-dao-impl/elasticsearch-dao/src/test/java/com/linkedin/metadata/dao/utils/SearchUtilsTest.java b/metadata-dao-impl/elasticsearch-dao/src/test/java/com/linkedin/metadata/dao/utils/SearchUtilsTest.java new file mode 100644 index 0000000000..c3f9a33ada --- /dev/null +++ b/metadata-dao-impl/elasticsearch-dao/src/test/java/com/linkedin/metadata/dao/utils/SearchUtilsTest.java @@ -0,0 +1,26 @@ +package com.linkedin.metadata.dao.utils; + +import com.linkedin.metadata.query.Criterion; +import com.linkedin.metadata.query.Filter; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; +import org.testng.annotations.Test; + +import static org.testng.Assert.*; + +public class SearchUtilsTest { + @Test + public void testGetFilter() { + final Map requestMap = Collections.unmodifiableMap(new HashMap() { + { + put("key1", "value1"); + put("key2", "value2"); + } + }); + final Filter filter = SearchUtils.getFilter(requestMap); + assertEquals(filter.getCriteria().stream().collect(Collectors.toMap(Criterion::getField, Criterion::getValue)), + requestMap); + } +} diff --git a/metadata-models/src/main/pegasus/com/linkedin/metadata/search/CorpGroupDocument.pdsc b/metadata-models/src/main/pegasus/com/linkedin/metadata/search/CorpGroupDocument.pdsc new file mode 100644 index 0000000000..1ec5e1d524 --- /dev/null +++ b/metadata-models/src/main/pegasus/com/linkedin/metadata/search/CorpGroupDocument.pdsc @@ -0,0 +1,49 @@ +{ + "type": "record", + "name": "CorpGroupDocument", + "namespace": "com.linkedin.metadata.search", + "doc": "Data model for Corp Group entity search", + "include": [ + "BaseDocument" + ], + "fields": [ + { + "name": "urn", + "type": "com.linkedin.common.CorpGroupUrn", + "doc": "Urn for the Corp group." + }, + { + "name": "email", + "type": "string", + "doc": "Email of the corp group", + "optional": true + }, + { + "name": "members", + "type": { + "type": "array", + "items": "string" + }, + "doc": "ldap usernames of corp users who are direct members of this group", + "optional": true + }, + { + "name": "admins", + "type": { + "type": "array", + "items": "string" + }, + "doc": "ldap usernames of corp users who are direct admins of this group", + "optional": true + }, + { + "name": "groups", + "type": { + "type": "array", + "items": "string" + }, + "doc": "List of group names who are part of this group", + "optional": true + } + ] +}