Skip to content

Commit ddddc60

Browse files
author
Kevin Kim
committed
Parsing metadata fields
1 parent 0a1e147 commit ddddc60

File tree

3 files changed

+25
-7
lines changed

3 files changed

+25
-7
lines changed

labelbox/orm/query.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@ def results_query_part(entity):
4141
entity (type): The entity which needs fetching.
4242
"""
4343
# Query for fields
44-
fields = [field.graphql_name for field in entity.fields()]
44+
fields = [
45+
field.graphql_name if field.graphql_name != "customMetadata" else
46+
"customMetadata { value schemaId }" for field in entity.fields()
47+
]
4548

4649
# Query for cached relationships
4750
fields.extend([

labelbox/schema/data_row.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class DataRow(DbObject, Updateable, BulkDeletable):
3535
updated_at = Field.DateTime("updated_at")
3636
created_at = Field.DateTime("created_at")
3737
media_attributes = Field.Json("media_attributes")
38-
metadata_fields = Field.List(DataRowMetadataField, "metadata_fields")
38+
custom_metadata = Field.List(DataRowMetadataField, "custom_metadata")
3939

4040
# Relationships
4141
dataset = Relationship.ToOne("Dataset")

labelbox/schema/dataset.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from labelbox.exceptions import InvalidQueryError, LabelboxError, ResourceNotFoundError, InvalidAttributeError
1616
from labelbox.orm.db_object import DbObject, Updateable, Deletable
1717
from labelbox.orm.model import Entity, Field, Relationship
18+
from labelbox.schema.data_row_metadata import DataRowMetadataField
1819

1920
if TYPE_CHECKING:
2021
from labelbox import Task, User, DataRow
@@ -256,17 +257,32 @@ def validate_attachments(item):
256257
)
257258
return attachments
258259

260+
def convert_metadata_field(metadata_field):
261+
if isinstance(metadata_field, DataRowMetadataField):
262+
return metadata_field
263+
elif isinstance(metadata_field, dict):
264+
if not all (key in metadata_field for key in ("schema_id", "value")):
265+
raise ValueError(f"Custom metadata fields must have 'schema_id' and 'value' keys")
266+
return DataRowMetadataField(schema_id=metadata_field["schema_id"], value=metadata_field["value"])
267+
else:
268+
raise ValueError(f"Metadata field is neither 'DataRowMetadataField' type or a dictionary!")
269+
259270
def parse_metadata_fields(item):
260-
metadata_fields = item.get('metadata_fields')
271+
metadata_fields = item.get('custom_metadata')
261272
if metadata_fields:
273+
# Convert all metadata fields to DataRowMetadataField type
274+
metadata_fields = [
275+
convert_metadata_field(m)
276+
for m in metadata_fields
277+
]
262278
mdo = self.client.get_data_row_metadata_ontology()
263279
metadata = list(
264280
chain.from_iterable(
265281
mdo.parse_upsert(m) for m in metadata_fields))
266282
metadata_fields = [
267283
md.dict(by_alias=True) for md in metadata
268284
]
269-
item['metadata_fields'] = metadata_fields
285+
item['custom_metadata'] = metadata_fields
270286

271287
def format_row(item):
272288
# Formats user input into a consistent dict structure
@@ -308,9 +324,8 @@ def convert_item(item):
308324
validate_keys(item)
309325
# Make sure attachments are valid
310326
validate_attachments(item)
311-
print(f"!! Before parsing metadata field: {item}")
327+
# Parse metadata fields if they exist
312328
parse_metadata_fields(item)
313-
print(f"!! After parsing metadata field: {item}")
314329
# Upload any local file paths
315330
item = upload_if_necessary(item)
316331

@@ -329,7 +344,7 @@ def convert_item(item):
329344
items = [future.result() for future in as_completed(futures)]
330345
# Prepare and upload the desciptor file
331346
data = json.dumps(items)
332-
print(f"!! input data: {data}")
347+
#print(f"!! input data: {data}")
333348
return self.client.upload_data(data)
334349

335350
def data_rows_for_external_id(self,

0 commit comments

Comments
 (0)