63def fetch_project_period_runs():
64 """
65 Returns a dictionary {project_tag: {period: [runs]}}
66
67 retrieved from the coma database.
68 """
69
70 from sqlalchemy import (select, Table, Column,
71 String, Integer, ForeignKey)
72
73 from re import compile
74
75 LETTER_PART = compile(r"^(\D+)")
76
77 from DQUtils.oracle import make_oracle_connection
78
79 engine, metadata = make_oracle_connection("oracle://atlas_dd/atlasdd")
80
81 schema = "ATLAS_TAGS_METADATA"
82
83 coma_runs = Table("coma_runs", metadata,
84 Column("run_index", Integer),
85 Column("run_number", Integer),
86 schema=schema
87 )
88
89 coma_period_definitions = Table("coma_period_defs", metadata,
90 Column("p_index", Integer),
91 Column("p_project_period", String),
92 schema=schema
93 )
94 project_period = coma_period_definitions.c.p_project_period
95
96 coma_period_p1_to_runs = Table("coma_period_p1_to_runs", metadata,
97 Column("p2r_index", Integer),
98 Column("p_index", Integer, ForeignKey(coma_period_definitions.c.p_index)),
99 Column("run_index", Integer, ForeignKey(coma_runs.c.run_index)),
100 schema=schema
101 )
102 joined = coma_period_p1_to_runs.join(coma_runs).join(coma_period_definitions)
103
104 smt = (select([project_period, coma_runs.c.run_number], from_obj=joined)
105 .order_by(coma_runs.c.run_number))
106
107 projectperiod_runs = smt.execute().fetchall()
108
109 mapping = {}
110 for projectperiod, run in projectperiod_runs:
111 project, period = projectperiod.split(".")
112 period = period.replace("period", "")
113
114 project_dict = mapping.setdefault(project, {})
115 period_runs = project_dict.setdefault(period, [])
116 if not period_runs or period_runs[-1] != run:
117 period_runs.append(run)
118
119 period_letter = LETTER_PART.search(period)
120 if period_letter:
121 (period_letter,) = period_letter.groups()
122 period_runs = project_dict.setdefault(period_letter, [])
123 if not period_runs or period_runs[-1] != run:
124 period_runs.append(run)
125
126 return mapping
127