Skip to content

Commit c83fd4a

Browse files
authored
Determine sample name length limit from server capability (#614)
* Determine sample name length limit from server capability
1 parent 7e1621d commit c83fd4a

File tree

5 files changed

+160
-164
lines changed

5 files changed

+160
-164
lines changed

servicex/databinder_models.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -143,17 +143,22 @@ def validate_nfiles_is_not_zero(self):
143143
raise ValueError("NFiles cannot be set to zero for a dataset.")
144144
return self
145145

146-
@field_validator("Name", mode="before")
147-
@classmethod
148-
def truncate_long_sample_name(cls, v):
146+
def validate_title(self, length: Optional[int]) -> None:
149147
"""
150-
Truncate sample name to 512 characters if exceed
151-
Print warning message
148+
Logic for adjusting length of the title
152149
"""
153-
if len(v) > 512:
154-
logger.warning(f"Truncating Sample name to 512 characters for {v}")
155-
v = v[0:512]
156-
return v
150+
if length is None:
151+
# we adopt pre-3.2.0 behavior: truncate to 128 characters
152+
if len(self.Name) > 128:
153+
logger.warning(
154+
f"Truncating Sample name to 128 characters for {self.Name}"
155+
)
156+
self.Name = self.Name[:128]
157+
logger.warning(f"New name is {self.Name}")
158+
else:
159+
if len(self.Name) > length:
160+
logger.error(f"Sample name {self.Name} over the limit ({length})")
161+
raise ValueError(f"Sample name {self.Name} length too long")
157162

158163
@property
159164
def hash(self):

servicex/servicex_adapter.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ def __init__(self, url: str, refresh_token: Optional[str] = None):
7979

8080
# interact with _servicex_info via get_servicex_info
8181
self._servicex_info: Optional[ServiceXInfo] = None
82+
self._sample_title_limit: Optional[int] = None
8283

8384
async def _get_token(self):
8485
url = f"{self.url}/token/refresh"
@@ -162,6 +163,22 @@ async def get_servicex_info(self) -> ServiceXInfo:
162163
async def get_servicex_capabilities(self) -> List[str]:
163164
return (await self.get_servicex_info()).capabilities
164165

166+
async def get_servicex_sample_title_limit(self) -> Optional[int]:
167+
# check if the capability is defined
168+
capabilities = await self.get_servicex_capabilities()
169+
for capability in capabilities:
170+
if capability.startswith("long_sample_titles_"):
171+
try:
172+
# hope capability is of the form long_sample_titles_NNNN
173+
return int(capability[19:])
174+
except ValueError:
175+
raise RuntimeError(
176+
"Unable to determine allowed sample title length\n"
177+
f"Server capability is: {capability}"
178+
)
179+
180+
return None
181+
165182
async def get_transforms(self) -> List[TransformStatus]:
166183
headers = await self._get_authorization()
167184
retry_options = Retry(total=3, backoff_factor=10)

servicex/servicex_client.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,9 @@ def get_codegen(_sample: Sample, _general: General):
183183

184184
sx = ServiceXClient(backend=servicex_name, config_path=config_path)
185185
datasets = []
186+
title_length_limit = make_sync(sx.servicex.get_servicex_sample_title_limit)()
186187
for sample in config.Sample:
188+
sample.validate_title(title_length_limit)
187189
query = sx.generic_query(
188190
dataset_identifier=sample.dataset_identifier,
189191
title=sample.Name,

0 commit comments

Comments
 (0)