Skip to content

Commit c8f21e7

Browse files
committed
feat: add entitymatching and delete tags
implement ENG-4427
1 parent 414b323 commit c8f21e7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+2479
-2082
lines changed

.coveragerc

+3-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ omit =
1212
indykite_sdk/identity/helper.py
1313
indykite_sdk/model/unique_name_identifier.py
1414
indykite_sdk/model/data_access.py
15-
indykite_sdk/model/email_attachment.py
16-
indykite_sdk/identity/consent.py
15+
indykite_sdk/model/property.py
16+
indykite_sdk/model/scope_item.py
17+
indykite_sdk/model/audience_item.py
1718
indykite_sdk/utils/*
1819
tests/*
1920
examples/*

Pipfile

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ pytest-cov = "4.1.0"
2222
authlib = "*"
2323
grpcio-tools = "*"
2424
urllib3 = "*"
25+
numpy = "*"
2526

2627
[requires]
2728
python_version = "3.11"

Pipfile.lock

+455-371
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

codecov.yaml

+3-2
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@ ignore:
2222
"indykite_sdk/gnostic"
2323
- "indykite_sdk/identity/helper.py"
2424
- "indykite_sdk/model/unique_name_identifier.py"
25-
- "indykite_sdk/model/email_attachment.py"
2625
- "indykite_sdk/model/data_access.py"
27-
- "indykite_sdk/identity/consent.py"
26+
- "indykite_sdk/model/property.py"
27+
- "indykite_sdk/model/scope_item.py"
28+
- "indykite_sdk/model/audience_item.py"
2829
- "indykite_sdk/utils"
2930
- "tests"
3031
- "examples"

indykite_sdk/buf/validate/validate_pb2.py

+122-80
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

indykite_sdk/config/__init__.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ def __init__(self, token_source=None):
4343
validate_external_data_resolver_content_type,
4444
create_external_data_resolver_config_node,
4545
update_external_data_resolver_config_node,
46-
external_data_resolver_config
46+
external_data_resolver_config,
47+
create_entity_matching_pipeline_config_node,
48+
update_entity_matching_pipeline_config_node,
49+
entity_matching_pipeline_config,
50+
validate_entity_matching_status
4751
)
4852
from .create_application_with_agent_credentials import create_application_with_agent_credentials

indykite_sdk/config/config_node.py

+154
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from indykite_sdk.model.authorization_policy_config_status import Status
99
from indykite_sdk.indykite.config.v1beta1 import model_pb2
1010
from indykite_sdk.model.token_status import ExternalTokenStatus
11+
from indykite_sdk.model.entity_matching_status import Status as EntityMatchingStatus
1112
from indykite_sdk.model.external_data_resolver_config_content_type import ContentType
1213
import indykite_sdk.utils.logger as logger
1314

@@ -564,6 +565,141 @@ def external_data_resolver_config(self,
564565
return logger.logger_error(exception)
565566

566567

568+
def create_entity_matching_pipeline_config_node(self,
569+
location,
570+
name,
571+
display_name,
572+
description,
573+
entity_matching_pipeline_config,
574+
bookmarks=[]):
575+
"""
576+
create entity matching pipeline config node
577+
:param self:
578+
:param location: string gid id
579+
:param name: string pattern: ^[a-z](?:[-a-z0-9]{0,61}[a-z0-9])$
580+
:param display_name: string
581+
:param description: string
582+
:param entity_matching_pipeline_config: EntityMatchingPipelineConfig object
583+
:param bookmarks: list of strings with pattern: ^[a-zA-Z0-9_-]{40,}$
584+
:return: deserialized CreateConfigNode instance
585+
"""
586+
sys.excepthook = logger.handle_excepthook
587+
try:
588+
if entity_matching_pipeline_config and not isinstance(
589+
entity_matching_pipeline_config,
590+
model_pb2.EntityMatchingPipelineConfig):
591+
raise TypeError("EntityMatchingPipelineConfig must be an object")
592+
593+
response = self.stub.CreateConfigNode(
594+
pb2.CreateConfigNodeRequest(
595+
location=location,
596+
name=name,
597+
display_name=wrappers.StringValue(value=display_name),
598+
description=wrappers.StringValue(value=description),
599+
entity_matching_pipeline_config=entity_matching_pipeline_config,
600+
bookmarks=bookmarks
601+
)
602+
)
603+
except Exception as exception:
604+
return logger.logger_error(exception)
605+
606+
if not response:
607+
return None
608+
return CreateConfigNode.deserialize(response)
609+
610+
611+
def update_entity_matching_pipeline_config_node(self,
612+
config_node_id,
613+
etag,
614+
display_name,
615+
description,
616+
entity_matching_pipeline_config,
617+
bookmarks=[]):
618+
"""
619+
update entity matching pipeline
620+
:param self:
621+
:param config_node_id: string gid id
622+
:param display_name: string
623+
:param description: string
624+
:param entity_matching_pipeline_config: EntityMatchingPipelineConfig object
625+
:param bookmarks: list of strings with pattern: ^[a-zA-Z0-9_-]{40,}$
626+
:return: deserialized UpdateConfigNode instance
627+
"""
628+
sys.excepthook = logger.handle_excepthook
629+
try:
630+
if entity_matching_pipeline_config and not isinstance(
631+
entity_matching_pipeline_config,
632+
model_pb2.EntityMatchingPipelineConfig):
633+
raise TypeError("EntityMatchingPipelineConfig must be an object")
634+
response = self.stub.UpdateConfigNode(
635+
pb2.UpdateConfigNodeRequest(
636+
id=config_node_id,
637+
etag=wrappers.StringValue(value=etag),
638+
display_name=wrappers.StringValue(value=display_name),
639+
description=wrappers.StringValue(value=description),
640+
entity_matching_pipeline_config=entity_matching_pipeline_config,
641+
bookmarks=bookmarks
642+
)
643+
)
644+
except Exception as exception:
645+
return logger.logger_error(exception)
646+
647+
if not response:
648+
return None
649+
return UpdateConfigNode.deserialize(response)
650+
651+
652+
def entity_matching_pipeline_config(self,
653+
node_filter,
654+
similarity_score_cutoff=None,
655+
property_mapping_status=None,
656+
property_mapping_message=None,
657+
entity_matching_status=None,
658+
entity_matching_message=None,
659+
property_mappings=None,
660+
rerun_interval=None,
661+
last_run_time=None,
662+
report_url=None,
663+
report_type=None):
664+
665+
"""
666+
create EntityMatchingPipelineConfig
667+
:param self:
668+
:param node_filter: EntityMatchingPipelineConfig.NodeFilter object
669+
:param similarity_score_cutoff: float
670+
:param property_mapping_status: EntityMatchingPipelineConfig.Status object
671+
:param property_mapping_message: google.protobuf.StringValue
672+
:param entity_matching_status: EntityMatchingPipelineConfig.Status
673+
:param entity_matching_message: google.protobuf.StringValue
674+
:param property_mappings: array of EntityMatchingPipelineConfig.PropertyMapping
675+
:param rerun_interval: string
676+
:param last_run_time: google.protobuf.Timestamp
677+
:param report_url: google.protobuf.StringValue
678+
:param report_type: google.protobuf.StringValue
679+
:return: EntityMatchingPipelineConfig object
680+
"""
681+
sys.excepthook = logger.handle_excepthook
682+
try:
683+
property_mapping_status = self.validate_entity_matching_status(property_mapping_status)
684+
entity_matching_status = self.validate_entity_matching_status(entity_matching_status)
685+
external_config = model_pb2.EntityMatchingPipelineConfig(
686+
node_filter=node_filter,
687+
similarity_score_cutoff=similarity_score_cutoff,
688+
property_mapping_status=property_mapping_status,
689+
property_mapping_message=wrappers.StringValue(value=property_mapping_message),
690+
entity_matching_status=entity_matching_status,
691+
entity_matching_message=wrappers.StringValue(value=entity_matching_message),
692+
property_mappings=property_mappings,
693+
rerun_interval=rerun_interval,
694+
last_run_time=last_run_time,
695+
report_url=wrappers.StringValue(value=report_url),
696+
report_type=wrappers.StringValue(value=report_type)
697+
)
698+
return external_config
699+
except Exception as exception:
700+
return logger.logger_error(exception)
701+
702+
567703
def validate_data_points(self, data_points):
568704
"""
569705
validate data_points requirement
@@ -641,6 +777,24 @@ def validate_external_data_resolver_content_type(self, content_type):
641777
return logger.logger_error(exception)
642778

643779

780+
def validate_entity_matching_status(self, status):
781+
"""
782+
validate entity matching status requirement
783+
:param self:
784+
:param status: number
785+
:return: status, none or error
786+
"""
787+
try:
788+
if not status:
789+
return None
790+
statuses = [s.value for s in EntityMatchingStatus]
791+
if status and status not in statuses:
792+
raise TypeError("status must be a member of EntityMatchingPipelineConfig.Status")
793+
return status
794+
except Exception as exception:
795+
return logger.logger_error(exception)
796+
797+
644798
def list_config_node_versions(self, id_config_node):
645799
"""
646800
list config nodes versions of the specified config node
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import sys
2+
from indykite_sdk.utils import jwt_credentials
3+
from indykite_sdk.utils.logger import handle_excepthook, logger_error
4+
5+
6+
class EntityMatchingClient(object):
7+
8+
def __init__(self, token_source=None):
9+
sys.excepthook = handle_excepthook
10+
try:
11+
self.channel, self.stub, self.credentials, self.token_source = jwt_credentials.get_credentials(
12+
client="entitymatching",
13+
token_source=token_source
14+
)
15+
except Exception as exception:
16+
return logger_error(exception)
17+
18+
# Imported methods
19+
from .read_suggested_property_mapping import read_suggested_property_mapping
20+
from .run_entity_matching_pipeline import run_entity_matching_pipeline
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import sys
2+
3+
from indykite_sdk.indykite.entitymatching.v1beta1 import entity_matching_api_pb2 as pb2
4+
from indykite_sdk.model.entity_matching import ReadSuggestedPropertyMappingResponse
5+
import indykite_sdk.utils.logger as logger
6+
7+
8+
def read_suggested_property_mapping(self, id):
9+
"""
10+
read suggested property mapping
11+
:param self:
12+
:param id: confg node GID id
13+
:return: deserialized ReadSuggestedPropertyMappingResponse
14+
"""
15+
sys.excepthook = logger.handle_excepthook
16+
try:
17+
response = self.stub.ReadSuggestedPropertyMapping(
18+
pb2.ReadSuggestedPropertyMappingRequest(
19+
id=id
20+
)
21+
)
22+
if not response:
23+
return None
24+
return ReadSuggestedPropertyMappingResponse.deserialize(response)
25+
except Exception as exception:
26+
return logger.logger_error(exception)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import sys
2+
3+
from indykite_sdk.indykite.entitymatching.v1beta1 import entity_matching_api_pb2 as pb2
4+
from indykite_sdk.model.entity_matching import RunEntityMatchingPipelineResponse
5+
import indykite_sdk.utils.logger as logger
6+
7+
8+
def run_entity_matching_pipeline(self, id, similarity_score_cutoff, custom_property_mappings=None):
9+
"""
10+
run entitymatching pipeline
11+
:param self:
12+
:param id: confg node GID id
13+
:param custom_property_mappings array of PropertyMapping
14+
:param similarity_score_cutoff float required threshold (in range [0,1])
15+
:return: deserialized RunEntityMatchingPipelineResponse
16+
"""
17+
sys.excepthook = logger.handle_excepthook
18+
try:
19+
response = self.stub.RunEntityMatchingPipeline(
20+
pb2.RunEntityMatchingPipelineRequest(
21+
id=id,
22+
custom_property_mappings=custom_property_mappings,
23+
similarity_score_cutoff=similarity_score_cutoff
24+
)
25+
)
26+
if not response:
27+
return None
28+
return RunEntityMatchingPipelineResponse.deserialize(response)
29+
except Exception as exception:
30+
return logger.logger_error(exception)

0 commit comments

Comments
 (0)