Skip to content

Commit d1f285a

Browse files
committed
Refresh snapshots and bump version to 0.0.112
1 parent a772b7e commit d1f285a

11 files changed

Lines changed: 425 additions & 155 deletions
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
version https://git-lfs.github.com/spec/v1
2-
oid sha256:519bfdbfbbd9896812649b39c97bb882557c95c25a995cf725d3e2e8fc3a7c9a
2+
oid sha256:f8cbbcd83c58ab1c7a711338003553599919e1f8a1c9f1576406904493b1012f
33
size 259493888
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
version https://git-lfs.github.com/spec/v1
2-
oid sha256:438b6c5bf6b045d69b02949030748d7b346507896d9511577daeba2696a45ded
2+
oid sha256:6a3dd6d364d372719d6208dd33b594ba09ed02a13552daa333f1f51613d5294c
33
size 317960192
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
version https://git-lfs.github.com/spec/v1
2-
oid sha256:5931d979b28f5a73965a0dcf323aca267c58db230383626ed99f806555e3098b
3-
size 441
2+
oid sha256:dc605919048190e61ad82d2451086a71d184301448d7e094f60474db3e8260e6
3+
size 525

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "teadata"
7-
version = "0.0.111"
7+
version = "0.0.112"
88
description = "Pythonic data engine for Texas education datasets"
99
authors = [{name="Alejandro Peña", email="adpena@gmail.com"}]
1010
readme = "README.md"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
version https://git-lfs.github.com/spec/v1
2-
oid sha256:519bfdbfbbd9896812649b39c97bb882557c95c25a995cf725d3e2e8fc3a7c9a
2+
oid sha256:f8cbbcd83c58ab1c7a711338003553599919e1f8a1c9f1576406904493b1012f
33
size 259493888
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
version https://git-lfs.github.com/spec/v1
2-
oid sha256:438b6c5bf6b045d69b02949030748d7b346507896d9511577daeba2696a45ded
2+
oid sha256:6a3dd6d364d372719d6208dd33b594ba09ed02a13552daa333f1f51613d5294c
33
size 317960192
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
version https://git-lfs.github.com/spec/v1
2-
oid sha256:5931d979b28f5a73965a0dcf323aca267c58db230383626ed99f806555e3098b
3-
size 441
2+
oid sha256:dc605919048190e61ad82d2451086a71d184301448d7e094f60474db3e8260e6
3+
size 525

teadata/engine.py

Lines changed: 251 additions & 109 deletions
Large diffs are not rendered by default.

teadata/query.py

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,15 @@
88
if TYPE_CHECKING:
99
from .engine import DataEngine
1010

11-
from .entities import EntityList, EntityMap, ReadOnlyEntityView, is_charter, is_private
11+
from .entities import (
12+
Campus,
13+
District,
14+
EntityList,
15+
EntityMap,
16+
ReadOnlyEntityView,
17+
is_charter,
18+
is_private,
19+
)
1220
from .geometry import point_xy
1321
from .grades import coerce_grade_bounds, coerce_grade_spans
1422

@@ -455,45 +463,42 @@ def _overlaps(obj: Any) -> bool:
455463
def _op_campuses_in(self, op: tuple):
456464
campuses: List[Any] = []
457465
for item in self._items:
458-
if getattr(item.__class__, "__name__", "") == "District":
466+
if isinstance(item, District):
459467
campuses.extend(self._repo.campuses_in(item))
460-
elif getattr(item.__class__, "__name__", "") == "Campus":
468+
elif isinstance(item, Campus):
461469
campuses.append(item)
462470
self._items = campuses
463471
return self
464472

465473
def _op_private_campuses_in(self, op: tuple):
466474
max_m = float(op[1]) if len(op) >= 2 and op[1] is not None else None
467475

476+
allowed_cache: Dict[uuid.UUID, set[uuid.UUID]] = {}
477+
478+
def _allowed_ids_for_district(district: District) -> set[uuid.UUID]:
479+
did = district.id
480+
allowed = allowed_cache.get(did)
481+
if allowed is None:
482+
allowed = {
483+
c.id for c in self._repo.private_campuses_in(district, max_miles=max_m)
484+
}
485+
allowed_cache[did] = allowed
486+
return allowed
487+
468488
campuses: List[Any] = []
469489
for item in self._items:
470-
if getattr(item.__class__, "__name__", "") == "District":
471-
campuses.extend(self._repo.private_campuses_in(item, max_miles=max_m))
472-
elif getattr(item.__class__, "__name__", "") == "Campus" and is_private(
473-
item
474-
):
475-
campuses.append(item)
476-
477-
if max_m is not None and campuses:
478-
allowed_cache: Dict[uuid.UUID, set[uuid.UUID]] = {}
479-
filtered: List[Any] = []
480-
for campus in campuses:
481-
district = campus.district
482-
if district is None:
483-
continue
484-
did = district.id
485-
allowed = allowed_cache.get(did)
486-
if allowed is None:
487-
allowed = {
488-
c.id
489-
for c in self._repo.private_campuses_in(
490-
district, max_miles=max_m
491-
)
492-
}
493-
allowed_cache[did] = allowed
494-
if campus.id in allowed:
495-
filtered.append(campus)
496-
campuses = filtered
490+
if isinstance(item, District):
491+
districts_private = self._repo.private_campuses_in(item, max_miles=max_m)
492+
campuses.extend(districts_private)
493+
elif isinstance(item, Campus) and is_private(item):
494+
if max_m is None:
495+
campuses.append(item)
496+
else:
497+
district = item.district
498+
if district is None:
499+
continue
500+
if item.id in _allowed_ids_for_district(district):
501+
campuses.append(item)
497502

498503
self._items = campuses
499504
return self
@@ -607,9 +612,9 @@ def _op_nearest_charter_same_type(self, op: tuple):
607612
k = int(op[1]) if len(op) >= 2 else 1
608613
campuses: List[Any] = []
609614
for item in self._items:
610-
if getattr(item.__class__, "__name__", "") == "Campus":
615+
if isinstance(item, Campus):
611616
campuses.append(item)
612-
elif getattr(item.__class__, "__name__", "") == "District":
617+
elif isinstance(item, District):
613618
campuses.extend(self._repo.campuses_in(item))
614619
if not campuses:
615620
self._items = []
@@ -625,9 +630,9 @@ def _op_nearest_charter_same_type(self, op: tuple):
625630
def _op_nearest_charter_transfer_destination(self, op: tuple):
626631
campuses: List[Any] = []
627632
for item in self._items:
628-
if getattr(item.__class__, "__name__", "") == "Campus":
633+
if isinstance(item, Campus):
629634
campuses.append(item)
630-
elif getattr(item.__class__, "__name__", "") == "District":
635+
elif isinstance(item, District):
631636
campuses.extend(self._repo.campuses_in(item))
632637
if not campuses:
633638
self._items = []
@@ -653,7 +658,7 @@ def _op_transfers_out(self, op: tuple):
653658
campuses = [
654659
it
655660
for it in self._items
656-
if getattr(it.__class__, "__name__", "") == "Campus"
661+
if isinstance(it, Campus)
657662
]
658663
rows = []
659664
for c in campuses:
@@ -674,7 +679,7 @@ def _op_transfers_in(self, op: tuple):
674679
campuses = [
675680
it
676681
for it in self._items
677-
if getattr(it.__class__, "__name__", "") == "Campus"
682+
if isinstance(it, Campus)
678683
]
679684
rows = []
680685
for c in campuses:

tests/test_engine_dsl_indexes.py

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import uuid
2+
3+
from teadata.classes import Campus, DataEngine, District
4+
5+
6+
def _district(name: str, number: str) -> District:
7+
return District(
8+
id=uuid.uuid4(),
9+
name=name,
10+
district_number=number,
11+
enrollment=1000,
12+
rating="A",
13+
)
14+
15+
16+
def _campus(
17+
district: District,
18+
*,
19+
name: str,
20+
campus_number: str,
21+
lon: float,
22+
lat: float,
23+
is_charter: bool = False,
24+
) -> Campus:
25+
return Campus(
26+
id=uuid.uuid4(),
27+
district_id=district.id,
28+
name=name,
29+
charter_type="Charter" if is_charter else "Public",
30+
is_charter=is_charter,
31+
district_number=district.district_number,
32+
campus_number=campus_number,
33+
location=(lon, lat),
34+
)
35+
36+
37+
def test_district_lookup_by_number_and_name_returns_all_matches():
38+
repo = DataEngine()
39+
d1 = _district("Alpha ISD", "123")
40+
d2 = _district("Alpha ISD", "'000123")
41+
d3 = _district("Beta ISD", "456")
42+
repo.add_district(d1)
43+
repo.add_district(d2)
44+
repo.add_district(d3)
45+
46+
number_hits = repo >> ("district", 123)
47+
assert [d.id for d in number_hits] == [d1.id, d2.id]
48+
49+
exact_hits = repo >> ("district", "ALPHA ISD")
50+
assert [d.id for d in exact_hits] == [d1.id, d2.id]
51+
52+
wildcard_hits = repo >> ("district", "ALPHA*")
53+
assert [d.id for d in wildcard_hits] == [d1.id, d2.id]
54+
55+
56+
def test_campus_lookup_by_exact_name_returns_all_matches():
57+
repo = DataEngine()
58+
d1 = _district("Gamma ISD", "111111")
59+
d2 = _district("Delta ISD", "222222")
60+
repo.add_district(d1)
61+
repo.add_district(d2)
62+
c1 = _campus(
63+
d1,
64+
name="Central High",
65+
campus_number="111111001",
66+
lon=-97.0,
67+
lat=32.0,
68+
)
69+
c2 = _campus(
70+
d2,
71+
name="Central High",
72+
campus_number="222222001",
73+
lon=-97.1,
74+
lat=32.1,
75+
)
76+
repo.add_campus(c1)
77+
repo.add_campus(c2)
78+
79+
hits = repo >> ("campus", "CENTRAL HIGH")
80+
assert [c.id for c in hits] == [c1.id, c2.id]
81+
82+
83+
def test_nearest_campuses_charter_only_returns_empty_when_no_charters():
84+
repo = DataEngine()
85+
d1 = _district("Echo ISD", "333333")
86+
repo.add_district(d1)
87+
repo.add_campus(
88+
_campus(
89+
d1,
90+
name="Echo Middle",
91+
campus_number="333333001",
92+
lon=-97.0,
93+
lat=32.0,
94+
)
95+
)
96+
97+
hits = repo.nearest_campuses(-97.0, 32.0, limit=3, charter_only=True)
98+
assert hits == []
99+
100+
101+
def test_nearest_campuses_respects_max_miles():
102+
repo = DataEngine()
103+
d1 = _district("Foxtrot ISD", "444444")
104+
repo.add_district(d1)
105+
near = _campus(
106+
d1,
107+
name="Near Campus",
108+
campus_number="444444001",
109+
lon=0.0,
110+
lat=0.0,
111+
)
112+
far = _campus(
113+
d1,
114+
name="Far Campus",
115+
campus_number="444444002",
116+
lon=1.0,
117+
lat=1.0,
118+
)
119+
repo.add_campus(near)
120+
repo.add_campus(far)
121+
122+
hits = repo.nearest_campuses(0.0, 0.0, limit=5, max_miles=10.0, geodesic=True)
123+
assert [c.id for c in hits] == [near.id]

0 commit comments

Comments
 (0)