Skip to content

Commit a4739db

Browse files
authored
Using DuckDB extensions.
Dev
2 parents 88d5bc1 + 6d14584 commit a4739db

3 files changed

Lines changed: 203 additions & 53 deletions

File tree

examples/extensions/timeline.l

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Autogenerated header for Logica-DuckDB extension timeline.
2+
@Extension("timeline");
3+
PulseMult(a, s) = SqlExpr("PulseMult({a}, {s})", {a:, s:});
4+
PulseSum(a) = SqlExpr("PulseSum({a})", {a:});
5+
Threshold(a, threshold) = SqlExpr("Threshold({a}, {threshold})", {a:, threshold:});
6+
TimelineUnion(a, b) = SqlExpr("TimelineUnion({a}, {b})", {a:, b:});
7+
TimelineIntersect(a, b) = SqlExpr("TimelineIntersect({a}, {b})", {a:, b:});
8+
TimelineRender(a) = SqlExpr("TimelineRender({a})", {a:});
9+
PulseAdd(a) = SqlExpr("PulseAdd({a})", {a:});
10+
TimelineUnionAgg(a) = SqlExpr("TimelineUnionAgg({a})", {a:});
11+
TimelineIntersectAgg(a) = SqlExpr("TimelineIntersectAgg({a})", {a:});

examples/extensions/timeline.py

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@
1515
# limitations under the License.
1616

1717
LOGICA_EXTENSION = {
18-
"aggregations": ["PulseAdd", "TimelineUnionAgg", "TimelineIntersectAgg"],
18+
"aggregations": [
19+
"PulseAdd",
20+
"TimelineUnionAgg = TimelineUnionFinalize * ++ * TimelineToPulse",
21+
"TimelineIntersectAgg"],
1922
"functions": ["PulseMult", "PulseSum", "Threshold",
2023
"TimelineUnion", "TimelineIntersect", "TimelineRender"]
2124
}
@@ -152,11 +155,36 @@ def TimelineIntersect(a: list[KeyValue], b: list[KeyValue]) -> list[KeyValue]:
152155
thresholded: list[KeyValue] = Threshold(merged, 2.0)
153156
return PulseToTimeline(thresholded)
154157

155-
def TimelineUnionAgg(a: list[KeyValue], b: list[KeyValue]) -> list[KeyValue]:
156-
pa: list[KeyValue] = TimelineToPulse(a)
157-
pb: list[KeyValue] = TimelineToPulse(b)
158-
merged: list[KeyValue] = MergePulses(pa, pb)
159-
thresholded: list[KeyValue] = Threshold(merged, 1.0)
158+
def PulseConcat(a: list[KeyValue], b: list[KeyValue]) -> list[KeyValue]:
159+
result: list[KeyValue] = []
160+
i: int = 0
161+
while i < len(a):
162+
result.append(a[i])
163+
i = i + 1
164+
i = 0
165+
while i < len(b):
166+
result.append(b[i])
167+
i = i + 1
168+
return result
169+
170+
def CollapsePulses(a: list[KeyValue]) -> list[KeyValue]:
171+
sa = sorted(a, key=lambda x: x.arg)
172+
result: list[KeyValue] = []
173+
i: int = 0
174+
while i < len(sa):
175+
if len(result) > 0 and result[len(result) - 1].arg == sa[i].arg:
176+
result[len(result) - 1].value = result[len(result) - 1].value + sa[i].value
177+
else:
178+
e = KeyValue()
179+
e.arg = sa[i].arg
180+
e.value = sa[i].value
181+
result.append(e)
182+
i = i + 1
183+
return result
184+
185+
def TimelineUnionFinalize(a: list[KeyValue]) -> list[KeyValue]:
186+
collapsed: list[KeyValue] = CollapsePulses(a)
187+
thresholded: list[KeyValue] = Threshold(collapsed, 1.0)
160188
return PulseToTimeline(thresholded)
161189

162190
def TimelineIntersectAgg(a: list[KeyValue], b: list[KeyValue]) -> list[KeyValue]:

0 commit comments

Comments
 (0)