Skip to content

Commit 945ed94

Browse files
committed
Refactor IOV comparison functions and update PayloadIOV model to use 'extra' field; add new SQL query for payload IOVs with extra information.
1 parent 2561c4f commit 945ed94

5 files changed

Lines changed: 29 additions & 6 deletions

File tree

cdb_rest/iov_comparisons.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,31 +57,31 @@ def is_conflicting_iov_end_discrete(piov, major_iov, minor_iov):
5757
return (
5858
(piov.major_iov_end >= major_iov) or
5959
((piov.major_iov_end == major_iov) and
60-
((piov.minor_iov_end >= minor_iov) or (minor_iov_end is None))
60+
((piov.minor_iov_end >= minor_iov) or (minor_iov_end is None)))
6161
)
6262

6363

6464
def is_conflicting_iov_end_continuous(piov, major_iov, minor_iov):
6565
return (
6666
(piov.major_iov_end > major_iov) or
6767
((piov.major_iov_end == major_iov) and
68-
((piov.minor_iov_end > minor_iov) or (minor_iov_end is None))
68+
((piov.minor_iov_end > minor_iov) or (minor_iov_end is None)))
6969
)
7070

7171

7272
def is_iov_end_inside_discrete(piov, major_iov_end, minor_iov_end):
7373
return (
7474
(piov.major_iov_end < major_iov_end) or
7575
((piov.major_iov_end == major_iov_end) and
76-
((piov.minor_iov_end <= minor_iov_end) or (minor_iov_end is None))
76+
((piov.minor_iov_end <= minor_iov_end) or (minor_iov_end is None)))
7777
)
7878

7979

8080
def is_iov_end_inside_continuous(piov, major_iov_end, minor_iov_end):
8181
return (
8282
(piov.major_iov_end < major_iov_end) or
8383
((piov.major_iov_end == major_iov_end) and
84-
((piov.minor_iov_end < minor_iov_end) or (minor_iov_end is None))
84+
((piov.minor_iov_end < minor_iov_end) or (minor_iov_end is None)))
8585
)
8686

8787

cdb_rest/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ class PayloadIOV(models.Model):
101101
major_iov_end = models.BigIntegerField(db_column='major_iov_end')
102102
minor_iov_end = models.BigIntegerField(db_column='minor_iov_end')
103103
payload_list = models.ForeignKey(PayloadList, related_name='payload_iov', on_delete=models.CASCADE, null=True)
104-
description = models.CharField(max_length=255, db_column='description', null=True)
104+
extra = models.CharField(max_length=255, db_column='extra', null=True)
105105
inserted = models.DateTimeField(auto_now_add=True, db_column='created')
106106
updated = models.DateTimeField(auto_now=True, db_column='updated')
107107
comb_iov = models.DecimalField(db_column='comb_iov', max_digits=38, decimal_places=19, null=True)

cdb_rest/queries.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,17 @@
1212
) pi ON true
1313
JOIN "PayloadType" pt ON pl.payload_type_id = pt.id;
1414
'''
15+
get_payload_iovs_with_extra = '''
16+
SELECT pt.name AS payload_type_name, pi.payload_url, pi.checksum, pi.size, pi.major_iov, pi.minor_iov, pi.major_iov_end, pi.minor_iov_end, pi.extra as revision
17+
FROM "PayloadList" pl
18+
JOIN "GlobalTag" gt ON pl.global_tag_id = gt.id AND gt.name = %(my_gt)s
19+
JOIN LATERAL (
20+
SELECT payload_url, checksum, size, major_iov, minor_iov, major_iov_end, minor_iov_end, extra
21+
FROM "PayloadIOV" pi
22+
WHERE pi.payload_list_id = pl.id
23+
AND pi.comb_iov <= CAST(%(my_major_iov)s + CAST(%(my_minor_iov)s AS DECIMAL(19,0)) / 1E19 AS DECIMAL(38,19))
24+
ORDER BY pi.comb_iov DESC NULLS LAST
25+
LIMIT 1
26+
) pi ON true
27+
JOIN "PayloadType" pt ON pl.payload_type_id = pt.id;
28+
'''

cdb_rest/views.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,11 @@ def list(self, request):
600600
return Response(serializer.data)
601601

602602

603+
def _resolve_query(setting_name, default):
604+
query_name = getattr(settings, setting_name, None)
605+
if query_name:
606+
return getattr(cdb_rest.queries, query_name)
607+
return default
603608
class PayloadIOVsSQLListAPIView(ListAPIView):
604609

605610
def list(self, request):
@@ -609,8 +614,11 @@ def list(self, request):
609614
# If at least one read database is available, use it; otherwise, use "default"
610615
read_db = random.choice(read_dbs) if read_dbs else "default"
611616

617+
query = _resolve_query('CDB_PAYLOAD_IOVS_QUERY', cdb_rest.queries.get_payload_iovs)
618+
619+
612620
with connections[read_db].cursor() as cursor:
613-
cursor.execute(cdb_rest.queries.get_payload_iovs,
621+
cursor.execute(query,
614622
{'my_major_iov': self.request.GET.get('majorIOV'),
615623
'my_minor_iov': self.request.GET.get('minorIOV'),
616624
'my_gt': self.request.GET.get('gtName')})

nopayloaddb/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@
262262
}
263263

264264
CDB_IOV_MODE = os.environ.get('CDB_IOV_MODE', 'continuous')
265+
CDB_PAYLOAD_IOVS_QUERY = "get_payload_iovs_with_extra" # omit to use default
265266

266267
if CDB_IOV_MODE not in ('discrete', 'continuous'):
267268
raise ValueError(f"Invalid CDB_IOV_MODE '{CDB_IOV_MODE}'. Must be 'discrete' or 'continuous'.")

0 commit comments

Comments
 (0)