Initial SQL-only 1C adapter baseline
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Query the unified 1C object route index by GUID or name fragment."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
|
||||
def load_json(path: Path) -> dict[str, Any]:
|
||||
return json.loads(path.read_text(encoding="utf-8-sig"))
|
||||
|
||||
|
||||
def normalize(value: str) -> str:
|
||||
return value.casefold().replace(" ", "")
|
||||
|
||||
|
||||
def compact(item: dict[str, Any]) -> dict[str, Any]:
|
||||
return {
|
||||
"guid": item["guid"],
|
||||
"route_kind": item.get("route_kind") or [],
|
||||
"dbnames": item.get("dbnames") or [],
|
||||
"xml_top_objects": item.get("xml_top_objects") or [],
|
||||
"xml_occurrence_count": item.get("xml_occurrence_count"),
|
||||
"config_routes": item.get("config_routes") or [],
|
||||
"extension_routes": item.get("extension_routes") or [],
|
||||
}
|
||||
|
||||
|
||||
def find_by_name(objects: dict[str, Any], name: str, limit: int) -> list[dict[str, Any]]:
|
||||
wanted = normalize(name)
|
||||
hits = []
|
||||
for item in objects.values():
|
||||
for top in item.get("xml_top_objects") or []:
|
||||
values = [top.get("name") or "", top.get("synonym") or "", top.get("relative_path") or ""]
|
||||
if any(wanted in normalize(value) for value in values):
|
||||
hits.append(item)
|
||||
break
|
||||
if len(hits) >= limit:
|
||||
break
|
||||
hits.sort(
|
||||
key=lambda item: (
|
||||
not any(normalize(top.get("name") or "") == wanted for top in item.get("xml_top_objects") or []),
|
||||
(item.get("xml_top_objects") or [{}])[0].get("relative_path") or "",
|
||||
)
|
||||
)
|
||||
return hits[:limit]
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = argparse.ArgumentParser(description="Query a 1C unified route index.")
|
||||
parser.add_argument("--index", type=Path, required=True)
|
||||
parser.add_argument("--guid")
|
||||
parser.add_argument("--name")
|
||||
parser.add_argument("--limit", type=int, default=20)
|
||||
parser.add_argument("--output", type=Path)
|
||||
args = parser.parse_args()
|
||||
|
||||
index = load_json(args.index)
|
||||
objects = index.get("objects") or {}
|
||||
if args.guid:
|
||||
item = objects.get(args.guid.lower())
|
||||
result = {"schema": "onec_route_query.v1", "query": {"guid": args.guid}, "matches": [compact(item)] if item else []}
|
||||
elif args.name:
|
||||
matches = [compact(item) for item in find_by_name(objects, args.name, args.limit)]
|
||||
result = {"schema": "onec_route_query.v1", "query": {"name": args.name}, "matches": matches}
|
||||
else:
|
||||
raise SystemExit("Use --guid or --name.")
|
||||
|
||||
text = json.dumps(result, ensure_ascii=False, indent=2) + "\n"
|
||||
if args.output:
|
||||
args.output.parent.mkdir(parents=True, exist_ok=True)
|
||||
args.output.write_text(text, encoding="utf-8")
|
||||
print(json.dumps({"output": str(args.output), "matches": len(result["matches"])}, ensure_ascii=False))
|
||||
else:
|
||||
print(text)
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user