contextsynapse 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- contextsynapse/__init__.py +107 -0
- contextsynapse/__main__.py +9 -0
- contextsynapse/a2a/__init__.py +28 -0
- contextsynapse/a2a/client.py +120 -0
- contextsynapse/a2a/discovery.py +128 -0
- contextsynapse/a2a/handlers.py +164 -0
- contextsynapse/a2a/models.py +246 -0
- contextsynapse/a2a/streaming.py +92 -0
- contextsynapse/a2a/task_manager.py +275 -0
- contextsynapse/adapters/__init__.py +98 -0
- contextsynapse/adapters/_base.py +298 -0
- contextsynapse/adapters/autogen/__init__.py +4 -0
- contextsynapse/adapters/autogen/tools.py +34 -0
- contextsynapse/adapters/crewai/__init__.py +4 -0
- contextsynapse/adapters/crewai/tools.py +63 -0
- contextsynapse/adapters/langchain/__init__.py +19 -0
- contextsynapse/adapters/langchain/message_history.py +17 -0
- contextsynapse/adapters/langchain/retriever.py +158 -0
- contextsynapse/adapters/langchain/tools.py +43 -0
- contextsynapse/adapters/langgraph/__init__.py +21 -0
- contextsynapse/adapters/langgraph/checkpoint.py +223 -0
- contextsynapse/adapters/langgraph/context_tools.py +341 -0
- contextsynapse/adapters/langgraph/message_history.py +138 -0
- contextsynapse/adapters/langgraph/tools.py +43 -0
- contextsynapse/adapters/llamaindex/__init__.py +4 -0
- contextsynapse/adapters/llamaindex/tools.py +64 -0
- contextsynapse/adapters/openai/__init__.py +24 -0
- contextsynapse/adapters/openai/tools.py +206 -0
- contextsynapse/adapters/pydantic_ai/__init__.py +4 -0
- contextsynapse/adapters/pydantic_ai/tools.py +36 -0
- contextsynapse/adapters/swarm/__init__.py +4 -0
- contextsynapse/adapters/swarm/tools.py +44 -0
- contextsynapse/agents/__init__.py +6 -0
- contextsynapse/agents/auto_capture.py +80 -0
- contextsynapse/agents/dispatcher.py +299 -0
- contextsynapse/agents/notifications.py +112 -0
- contextsynapse/aiql/__init__.py +71 -0
- contextsynapse/aiql/cache.py +341 -0
- contextsynapse/aiql/compiler/__init__.py +62 -0
- contextsynapse/aiql/compiler/optimizer.py +126 -0
- contextsynapse/aiql/compiler/planner.py +366 -0
- contextsynapse/aiql/compiler/statistics.py +235 -0
- contextsynapse/aiql/compiler/validator.py +425 -0
- contextsynapse/aiql/engine/__init__.py +11 -0
- contextsynapse/aiql/engine/chunk_storage.py +2584 -0
- contextsynapse/aiql/engine/executor.py +7737 -0
- contextsynapse/aiql/engine/extraction_integration.py +442 -0
- contextsynapse/aiql/engine/graph_builder.py +405 -0
- contextsynapse/aiql/engine/node_creation_from_normalized.py +691 -0
- contextsynapse/aiql/engine/performance_monitor.py +289 -0
- contextsynapse/aiql/engine/postprocessing.py +365 -0
- contextsynapse/aiql/engine/ray_stage_executors.py +918 -0
- contextsynapse/aiql/engine/redis_cache.py +106 -0
- contextsynapse/aiql/engine/streaming_json.py +366 -0
- contextsynapse/aiql/engine/streaming_parquet.py +568 -0
- contextsynapse/aiql/engine/streaming_ray_chunking.py +419 -0
- contextsynapse/aiql/grammar/__init__.py +14 -0
- contextsynapse/aiql/grammar/aiql_grammar.py +1822 -0
- contextsynapse/aiql/grammar/base.py +71 -0
- contextsynapse/aiql/parser/__init__.py +46 -0
- contextsynapse/aiql/parser/aiql_parser.py +11330 -0
- contextsynapse/aiql/parser/base_parser.py +47 -0
- contextsynapse/api/__init__.py +5 -0
- contextsynapse/api/a2a_router.py +233 -0
- contextsynapse/api/admin_router.py +140 -0
- contextsynapse/api/agent_worker_router.py +978 -0
- contextsynapse/api/algorithms_router.py +317 -0
- contextsynapse/api/api.py +4144 -0
- contextsynapse/api/audit.py +204 -0
- contextsynapse/api/auth.py +441 -0
- contextsynapse/api/auth_router.py +537 -0
- contextsynapse/api/billing.py +261 -0
- contextsynapse/api/billing_router.py +275 -0
- contextsynapse/api/boundary_router.py +452 -0
- contextsynapse/api/cognition_router.py +116 -0
- contextsynapse/api/connector_router.py +237 -0
- contextsynapse/api/context_router.py +1619 -0
- contextsynapse/api/dashboard_router.py +11367 -0
- contextsynapse/api/errors.py +183 -0
- contextsynapse/api/events.py +88 -0
- contextsynapse/api/experiment_bootstrap.py +321 -0
- contextsynapse/api/experiment_orchestrator.py +1078 -0
- contextsynapse/api/experiment_router.py +2089 -0
- contextsynapse/api/feature_gate.py +89 -0
- contextsynapse/api/federation_router.py +108 -0
- contextsynapse/api/integrations.py +567 -0
- contextsynapse/api/integrations_router.py +461 -0
- contextsynapse/api/intelligence_router.py +1028 -0
- contextsynapse/api/metering.py +155 -0
- contextsynapse/api/metrics.py +112 -0
- contextsynapse/api/models.py +38 -0
- contextsynapse/api/monitoring_router.py +174 -0
- contextsynapse/api/pipeline_router.py +1437 -0
- contextsynapse/api/playground_conn.py +116 -0
- contextsynapse/api/projects_router.py +131 -0
- contextsynapse/api/queries_router.py +282 -0
- contextsynapse/api/quota.py +95 -0
- contextsynapse/api/rate_limit.py +64 -0
- contextsynapse/api/search_router.py +261 -0
- contextsynapse/api/shield_router.py +447 -0
- contextsynapse/api/tenant_guard.py +103 -0
- contextsynapse/api/tenant_quotas.py +231 -0
- contextsynapse/api/tenants.py +305 -0
- contextsynapse/api/users.py +646 -0
- contextsynapse/api/v1.py +167 -0
- contextsynapse/api/vertical_builder_router.py +387 -0
- contextsynapse/benchmark/__init__.py +15 -0
- contextsynapse/benchmark/__main__.py +64 -0
- contextsynapse/benchmark/agents.py +338 -0
- contextsynapse/benchmark/live_ab.py +338 -0
- contextsynapse/benchmark/reporter.py +149 -0
- contextsynapse/benchmark/runner.py +264 -0
- contextsynapse/benchmark/savings.py +266 -0
- contextsynapse/benchmark/token_counter.py +212 -0
- contextsynapse/benchmark/workloads.py +289 -0
- contextsynapse/buffer/__init__.py +154 -0
- contextsynapse/buffer/base.py +257 -0
- contextsynapse/buffer/duckdb_buffer.py +246 -0
- contextsynapse/buffer/file_buffer.py +229 -0
- contextsynapse/buffer/lmdb_buffer.py +286 -0
- contextsynapse/buffer/local_buffer.py +154 -0
- contextsynapse/buffer/redis_buffer.py +211 -0
- contextsynapse/buffer/sqlite_buffer.py +266 -0
- contextsynapse/cache.py +2 -0
- contextsynapse/cli/__init__.py +40 -0
- contextsynapse/cli/cli.py +475 -0
- contextsynapse/cli/config_cli.py +177 -0
- contextsynapse/cli/scaffold.py +465 -0
- contextsynapse/cognition/__init__.py +31 -0
- contextsynapse/cognition/derivation.py +55 -0
- contextsynapse/cognition/events.py +135 -0
- contextsynapse/cognition/feedback.py +52 -0
- contextsynapse/cognition/hallucination.py +90 -0
- contextsynapse/cognition/invalidation.py +70 -0
- contextsynapse/cognition/read_tracker.py +50 -0
- contextsynapse/collaboration.py +2 -0
- contextsynapse/comparison.py +2 -0
- contextsynapse/config/__init__.py +10 -0
- contextsynapse/config/connectors/amfi_nav.yaml +18 -0
- contextsynapse/config/connectors/auto_sector.yaml +20 -0
- contextsynapse/config/connectors/banking_sector.yaml +20 -0
- contextsynapse/config/connectors/energy_sector.yaml +20 -0
- contextsynapse/config/connectors/fmcg_sector.yaml +20 -0
- contextsynapse/config/connectors/nsdl_fpi.yaml +9 -0
- contextsynapse/config/connectors/nse_price.yaml +61 -0
- contextsynapse/config/connectors/pharma_sector.yaml +20 -0
- contextsynapse/config/connectors/rbi_dbie.yaml +12 -0
- contextsynapse/config/context_presets/ai_research.json +25 -0
- contextsynapse/config/context_presets/chatgpt_conversations.json +19 -0
- contextsynapse/config/context_presets/claude_conversations.json +19 -0
- contextsynapse/config/context_presets/legal_compliance.json +21 -0
- contextsynapse/config/context_presets/meeting_notes.json +21 -0
- contextsynapse/config/context_presets/slack_engineering.json +21 -0
- contextsynapse/config/context_presets/tech_climate.json +24 -0
- contextsynapse/config/context_presets/toi_politics.json +25 -0
- contextsynapse/config/database_config.py +453 -0
- contextsynapse/config/deployment.py +221 -0
- contextsynapse/config/gpt_action_schema.json +164 -0
- contextsynapse/config/indicators/india_macro.yaml +213 -0
- contextsynapse/config/logging_config.py +88 -0
- contextsynapse/config/mode_config.py +223 -0
- contextsynapse/config/schemas/api_spec.yaml +48 -0
- contextsynapse/config/schemas/architecture_doc.yaml +51 -0
- contextsynapse/config/schemas/chat_history.yaml +90 -0
- contextsynapse/config/schemas/chatgpt_conversation.yaml +101 -0
- contextsynapse/config/schemas/claude_conversation.yaml +148 -0
- contextsynapse/config/schemas/contract.yaml +48 -0
- contextsynapse/config/schemas/conversation.yaml +167 -0
- contextsynapse/config/schemas/database.yaml +74 -0
- contextsynapse/config/schemas/decision.yaml +72 -0
- contextsynapse/config/schemas/ecommerce.yaml +56 -0
- contextsynapse/config/schemas/education.yaml +42 -0
- contextsynapse/config/schemas/healthcare.yaml +133 -0
- contextsynapse/config/schemas/hr_document.yaml +48 -0
- contextsynapse/config/schemas/invoice.yaml +40 -0
- contextsynapse/config/schemas/knowledge_base.yaml +75 -0
- contextsynapse/config/schemas/legal.yaml +42 -0
- contextsynapse/config/schemas/marketing_content.yaml +48 -0
- contextsynapse/config/schemas/meeting_notes.yaml +51 -0
- contextsynapse/config/schemas/news_article.yaml +61 -0
- contextsynapse/config/schemas/real_estate.yaml +49 -0
- contextsynapse/config/schemas/requirements_doc.yaml +48 -0
- contextsynapse/config/schemas/research_paper.yaml +56 -0
- contextsynapse/config/schemas/resume.yaml +49 -0
- contextsynapse/config/schemas/retail.yaml +42 -0
- contextsynapse/config/schemas/rule_meta.yaml +173 -0
- contextsynapse/config/schemas/rules.yaml +72 -0
- contextsynapse/config/schemas/screener_meta.yaml +236 -0
- contextsynapse/config/schemas/sdlc.yaml +103 -0
- contextsynapse/config/schemas/session_graph.yaml +172 -0
- contextsynapse/config/schemas/support_ticket.yaml +48 -0
- contextsynapse/config/schemas/web.yaml +64 -0
- contextsynapse/config/sensors/earnings_calendar.yaml +52 -0
- contextsynapse/config/sensors/global_risk.yaml +53 -0
- contextsynapse/config/sensors/government_policy.yaml +54 -0
- contextsynapse/config/sensors/supply_chain.yaml +50 -0
- contextsynapse/config/sensors/templates/behavioral.yaml +56 -0
- contextsynapse/config/sensors/templates/equity_sentiment.yaml +48 -0
- contextsynapse/config/sensors/templates/global_macro.yaml +47 -0
- contextsynapse/config/sensors/templates/market_data.yaml +118 -0
- contextsynapse/config/sensors/templates/sector_technical.yaml +47 -0
- contextsynapse/config/sensors/weather.yaml +52 -0
- contextsynapse/config/storage_strategy.py +202 -0
- contextsynapse/config/templates/competitive_intel.yaml +39 -0
- contextsynapse/config/templates/geopolitical_risk.yaml +46 -0
- contextsynapse/config/templates/market_analysis.yaml +58 -0
- contextsynapse/connectors/__init__.py +15 -0
- contextsynapse/connectors/api_router.py +121 -0
- contextsynapse/connectors/base.py +357 -0
- contextsynapse/connectors/financial/audio.py +170 -0
- contextsynapse/connectors/financial/youtube.py +272 -0
- contextsynapse/connectors/github.py +164 -0
- contextsynapse/connectors/jira.py +120 -0
- contextsynapse/connectors/kafka_connector.py +124 -0
- contextsynapse/connectors/pipeline_connector.py +747 -0
- contextsynapse/connectors/registry.py +116 -0
- contextsynapse/connectors/scheduler.py +87 -0
- contextsynapse/connectors/universal.py +360 -0
- contextsynapse/context/__init__.py +96 -0
- contextsynapse/context/__main__.py +4 -0
- contextsynapse/context/acl.py +125 -0
- contextsynapse/context/agent_card.py +201 -0
- contextsynapse/context/agent_memory.py +814 -0
- contextsynapse/context/agents.py +472 -0
- contextsynapse/context/agents_redis.py +391 -0
- contextsynapse/context/assembled.py +204 -0
- contextsynapse/context/attribution.py +113 -0
- contextsynapse/context/blob.py +184 -0
- contextsynapse/context/boundaries.py +187 -0
- contextsynapse/context/boundary.py +507 -0
- contextsynapse/context/bundle.py +155 -0
- contextsynapse/context/cli.py +519 -0
- contextsynapse/context/collaboration.py +165 -0
- contextsynapse/context/compiler.py +604 -0
- contextsynapse/context/composite.py +536 -0
- contextsynapse/context/compression.py +147 -0
- contextsynapse/context/context_manager.py +888 -0
- contextsynapse/context/context_schema.py +90 -0
- contextsynapse/context/context_schema.yaml +105 -0
- contextsynapse/context/context_units.py +891 -0
- contextsynapse/context/conversation.py +488 -0
- contextsynapse/context/dedup.py +207 -0
- contextsynapse/context/document_processor.py +698 -0
- contextsynapse/context/embedding_hooks.py +338 -0
- contextsynapse/context/execution_schema.py +274 -0
- contextsynapse/context/fan_out.py +138 -0
- contextsynapse/context/frozen.py +80 -0
- contextsynapse/context/gravity.py +227 -0
- contextsynapse/context/hub.py +1401 -0
- contextsynapse/context/ingest.py +391 -0
- contextsynapse/context/injection.py +226 -0
- contextsynapse/context/interaction_graphifier.py +562 -0
- contextsynapse/context/layers.py +574 -0
- contextsynapse/context/projection.py +1195 -0
- contextsynapse/context/promotion.py +634 -0
- contextsynapse/context/proof.py +131 -0
- contextsynapse/context/propagation.py +577 -0
- contextsynapse/context/pubsub.py +135 -0
- contextsynapse/context/quality.py +1054 -0
- contextsynapse/context/quality_tracker.py +270 -0
- contextsynapse/context/scoping.py +370 -0
- contextsynapse/context/seed.py +992 -0
- contextsynapse/context/session.py +1142 -0
- contextsynapse/context/session_graph.py +593 -0
- contextsynapse/context/session_memory.py +309 -0
- contextsynapse/context/session_resolver.py +111 -0
- contextsynapse/context/skill_learning.py +237 -0
- contextsynapse/context/smart_budget.py +129 -0
- contextsynapse/context/source_policy.py +242 -0
- contextsynapse/context/store_factory.py +53 -0
- contextsynapse/context/sync.py +648 -0
- contextsynapse/context/token.py +236 -0
- contextsynapse/context/vector_integration.py +297 -0
- contextsynapse/context/webhooks.py +194 -0
- contextsynapse/context/working_memory.py +224 -0
- contextsynapse/core/__init__.py +18 -0
- contextsynapse/core/archiver.py +237 -0
- contextsynapse/core/change_stream.py +282 -0
- contextsynapse/core/checkpoint.py +310 -0
- contextsynapse/core/cloud_storage.py +387 -0
- contextsynapse/core/context_state.py +651 -0
- contextsynapse/core/cron.py +324 -0
- contextsynapse/core/datasource.py +643 -0
- contextsynapse/core/db.py +289 -0
- contextsynapse/core/federation.py +283 -0
- contextsynapse/core/graph_coordinator.py +201 -0
- contextsynapse/core/graph_intelligence.py +388 -0
- contextsynapse/core/graph_structures.py +106 -0
- contextsynapse/core/graph_sync.py +157 -0
- contextsynapse/core/hybrid_graph_storage.py +2998 -0
- contextsynapse/core/lifecycle.py +691 -0
- contextsynapse/core/multiworker.py +378 -0
- contextsynapse/core/pruning.py +312 -0
- contextsynapse/core/redis_registry.py +524 -0
- contextsynapse/core/registry.py +1043 -0
- contextsynapse/core/registry_factory.py +51 -0
- contextsynapse/core/registry_metadata.py +294 -0
- contextsynapse/core/replay.py +354 -0
- contextsynapse/core/replication.py +339 -0
- contextsynapse/core/time_travel.py +260 -0
- contextsynapse/core/write_behind.py +152 -0
- contextsynapse/core/write_context.py +39 -0
- contextsynapse/db/__init__.py +1 -0
- contextsynapse/db/postgres.py +267 -0
- contextsynapse/db/profile.py +236 -0
- contextsynapse/db/rules.py +328 -0
- contextsynapse/demo/__init__.py +0 -0
- contextsynapse/demo/report.py +147 -0
- contextsynapse/demo/runner.py +520 -0
- contextsynapse/demo/scenario.py +165 -0
- contextsynapse/demo/session_demo.py +280 -0
- contextsynapse/demo/session_report.py +143 -0
- contextsynapse/demo/universal_runner.py +257 -0
- contextsynapse/engine/__init__.py +15 -0
- contextsynapse/engine/core.py +555 -0
- contextsynapse/extraction/__init__.py +69 -0
- contextsynapse/extraction/cli.py +274 -0
- contextsynapse/extraction/config.py +107 -0
- contextsynapse/extraction/examples/example_usage.py +118 -0
- contextsynapse/extraction/examples/sample_manifest.json +53 -0
- contextsynapse/extraction/examples/sample_normalized.json +185 -0
- contextsynapse/extraction/extract_engine.py +440 -0
- contextsynapse/extraction/extractors/__init__.py +37 -0
- contextsynapse/extraction/extractors/chat_export_extractor.py +189 -0
- contextsynapse/extraction/extractors/csv_extractor.py +83 -0
- contextsynapse/extraction/extractors/docx_extractor.py +129 -0
- contextsynapse/extraction/extractors/excel_extractor.py +152 -0
- contextsynapse/extraction/extractors/html_extractor.py +146 -0
- contextsynapse/extraction/extractors/pdf_extractor.py +635 -0
- contextsynapse/extraction/extractors/pdf_extractor_layoutparser.py +408 -0
- contextsynapse/extraction/extractors/register_extractors.py +63 -0
- contextsynapse/extraction/extractors/text_extractor.py +65 -0
- contextsynapse/extraction/extractors/txt_extractor.py +120 -0
- contextsynapse/extraction/extractors/website_extractor.py +246 -0
- contextsynapse/extraction/fact_extractor.py +236 -0
- contextsynapse/extraction/file_manager.py +353 -0
- contextsynapse/extraction/hierarchy.py +239 -0
- contextsynapse/extraction/id_generator.py +450 -0
- contextsynapse/extraction/layout_detector.py +409 -0
- contextsynapse/extraction/llm_entity_extractor.py +301 -0
- contextsynapse/extraction/normalized_store.py +480 -0
- contextsynapse/extraction/normalizer.py +594 -0
- contextsynapse/extraction/parquet_writer.py +598 -0
- contextsynapse/extraction/post_processors/__init__.py +40 -0
- contextsynapse/extraction/post_processors/column_reorganizer.py +507 -0
- contextsynapse/extraction/ray_normalization.py +233 -0
- contextsynapse/extraction/ray_runner.py +207 -0
- contextsynapse/extraction/redis_schema_registry.py +222 -0
- contextsynapse/extraction/registry.py +204 -0
- contextsynapse/extraction/schema_loader.py +663 -0
- contextsynapse/extraction/schema_registry.py +230 -0
- contextsynapse/extraction/semantic_normalizer.py +245 -0
- contextsynapse/extraction/version_manager.py +314 -0
- contextsynapse/gateway/__init__.py +24 -0
- contextsynapse/gateway/action_emitter.py +212 -0
- contextsynapse/gateway/cost_tracker.py +508 -0
- contextsynapse/gateway/gateway.py +377 -0
- contextsynapse/gateway/policy.py +303 -0
- contextsynapse/governance/__init__.py +13 -0
- contextsynapse/governance/layer.py +513 -0
- contextsynapse/ingestion/__init__.py +15 -0
- contextsynapse/ingestion/amplifier.py +288 -0
- contextsynapse/ingestion/async_ingest.py +463 -0
- contextsynapse/ingestion/chunker.py +303 -0
- contextsynapse/ingestion/chunking.py +58 -0
- contextsynapse/ingestion/cleaner.py +190 -0
- contextsynapse/ingestion/cleanse.py +252 -0
- contextsynapse/ingestion/connectors/__init__.py +38 -0
- contextsynapse/ingestion/connectors/base.py +300 -0
- contextsynapse/ingestion/connectors/chatgpt_memory.py +247 -0
- contextsynapse/ingestion/connectors/claude_memory.py +274 -0
- contextsynapse/ingestion/connectors/sap_ingestor.py +208 -0
- contextsynapse/ingestion/content_detector.py +80 -0
- contextsynapse/ingestion/content_monitor.py +502 -0
- contextsynapse/ingestion/dedup.py +106 -0
- contextsynapse/ingestion/feed.py +640 -0
- contextsynapse/ingestion/filters.py +461 -0
- contextsynapse/ingestion/graph_builder.py +705 -0
- contextsynapse/ingestion/input_classifier.py +307 -0
- contextsynapse/ingestion/job_manager.py +571 -0
- contextsynapse/ingestion/llm_extractor.py +610 -0
- contextsynapse/ingestion/orchestrator.py +116 -0
- contextsynapse/ingestion/parsers/__init__.py +19 -0
- contextsynapse/ingestion/parsers/graph_parser_registry.py +103 -0
- contextsynapse/ingestion/parsers/graphml_parser.py +141 -0
- contextsynapse/ingestion/parsers/jsonld_parser.py +171 -0
- contextsynapse/ingestion/parsers/rdf_parser.py +150 -0
- contextsynapse/ingestion/pipeline_context.py +228 -0
- contextsynapse/ingestion/pipeline_store.py +1195 -0
- contextsynapse/ingestion/queue.py +133 -0
- contextsynapse/ingestion/reprocess.py +179 -0
- contextsynapse/ingestion/scenario_router.py +224 -0
- contextsynapse/ingestion/schema_extractor.py +759 -0
- contextsynapse/ingestion/schema_validator.py +274 -0
- contextsynapse/ingestion/sdlc_ingest.py +87 -0
- contextsynapse/ingestion/smart_ingest.py +2451 -0
- contextsynapse/ingestion/source_connector.py +171 -0
- contextsynapse/ingestion/stage_executor.py +2095 -0
- contextsynapse/ingestion/stages/__init__.py +9 -0
- contextsynapse/ingestion/stages/tabular_to_graph.py +289 -0
- contextsynapse/ingestion/strategies.py +386 -0
- contextsynapse/ingestion/universal/__init__.py +4 -0
- contextsynapse/ingestion/universal/_operator_registry.py +59 -0
- contextsynapse/ingestion/universal/ingest_content.py +32 -0
- contextsynapse/ingestion/universal/operators/__init__.py +1 -0
- contextsynapse/ingestion/universal/operators/base.py +19 -0
- contextsynapse/ingestion/universal/operators/build_edges.py +75 -0
- contextsynapse/ingestion/universal/operators/cluster_topics.py +397 -0
- contextsynapse/ingestion/universal/operators/deduplicate.py +45 -0
- contextsynapse/ingestion/universal/operators/detect_signals.py +90 -0
- contextsynapse/ingestion/universal/operators/embed.py +80 -0
- contextsynapse/ingestion/universal/operators/extract_entities.py +253 -0
- contextsynapse/ingestion/universal/operators/extract_preferences.py +117 -0
- contextsynapse/ingestion/universal/operators/filter_content.py +69 -0
- contextsynapse/ingestion/universal/operators/index_bm25.py +52 -0
- contextsynapse/ingestion/universal/operators/infer_domains.py +69 -0
- contextsynapse/ingestion/universal/operators/link_cross_reference.py +210 -0
- contextsynapse/ingestion/universal/operators/parse_records.py +66 -0
- contextsynapse/ingestion/universal/operators/resolve_entities.py +261 -0
- contextsynapse/ingestion/universal/operators/scanners/__init__.py +16 -0
- contextsynapse/ingestion/universal/operators/scanners/edges.py +173 -0
- contextsynapse/ingestion/universal/operators/scanners/git.py +187 -0
- contextsynapse/ingestion/universal/operators/scanners/github.py +135 -0
- contextsynapse/ingestion/universal/operators/scanners/github_api.py +509 -0
- contextsynapse/ingestion/universal/operators/scanners/helpers.py +67 -0
- contextsynapse/ingestion/universal/operators/scanners/jira.py +65 -0
- contextsynapse/ingestion/universal/operators/scanners/llm_enrichment.py +82 -0
- contextsynapse/ingestion/universal/operators/scanners/repo.py +149 -0
- contextsynapse/ingestion/universal/operators/sdlc_scan.py +213 -0
- contextsynapse/ingestion/universal/operators/spec_scanner.py +149 -0
- contextsynapse/ingestion/universal/operators/store_documents.py +72 -0
- contextsynapse/ingestion/universal/operators/synthesize_cu.py +180 -0
- contextsynapse/ingestion/universal/operators/validate_gate.py +65 -0
- contextsynapse/ingestion/universal/parsers/__init__.py +5 -0
- contextsynapse/ingestion/universal/parsers/record_parser.py +203 -0
- contextsynapse/ingestion/universal/parsers/turn_parser.py +329 -0
- contextsynapse/ingestion/universal/shared_signals.py +161 -0
- contextsynapse/ingestion/universal/stage_executor.py +219 -0
- contextsynapse/ingestion/web_crawler.py +265 -0
- contextsynapse/intelligence/__init__.py +53 -0
- contextsynapse/intelligence/alerts.py +198 -0
- contextsynapse/intelligence/collector.py +655 -0
- contextsynapse/intelligence/comparison.py +198 -0
- contextsynapse/intelligence/config.py +56 -0
- contextsynapse/intelligence/conflict_detector.py +182 -0
- contextsynapse/intelligence/context_gaps.py +192 -0
- contextsynapse/intelligence/context_radar.py +135 -0
- contextsynapse/intelligence/correlation_engine.py +416 -0
- contextsynapse/intelligence/correlation_template.py +120 -0
- contextsynapse/intelligence/dedup.py +296 -0
- contextsynapse/intelligence/event_bus.py +91 -0
- contextsynapse/intelligence/feedback_loop.py +101 -0
- contextsynapse/intelligence/freshness.py +307 -0
- contextsynapse/intelligence/fundamental_feed.py +551 -0
- contextsynapse/intelligence/geo_data.py +170 -0
- contextsynapse/intelligence/geo_reference.py +112 -0
- contextsynapse/intelligence/graph_fusion.py +465 -0
- contextsynapse/intelligence/heuristics.py +176 -0
- contextsynapse/intelligence/impact_tracker.py +336 -0
- contextsynapse/intelligence/macro_indicators.py +319 -0
- contextsynapse/intelligence/ocr.py +104 -0
- contextsynapse/intelligence/persistence.py +267 -0
- contextsynapse/intelligence/pipeline_health.py +130 -0
- contextsynapse/intelligence/price_feed.py +221 -0
- contextsynapse/intelligence/rate_limiter.py +130 -0
- contextsynapse/intelligence/reactive.py +411 -0
- contextsynapse/intelligence/runtime_context.py +390 -0
- contextsynapse/intelligence/sentiment_decay.py +426 -0
- contextsynapse/intelligence/session.py +277 -0
- contextsynapse/intelligence/signal_hierarchy.py +438 -0
- contextsynapse/intelligence/signals.py +185 -0
- contextsynapse/intelligence/source_watcher.py +132 -0
- contextsynapse/intelligence/table_enricher.py +256 -0
- contextsynapse/intelligence/tagger.py +319 -0
- contextsynapse/intelligence/timeseries.py +209 -0
- contextsynapse/intelligence/tracker.py +318 -0
- contextsynapse/intelligence/watchdog.py +392 -0
- contextsynapse/intelligence/watchdog_manager.py +263 -0
- contextsynapse/intelligence/webhook_receiver.py +165 -0
- contextsynapse/intelligence/weight_learner.py +234 -0
- contextsynapse/llm/__init__.py +8 -0
- contextsynapse/llm/client.py +348 -0
- contextsynapse/llm/rate_limiter.py +166 -0
- contextsynapse/logging_config.py +2 -0
- contextsynapse/marketplace/__init__.py +7 -0
- contextsynapse/marketplace/registry.py +173 -0
- contextsynapse/mcp/__init__.py +11 -0
- contextsynapse/mcp/__main__.py +4 -0
- contextsynapse/mcp/auth_middleware.py +212 -0
- contextsynapse/mcp/connection_pool.py +128 -0
- contextsynapse/mcp/server.py +986 -0
- contextsynapse/mcp/session_context.py +67 -0
- contextsynapse/memory/__init__.py +34 -0
- contextsynapse/memory/engine.py +475 -0
- contextsynapse/memory/temporal.py +327 -0
- contextsynapse/metadata/__init__.py +12 -0
- contextsynapse/metadata/metadata_db.py +272 -0
- contextsynapse/metadata/metadata_query_tool.py +300 -0
- contextsynapse/metadata/metadata_tracker.py +425 -0
- contextsynapse/models/__init__.py +27 -0
- contextsynapse/models/embedding_service.py +360 -0
- contextsynapse/models/model_registry.py +228 -0
- contextsynapse/multiworker.py +2 -0
- contextsynapse/pipelines/__init__.py +1 -0
- contextsynapse/pipelines/executor.py +851 -0
- contextsynapse/pipelines/filters.py +189 -0
- contextsynapse/pipelines/models.py +176 -0
- contextsynapse/pipelines/scheduler.py +268 -0
- contextsynapse/playground/__init__.py +1 -0
- contextsynapse/playground/templates.py +85 -0
- contextsynapse/plugins/__init__.py +43 -0
- contextsynapse/plugins/api.py +66 -0
- contextsynapse/plugins/base.py +350 -0
- contextsynapse/plugins/domain_interface.py +508 -0
- contextsynapse/plugins/domain_loader.py +241 -0
- contextsynapse/plugins/loader.py +148 -0
- contextsynapse/plugins/registry.py +265 -0
- contextsynapse/project/__init__.py +11 -0
- contextsynapse/project/code_context.py +807 -0
- contextsynapse/project/connectors/__init__.py +4 -0
- contextsynapse/project/connectors/github_connector.py +113 -0
- contextsynapse/project/connectors/jira_connector.py +160 -0
- contextsynapse/project/graph.py +1023 -0
- contextsynapse/project/project_context.py +545 -0
- contextsynapse/project/scanner_registry.py +61 -0
- contextsynapse/project/schema_manager.py +322 -0
- contextsynapse/project/schemas/knowledge.yaml +59 -0
- contextsynapse/project/schemas/sdlc.yaml +369 -0
- contextsynapse/project/sdlc_schema.py +172 -0
- contextsynapse/project/spec_parser.py +85 -0
- contextsynapse/project/task_lock.py +181 -0
- contextsynapse/project/task_stream.py +203 -0
- contextsynapse/project/team_tools.py +537 -0
- contextsynapse/py.typed +0 -0
- contextsynapse/realtime/__init__.py +6 -0
- contextsynapse/realtime/collaboration.py +147 -0
- contextsynapse/rules/__init__.py +10 -0
- contextsynapse/rules/engine.py +116 -0
- contextsynapse/rules/evaluators/__init__.py +6 -0
- contextsynapse/rules/evaluators/aggregate.py +205 -0
- contextsynapse/rules/evaluators/custom.py +170 -0
- contextsynapse/rules/evaluators/pre_action.py +125 -0
- contextsynapse/rules/evaluators/temporal.py +129 -0
- contextsynapse/rules/loader.py +52 -0
- contextsynapse/rules/models.py +124 -0
- contextsynapse/rules/universal.py +393 -0
- contextsynapse/scheduler.py +229 -0
- contextsynapse/schema/__init__.py +42 -0
- contextsynapse/schema/compiler.py +252 -0
- contextsynapse/schema/composer.py +158 -0
- contextsynapse/schema/dedup.py +73 -0
- contextsynapse/schema/derivation.py +172 -0
- contextsynapse/schema/sdl.py +326 -0
- contextsynapse/schema/validation_gate.py +124 -0
- contextsynapse/sdk/__init__.py +63 -0
- contextsynapse/sdk/agent.py +214 -0
- contextsynapse/sdk/client.py +269 -0
- contextsynapse/sdk/exceptions.py +23 -0
- contextsynapse/sdk/models.py +78 -0
- contextsynapse/sdk/session.py +408 -0
- contextsynapse/sdk/tracked.py +218 -0
- contextsynapse/sdk/worker.py +266 -0
- contextsynapse/sdk/workspace_client.py +98 -0
- contextsynapse/sdk/ws.py +41 -0
- contextsynapse/search/__init__.py +20 -0
- contextsynapse/search/embedding_cache.py +140 -0
- contextsynapse/search/enhanced_search.py +152 -0
- contextsynapse/search/fulltext.py +130 -0
- contextsynapse/search/graph_search.py +634 -0
- contextsynapse/search/lmdb_index.py +1218 -0
- contextsynapse/search/nl_to_aiql.py +199 -0
- contextsynapse/search/rag.py +1346 -0
- contextsynapse/search/rag_cache.py +167 -0
- contextsynapse/search/reasoning_chain.py +231 -0
- contextsynapse/search/redis_search.py +207 -0
- contextsynapse/search/retrieval_quality.py +314 -0
- contextsynapse/search/semantic_query.py +455 -0
- contextsynapse/search/text_resolver.py +159 -0
- contextsynapse/search/whoosh_search.py +373 -0
- contextsynapse/security/__init__.py +17 -0
- contextsynapse/security/audit.py +297 -0
- contextsynapse/security/audit_logger.py +97 -0
- contextsynapse/security/audit_trail.py +270 -0
- contextsynapse/security/auth_unified.py +284 -0
- contextsynapse/security/auto_tagger.py +230 -0
- contextsynapse/security/data_security.py +218 -0
- contextsynapse/security/encryption.py +207 -0
- contextsynapse/security/identity.py +447 -0
- contextsynapse/security/jwt_identity.py +59 -0
- contextsynapse/security/middleware.py +336 -0
- contextsynapse/security/pii.py +233 -0
- contextsynapse/security/rbac.py +96 -0
- contextsynapse/security/rls.py +205 -0
- contextsynapse/security/sanitize.py +233 -0
- contextsynapse/security/scoped_encryption.py +131 -0
- contextsynapse/security/tenant.py +401 -0
- contextsynapse/shield/__init__.py +21 -0
- contextsynapse/shield/anomaly.py +56 -0
- contextsynapse/shield/permissions.py +99 -0
- contextsynapse/shield/profile.py +103 -0
- contextsynapse/shield/shield.py +108 -0
- contextsynapse/shield/trust_engine.py +69 -0
- contextsynapse/skills/__init__.py +14 -0
- contextsynapse/skills/engine.py +233 -0
- contextsynapse/skills/loader.py +59 -0
- contextsynapse/skills/models.py +139 -0
- contextsynapse/storage/__init__.py +7 -0
- contextsynapse/storage/cache.py +208 -0
- contextsynapse/storage/columnar_store_v2.py +178 -0
- contextsynapse/storage/csr_graph_storage.py +587 -0
- contextsynapse/storage/csr_store.py +388 -0
- contextsynapse/storage/document_store.py +491 -0
- contextsynapse/storage/hnsw_index.py +294 -0
- contextsynapse/storage/hybrid_store_v2.py +278 -0
- contextsynapse/storage/lmdb_graph_storage.py +366 -0
- contextsynapse/storage/migration.py +279 -0
- contextsynapse/storage/namespace_store.py +346 -0
- contextsynapse/storage/pure_graph_storage.py +185 -0
- contextsynapse/storage/redis_graph_adapter.py +186 -0
- contextsynapse/storage/redis_graph_storage.py +375 -0
- contextsynapse/storage/router/__init__.py +29 -0
- contextsynapse/storage/router/duckdb_store.py +398 -0
- contextsynapse/storage/router/factory.py +83 -0
- contextsynapse/storage/router/interface.py +125 -0
- contextsynapse/storage/router/postgres_store.py +339 -0
- contextsynapse/storage/router/resolver.py +192 -0
- contextsynapse/storage/router/router.py +300 -0
- contextsynapse/storage/single_file_storage.py +391 -0
- contextsynapse/storage/storage_manager.py +214 -0
- contextsynapse/storage/storage_query_optimizer.py +314 -0
- contextsynapse/storage/wal.py +359 -0
- contextsynapse/temporal/__init__.py +0 -0
- contextsynapse/temporal/storage.py +106 -0
- contextsynapse/tests/__init__.py +11 -0
- contextsynapse/tests/regression/__init__.py +1 -0
- contextsynapse/tests/regression/add_metadata.py +395 -0
- contextsynapse/tests/regression/add_skip_flags.py +85 -0
- contextsynapse/tests/regression/cases/test_basic_create_node.yaml +20 -0
- contextsynapse/tests/regression/cases/test_basic_select.yaml +21 -0
- contextsynapse/tests/regression/cases/test_blockchain_audit_trail.yaml +37 -0
- contextsynapse/tests/regression/cases/test_blockchain_audit_trail_filtered.yaml +39 -0
- contextsynapse/tests/regression/cases/test_blockchain_blocks_range.yaml +39 -0
- contextsynapse/tests/regression/cases/test_blockchain_get_block.yaml +35 -0
- contextsynapse/tests/regression/cases/test_blockchain_latest_block.yaml +35 -0
- contextsynapse/tests/regression/cases/test_blockchain_length.yaml +37 -0
- contextsynapse/tests/regression/cases/test_blockchain_merkle_root.yaml +37 -0
- contextsynapse/tests/regression/cases/test_blockchain_verify.yaml +35 -0
- contextsynapse/tests/regression/cases/test_blockchain_verify_block.yaml +35 -0
- contextsynapse/tests/regression/cases/test_create_edge.yaml +28 -0
- contextsynapse/tests/regression/cases/test_delete_edge_basic.yaml +29 -0
- contextsynapse/tests/regression/cases/test_delete_node_basic.yaml +29 -0
- contextsynapse/tests/regression/cases/test_evaluation_mrr.yaml +40 -0
- contextsynapse/tests/regression/cases/test_evaluation_ndcg.yaml +40 -0
- contextsynapse/tests/regression/cases/test_evaluation_precision.yaml +40 -0
- contextsynapse/tests/regression/cases/test_evaluation_recall.yaml +40 -0
- contextsynapse/tests/regression/cases/test_group_by_basic.yaml +56 -0
- contextsynapse/tests/regression/cases/test_match_node_basic.yaml +29 -0
- contextsynapse/tests/regression/cases/test_match_node_with_order_limit.yaml +31 -0
- contextsynapse/tests/regression/cases/test_namespace_switch.yaml +18 -0
- contextsynapse/tests/regression/cases/test_pipeline_cascaded.yaml +61 -0
- contextsynapse/tests/regression/cases/test_pipeline_fixed_size_chunking.yaml +48 -0
- contextsynapse/tests/regression/cases/test_pipeline_gpt4_chunking.yaml +54 -0
- contextsynapse/tests/regression/cases/test_pipeline_hybrid_indexing.yaml +57 -0
- contextsynapse/tests/regression/cases/test_pipeline_large_embedding.yaml +52 -0
- contextsynapse/tests/regression/cases/test_pipeline_paragraph_chunking.yaml +49 -0
- contextsynapse/tests/regression/cases/test_pipeline_recursive_chunking.yaml +47 -0
- contextsynapse/tests/regression/cases/test_pipeline_run_pipeline.yaml +56 -0
- contextsynapse/tests/regression/cases/test_pipeline_section_based_chunking.yaml +53 -0
- contextsynapse/tests/regression/cases/test_pipeline_semantic_chunking.yaml +51 -0
- contextsynapse/tests/regression/cases/test_pipeline_with_entity_extraction.yaml +57 -0
- contextsynapse/tests/regression/cases/test_pipeline_with_relationships.yaml +62 -0
- contextsynapse/tests/regression/cases/test_rag_evaluation.yaml +38 -0
- contextsynapse/tests/regression/cases/test_rag_graph_bfs_with_eval.yaml +48 -0
- contextsynapse/tests/regression/cases/test_rag_graph_centrality.yaml +40 -0
- contextsynapse/tests/regression/cases/test_rag_graph_centrality_eval.yaml +35 -0
- contextsynapse/tests/regression/cases/test_rag_graph_community.yaml +40 -0
- contextsynapse/tests/regression/cases/test_rag_graph_community_eval.yaml +35 -0
- contextsynapse/tests/regression/cases/test_rag_graph_dfs_with_eval.yaml +35 -0
- contextsynapse/tests/regression/cases/test_rag_graph_multi_hop_eval.yaml +35 -0
- contextsynapse/tests/regression/cases/test_rag_graph_path.yaml +40 -0
- contextsynapse/tests/regression/cases/test_rag_graph_search_basic.yaml +38 -0
- contextsynapse/tests/regression/cases/test_rag_graph_search_bfs.yaml +52 -0
- contextsynapse/tests/regression/cases/test_rag_graph_search_dfs.yaml +41 -0
- contextsynapse/tests/regression/cases/test_rag_graph_search_multi_hop.yaml +43 -0
- contextsynapse/tests/regression/cases/test_rag_graph_search_shortest_path.yaml +41 -0
- contextsynapse/tests/regression/cases/test_rag_graph_search_weighted.yaml +43 -0
- contextsynapse/tests/regression/cases/test_rag_graph_shortest_path_eval.yaml +35 -0
- contextsynapse/tests/regression/cases/test_rag_graph_traversal.yaml +30 -0
- contextsynapse/tests/regression/cases/test_rag_graph_weighted_eval.yaml +35 -0
- contextsynapse/tests/regression/cases/test_rag_hybrid_search.yaml +33 -0
- contextsynapse/tests/regression/cases/test_rag_hybrid_with_prompt_embedding.yaml +44 -0
- contextsynapse/tests/regression/cases/test_rag_keyword_search.yaml +32 -0
- contextsynapse/tests/regression/cases/test_rag_multi_hop_graph.yaml +32 -0
- contextsynapse/tests/regression/cases/test_rag_path_based.yaml +34 -0
- contextsynapse/tests/regression/cases/test_rag_profile_based.yaml +32 -0
- contextsynapse/tests/regression/cases/test_rag_vector_search.yaml +32 -0
- contextsynapse/tests/regression/cases/test_rag_weighted_graph.yaml +34 -0
- contextsynapse/tests/regression/cases/test_rag_weighted_hybrid.yaml +31 -0
- contextsynapse/tests/regression/cases/test_semantic_boundary_chunking.yaml +57 -0
- contextsynapse/tests/regression/cases/test_semantic_boundary_detection.yaml +33 -0
- contextsynapse/tests/regression/cases/test_semantic_hash_function.yaml +30 -0
- contextsynapse/tests/regression/cases/test_semantic_hash_with_model.yaml +31 -0
- contextsynapse/tests/regression/cases/test_tcs_ingestion_fixed_size.yaml +44 -0
- contextsynapse/tests/regression/cases/test_tcs_ingestion_recursive.yaml +46 -0
- contextsynapse/tests/regression/cases/test_tcs_ingestion_section.yaml +46 -0
- contextsynapse/tests/regression/cases/test_tcs_ingestion_semantic.yaml +44 -0
- contextsynapse/tests/regression/cases/test_time_travel_as_of.yaml +35 -0
- contextsynapse/tests/regression/cases/test_time_travel_at_commit.yaml +33 -0
- contextsynapse/tests/regression/cases/test_time_travel_at_timestamp.yaml +33 -0
- contextsynapse/tests/regression/cases/test_time_travel_for_system_time_all.yaml +37 -0
- contextsynapse/tests/regression/cases/test_time_travel_versions_between.yaml +39 -0
- contextsynapse/tests/regression/cases/test_traverse_basic.yaml +31 -0
- contextsynapse/tests/regression/cases/test_traverse_max_depth.yaml +34 -0
- contextsynapse/tests/regression/cases/test_update_edge_basic.yaml +29 -0
- contextsynapse/tests/regression/evaluation_metrics.py +227 -0
- contextsynapse/tests/regression/regression_runner.py +1081 -0
- contextsynapse/tests/regression/setup_regression_data.py +212 -0
- contextsynapse/tests/regression/test_basic_only.py +84 -0
- contextsynapse/tests/regression/test_namespace_creation.py +29 -0
- contextsynapse/tests/regression/test_single_fix.py +61 -0
- contextsynapse/tests/regression/test_single_query.py +20 -0
- contextsynapse/tests/regression/validate_test_syntax.py +179 -0
- contextsynapse/tests/test_advanced_features.py +347 -0
- contextsynapse/tests/test_aiql_summary.py +283 -0
- contextsynapse/tests/test_all_aiql_queries.py +948 -0
- contextsynapse/tests/test_all_create_queries.py +213 -0
- contextsynapse/tests/test_api_vs_native.py +280 -0
- contextsynapse/tests/test_chunking_dedup.py +199 -0
- contextsynapse/tests/test_connectors.py +171 -0
- contextsynapse/tests/test_edges_and_match.py +202 -0
- contextsynapse/tests/test_extraction_pipeline_integration.py +581 -0
- contextsynapse/tests/test_name_property.py +224 -0
- contextsynapse/tests/test_node_edge_metadata.py +250 -0
- contextsynapse/tests/test_playground_conn.py +114 -0
- contextsynapse/tests/test_query_cache.py +213 -0
- contextsynapse/tests/test_source_policy_auth.py +348 -0
- contextsynapse/tests/test_temporal_and_domain.py +224 -0
- contextsynapse/tests/test_time_travel_e2e.py +571 -0
- contextsynapse/tests/test_traversal_and_aggregation.py +275 -0
- contextsynapse/tools/__init__.py +36 -0
- contextsynapse/tools/a2a_tools.py +106 -0
- contextsynapse/tools/cognition_tools.py +118 -0
- contextsynapse/tools/context.py +905 -0
- contextsynapse/tools/formatting.py +92 -0
- contextsynapse/tools/gateway_tools.py +186 -0
- contextsynapse/tools/graph.py +1700 -0
- contextsynapse/tools/intelligence.py +235 -0
- contextsynapse/tools/memory.py +118 -0
- contextsynapse/tools/registry.py +373 -0
- contextsynapse/tools/shield_tools.py +159 -0
- contextsynapse/tools/tasks.py +341 -0
- contextsynapse/tools/workspace_tools.py +124 -0
- contextsynapse/utils/__init__.py +15 -0
- contextsynapse/utils/config_loader.py +198 -0
- contextsynapse/utils/env_loader.py +156 -0
- contextsynapse/utils/file_utils.py +288 -0
- contextsynapse/utils/logging_optimizer.py +119 -0
- contextsynapse/vector/__init__.py +30 -0
- contextsynapse/vector/chroma_vector_store.py +152 -0
- contextsynapse/vector/custom_vector_store.py +537 -0
- contextsynapse/vector/faiss_vector_store.py +296 -0
- contextsynapse/vector/qdrant_vector_store.py +163 -0
- contextsynapse/vector/vector_db.py +953 -0
- contextsynapse/vector/vector_db_manager.py +197 -0
- contextsynapse/workspace/__init__.py +27 -0
- contextsynapse/workspace/base.py +94 -0
- contextsynapse/workspace/git.py +228 -0
- contextsynapse/workspace/github.py +78 -0
- contextsynapse/workspace/local.py +73 -0
- contextsynapse/workspace/tools.py +222 -0
- contextsynapse-1.0.0.dist-info/METADATA +847 -0
- contextsynapse-1.0.0.dist-info/RECORD +776 -0
- contextsynapse-1.0.0.dist-info/WHEEL +5 -0
- contextsynapse-1.0.0.dist-info/entry_points.txt +4 -0
- contextsynapse-1.0.0.dist-info/licenses/LICENSE +200 -0
- contextsynapse-1.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,948 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Comprehensive Test Suite for All AIQL Queries
|
|
3
|
+
|
|
4
|
+
Tests all major AIQL query types both natively and via API.
|
|
5
|
+
|
|
6
|
+
This test suite covers:
|
|
7
|
+
- CREATE operations (NODE, EDGE, GRAPH, COLLECTION, INDEX)
|
|
8
|
+
- SELECT queries (basic, WHERE, LIMIT, COUNT, ORDER BY, GROUP BY, aggregations)
|
|
9
|
+
- UPDATE operations (NODE, EDGE)
|
|
10
|
+
- DELETE operations (NODE, EDGE)
|
|
11
|
+
- MATCH queries (NODE, patterns, RETURN, WHERE)
|
|
12
|
+
- TRAVERSE queries (FROM, VIA, DEPTH, MAX DEPTH, WHERE)
|
|
13
|
+
- Search queries (DENSE, SPARSE, HYBRID, SEMANTIC, GRAPH)
|
|
14
|
+
- RAG queries (Simple RAG, RAG GENERATE)
|
|
15
|
+
- Analytics (PAGERANK, SHORTEST_PATH, COMMUNITY_DETECTION, GRAPH SUMMARY, HOP)
|
|
16
|
+
- Variable declarations (LET)
|
|
17
|
+
- MERGE operations
|
|
18
|
+
- NEIGHBORS queries
|
|
19
|
+
- Namespace operations
|
|
20
|
+
- Statistics and metadata
|
|
21
|
+
- Transaction operations
|
|
22
|
+
- And more...
|
|
23
|
+
|
|
24
|
+
Usage:
|
|
25
|
+
# Test both native and API (API server must be running)
|
|
26
|
+
python test_all_aiql_queries.py
|
|
27
|
+
|
|
28
|
+
# To start API server:
|
|
29
|
+
python -m contextsynapse.api.server
|
|
30
|
+
|
|
31
|
+
Note: Some queries may be marked as expected_success=False if they require
|
|
32
|
+
specific setup (e.g., embeddings for search, graph structure for analytics).
|
|
33
|
+
These will still be tested but failures won't count against the test suite.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
import sys
|
|
37
|
+
import os
|
|
38
|
+
import json
|
|
39
|
+
import time
|
|
40
|
+
import argparse
|
|
41
|
+
from pathlib import Path
|
|
42
|
+
try:
|
|
43
|
+
import requests
|
|
44
|
+
REQUESTS_AVAILABLE = True
|
|
45
|
+
except ImportError:
|
|
46
|
+
REQUESTS_AVAILABLE = False
|
|
47
|
+
print("[WARN] requests library not available. API tests will be skipped.")
|
|
48
|
+
|
|
49
|
+
# Add project root to path
|
|
50
|
+
project_root = Path(__file__).parent.parent
|
|
51
|
+
sys.path.insert(0, str(project_root))
|
|
52
|
+
|
|
53
|
+
from contextsynapse.core.hybrid_graph_storage import AIContextDB
|
|
54
|
+
from contextsynapse.aiql.engine.executor import AIQLExecutor
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class AIQLQueryTester:
|
|
58
|
+
"""Comprehensive tester for all AIQL queries."""
|
|
59
|
+
|
|
60
|
+
def __init__(self, namespace: str = "test_all_queries", api_url: str = "http://localhost:8000",
|
|
61
|
+
test_native_only: bool = False, test_api_only: bool = False):
|
|
62
|
+
self.namespace = namespace
|
|
63
|
+
self.api_url = api_url
|
|
64
|
+
self.test_native_only = test_native_only
|
|
65
|
+
self.test_api_only = test_api_only
|
|
66
|
+
|
|
67
|
+
# Generate session ID for stateful API testing (so all requests share same graph instance)
|
|
68
|
+
import uuid
|
|
69
|
+
self.session_id = str(uuid.uuid4())
|
|
70
|
+
|
|
71
|
+
# Setup native executor
|
|
72
|
+
self.graph = AIContextDB(name=namespace, storage_backend='csr')
|
|
73
|
+
self.graph.buffer_enabled = False
|
|
74
|
+
self.executor = AIQLExecutor(contextcore=self.graph)
|
|
75
|
+
self.executor.active_namespace = namespace
|
|
76
|
+
|
|
77
|
+
# Track created UUIDs for cleanup
|
|
78
|
+
self.created_node_uuids = []
|
|
79
|
+
self.created_edge_uuids = []
|
|
80
|
+
|
|
81
|
+
# Results
|
|
82
|
+
self.results = {
|
|
83
|
+
'native': {},
|
|
84
|
+
'api': {}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
def setup(self):
|
|
88
|
+
"""Setup test environment."""
|
|
89
|
+
print("\n[SETUP] Creating namespace...")
|
|
90
|
+
try:
|
|
91
|
+
self.executor.execute(f"CREATE NAMESPACE {self.namespace}")
|
|
92
|
+
self.executor.execute(f"USE NAMESPACE {self.namespace}")
|
|
93
|
+
print("[OK] Namespace created")
|
|
94
|
+
except Exception as e:
|
|
95
|
+
print(f"[WARN] Namespace might already exist: {e}")
|
|
96
|
+
|
|
97
|
+
def test_native(self, query_name: str, query: str, expected_success: bool = True):
|
|
98
|
+
"""Test query natively."""
|
|
99
|
+
try:
|
|
100
|
+
result = self.executor.execute(query)
|
|
101
|
+
success = result.get('success', True) if isinstance(result, dict) else True
|
|
102
|
+
|
|
103
|
+
if expected_success:
|
|
104
|
+
self.results['native'][query_name] = success
|
|
105
|
+
status = "[PASS]" if success else "[FAIL]"
|
|
106
|
+
print(f" {status} {query_name}")
|
|
107
|
+
else:
|
|
108
|
+
# For queries that might fail, just check no exception
|
|
109
|
+
self.results['native'][query_name] = True
|
|
110
|
+
print(f" [OK] {query_name} (executed without exception)")
|
|
111
|
+
|
|
112
|
+
return result
|
|
113
|
+
except Exception as e:
|
|
114
|
+
self.results['native'][query_name] = False
|
|
115
|
+
print(f" [FAIL] {query_name}: {e}")
|
|
116
|
+
return None
|
|
117
|
+
|
|
118
|
+
def test_api(self, query_name: str, query: str, expected_success: bool = True):
|
|
119
|
+
"""Test query via API."""
|
|
120
|
+
if not REQUESTS_AVAILABLE:
|
|
121
|
+
self.results['api'][query_name] = None
|
|
122
|
+
print(f" [SKIP] {query_name} (API): requests library not available")
|
|
123
|
+
return None
|
|
124
|
+
|
|
125
|
+
try:
|
|
126
|
+
response = requests.post(
|
|
127
|
+
f"{self.api_url}/aiql",
|
|
128
|
+
json={
|
|
129
|
+
"query": query,
|
|
130
|
+
"namespace": self.namespace,
|
|
131
|
+
"session_id": self.session_id # Use stateful session for consistent graph instance
|
|
132
|
+
},
|
|
133
|
+
timeout=30 # Increased timeout for complex queries
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
if response.status_code == 200:
|
|
137
|
+
result = response.json()
|
|
138
|
+
success = result.get('success', True)
|
|
139
|
+
|
|
140
|
+
if expected_success:
|
|
141
|
+
self.results['api'][query_name] = success
|
|
142
|
+
status = "[PASS]" if success else "[FAIL]"
|
|
143
|
+
print(f" {status} {query_name} (API)")
|
|
144
|
+
else:
|
|
145
|
+
# For queries that might fail, just check no exception
|
|
146
|
+
self.results['api'][query_name] = True
|
|
147
|
+
print(f" [OK] {query_name} (API) (executed without exception)")
|
|
148
|
+
|
|
149
|
+
return result
|
|
150
|
+
else:
|
|
151
|
+
# Check if it's an expected failure
|
|
152
|
+
if not expected_success:
|
|
153
|
+
self.results['api'][query_name] = True
|
|
154
|
+
print(f" [OK] {query_name} (API) (expected failure: HTTP {response.status_code})")
|
|
155
|
+
else:
|
|
156
|
+
self.results['api'][query_name] = False
|
|
157
|
+
print(f" [FAIL] {query_name} (API): HTTP {response.status_code}")
|
|
158
|
+
return None
|
|
159
|
+
except requests.exceptions.ConnectionError:
|
|
160
|
+
self.results['api'][query_name] = None # API not available
|
|
161
|
+
print(f" [SKIP] {query_name} (API): API server not running (start with: python -m contextsynapse.api.server)")
|
|
162
|
+
return None
|
|
163
|
+
except requests.exceptions.Timeout:
|
|
164
|
+
self.results['api'][query_name] = None
|
|
165
|
+
print(f" [SKIP] {query_name} (API): Request timeout")
|
|
166
|
+
return None
|
|
167
|
+
except Exception as e:
|
|
168
|
+
if not expected_success:
|
|
169
|
+
self.results['api'][query_name] = True
|
|
170
|
+
print(f" [OK] {query_name} (API) (expected failure: {str(e)[:50]})")
|
|
171
|
+
else:
|
|
172
|
+
self.results['api'][query_name] = False
|
|
173
|
+
print(f" [FAIL] {query_name} (API): {e}")
|
|
174
|
+
return None
|
|
175
|
+
|
|
176
|
+
def test_both(self, query_name: str, query: str, expected_success: bool = True):
|
|
177
|
+
"""Test query both natively and via API."""
|
|
178
|
+
print(f"\n[TEST] {query_name}")
|
|
179
|
+
print(f" Query: {query[:80]}..." if len(query) > 80 else f" Query: {query}")
|
|
180
|
+
|
|
181
|
+
native_result = None
|
|
182
|
+
api_result = None
|
|
183
|
+
|
|
184
|
+
if not self.test_api_only:
|
|
185
|
+
native_result = self.test_native(query_name, query, expected_success)
|
|
186
|
+
|
|
187
|
+
if not self.test_native_only and REQUESTS_AVAILABLE:
|
|
188
|
+
api_result = self.test_api(query_name, query, expected_success)
|
|
189
|
+
|
|
190
|
+
return native_result, api_result
|
|
191
|
+
|
|
192
|
+
def run_all_tests(self):
|
|
193
|
+
"""Run comprehensive test suite."""
|
|
194
|
+
print("=" * 80)
|
|
195
|
+
print("COMPREHENSIVE AIQL QUERY TEST SUITE")
|
|
196
|
+
print("=" * 80)
|
|
197
|
+
|
|
198
|
+
if self.test_native_only:
|
|
199
|
+
print("\n[MODE] Testing NATIVE execution only")
|
|
200
|
+
elif self.test_api_only:
|
|
201
|
+
print("\n[MODE] Testing API execution only")
|
|
202
|
+
else:
|
|
203
|
+
print("\n[MODE] Testing both NATIVE and API execution")
|
|
204
|
+
|
|
205
|
+
self.setup()
|
|
206
|
+
|
|
207
|
+
# ========================================================================
|
|
208
|
+
# 1. CREATE NODE Tests
|
|
209
|
+
# ========================================================================
|
|
210
|
+
print("\n" + "=" * 80)
|
|
211
|
+
print("1. CREATE NODE Tests")
|
|
212
|
+
print("=" * 80)
|
|
213
|
+
|
|
214
|
+
# Basic CREATE NODE
|
|
215
|
+
result1, _ = self.test_both(
|
|
216
|
+
"CREATE_NODE_BASIC",
|
|
217
|
+
'CREATE NODE Person {name: "Alice", age: 30, city: "NYC"}'
|
|
218
|
+
)
|
|
219
|
+
if result1 and result1.get('uuid'):
|
|
220
|
+
self.created_node_uuids.append(result1['uuid'])
|
|
221
|
+
|
|
222
|
+
# CREATE NODE with alias
|
|
223
|
+
result2, _ = self.test_both(
|
|
224
|
+
"CREATE_NODE_WITH_ALIAS",
|
|
225
|
+
'CREATE NODE Company AS corp {name: "TechCorp", industry: "Tech"}'
|
|
226
|
+
)
|
|
227
|
+
if result2 and result2.get('uuid'):
|
|
228
|
+
self.created_node_uuids.append(result2['uuid'])
|
|
229
|
+
|
|
230
|
+
# CREATE NODE with complex properties
|
|
231
|
+
result3, _ = self.test_both(
|
|
232
|
+
"CREATE_NODE_COMPLEX",
|
|
233
|
+
'CREATE NODE Product {name: "Widget", price: 99.99, in_stock: true, tags: ["electronics", "gadget"]}'
|
|
234
|
+
)
|
|
235
|
+
if result3 and result3.get('uuid'):
|
|
236
|
+
self.created_node_uuids.append(result3['uuid'])
|
|
237
|
+
|
|
238
|
+
# ========================================================================
|
|
239
|
+
# 2. CREATE EDGE Tests
|
|
240
|
+
# ========================================================================
|
|
241
|
+
print("\n" + "=" * 80)
|
|
242
|
+
print("2. CREATE EDGE Tests")
|
|
243
|
+
print("=" * 80)
|
|
244
|
+
|
|
245
|
+
# CREATE EDGE with SRC/DEST
|
|
246
|
+
result4, _ = self.test_both(
|
|
247
|
+
"CREATE_EDGE_SRC_DEST",
|
|
248
|
+
"CREATE EDGE WORKS_AT SRC Person DEST Company"
|
|
249
|
+
)
|
|
250
|
+
if result4 and result4.get('uuid'):
|
|
251
|
+
self.created_edge_uuids.append(result4['uuid'])
|
|
252
|
+
|
|
253
|
+
# CREATE EDGE with properties
|
|
254
|
+
result5, _ = self.test_both(
|
|
255
|
+
"CREATE_EDGE_WITH_PROPERTIES",
|
|
256
|
+
'CREATE EDGE OWNS SRC Person DEST Product {since: "2024-01-01", quantity: 2}'
|
|
257
|
+
)
|
|
258
|
+
if result5 and result5.get('uuid'):
|
|
259
|
+
self.created_edge_uuids.append(result5['uuid'])
|
|
260
|
+
|
|
261
|
+
# ========================================================================
|
|
262
|
+
# 3. SELECT Tests
|
|
263
|
+
# ========================================================================
|
|
264
|
+
print("\n" + "=" * 80)
|
|
265
|
+
print("3. SELECT Tests")
|
|
266
|
+
print("=" * 80)
|
|
267
|
+
|
|
268
|
+
# SELECT all nodes
|
|
269
|
+
self.test_both(
|
|
270
|
+
"SELECT_ALL",
|
|
271
|
+
"SELECT * FROM Person"
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
# SELECT with WHERE
|
|
275
|
+
self.test_both(
|
|
276
|
+
"SELECT_WHERE",
|
|
277
|
+
'SELECT * FROM Person WHERE age > 25'
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
# SELECT with LIMIT
|
|
281
|
+
self.test_both(
|
|
282
|
+
"SELECT_LIMIT",
|
|
283
|
+
"SELECT * FROM Person LIMIT 10"
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
# SELECT COUNT
|
|
287
|
+
self.test_both(
|
|
288
|
+
"SELECT_COUNT",
|
|
289
|
+
"SELECT COUNT(*) FROM Person"
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
# SELECT specific properties
|
|
293
|
+
self.test_both(
|
|
294
|
+
"SELECT_PROPERTIES",
|
|
295
|
+
"SELECT name, age FROM Person"
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
# ========================================================================
|
|
299
|
+
# 4. UPDATE NODE Tests
|
|
300
|
+
# ========================================================================
|
|
301
|
+
print("\n" + "=" * 80)
|
|
302
|
+
print("4. UPDATE NODE Tests")
|
|
303
|
+
print("=" * 80)
|
|
304
|
+
|
|
305
|
+
# UPDATE NODE
|
|
306
|
+
self.test_both(
|
|
307
|
+
"UPDATE_NODE",
|
|
308
|
+
'UPDATE NODE Person SET {age: 31, city: "Boston"} WHERE name = "Alice"'
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
# UPDATE NODE with multiple properties
|
|
312
|
+
self.test_both(
|
|
313
|
+
"UPDATE_NODE_MULTIPLE",
|
|
314
|
+
'UPDATE NODE Product SET {price: 89.99, in_stock: false} WHERE name = "Widget"'
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
# ========================================================================
|
|
318
|
+
# 5. UPDATE EDGE Tests
|
|
319
|
+
# ========================================================================
|
|
320
|
+
print("\n" + "=" * 80)
|
|
321
|
+
print("5. UPDATE EDGE Tests")
|
|
322
|
+
print("=" * 80)
|
|
323
|
+
|
|
324
|
+
# UPDATE EDGE
|
|
325
|
+
self.test_both(
|
|
326
|
+
"UPDATE_EDGE",
|
|
327
|
+
'UPDATE EDGE WORKS_AT SET {role: "Senior Engineer", since: "2023-01-01"}'
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
# ========================================================================
|
|
331
|
+
# 6. DELETE Tests
|
|
332
|
+
# ========================================================================
|
|
333
|
+
print("\n" + "=" * 80)
|
|
334
|
+
print("6. DELETE Tests")
|
|
335
|
+
print("=" * 80)
|
|
336
|
+
|
|
337
|
+
# DELETE NODE
|
|
338
|
+
self.test_both(
|
|
339
|
+
"DELETE_NODE",
|
|
340
|
+
'DELETE NODE Product WHERE name = "Widget"'
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
# DELETE EDGE
|
|
344
|
+
self.test_both(
|
|
345
|
+
"DELETE_EDGE",
|
|
346
|
+
"DELETE EDGE OWNS"
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
# ========================================================================
|
|
350
|
+
# 7. MATCH Tests
|
|
351
|
+
# ========================================================================
|
|
352
|
+
print("\n" + "=" * 80)
|
|
353
|
+
print("7. MATCH Tests")
|
|
354
|
+
print("=" * 80)
|
|
355
|
+
|
|
356
|
+
# MATCH NODE
|
|
357
|
+
self.test_both(
|
|
358
|
+
"MATCH_NODE",
|
|
359
|
+
'MATCH NODE Person WHERE name = "Alice"'
|
|
360
|
+
)
|
|
361
|
+
|
|
362
|
+
# MATCH pattern
|
|
363
|
+
self.test_both(
|
|
364
|
+
"MATCH_PATTERN",
|
|
365
|
+
"MATCH (Person)-[WORKS_AT]->(Company)"
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
# ========================================================================
|
|
369
|
+
# 8. TRAVERSE Tests
|
|
370
|
+
# ========================================================================
|
|
371
|
+
print("\n" + "=" * 80)
|
|
372
|
+
print("8. TRAVERSE Tests")
|
|
373
|
+
print("=" * 80)
|
|
374
|
+
|
|
375
|
+
# TRAVERSE FROM
|
|
376
|
+
self.test_both(
|
|
377
|
+
"TRAVERSE_FROM",
|
|
378
|
+
"TRAVERSE FROM Person TO Company VIA WORKS_AT"
|
|
379
|
+
)
|
|
380
|
+
|
|
381
|
+
# TRAVERSE with DEPTH
|
|
382
|
+
self.test_both(
|
|
383
|
+
"TRAVERSE_DEPTH",
|
|
384
|
+
"TRAVERSE FROM Person DEPTH 2"
|
|
385
|
+
)
|
|
386
|
+
|
|
387
|
+
# ========================================================================
|
|
388
|
+
# 9. Namespace Operations
|
|
389
|
+
# ========================================================================
|
|
390
|
+
print("\n" + "=" * 80)
|
|
391
|
+
print("9. Namespace Operations")
|
|
392
|
+
print("=" * 80)
|
|
393
|
+
|
|
394
|
+
# SHOW NAMESPACES
|
|
395
|
+
self.test_both(
|
|
396
|
+
"SHOW_NAMESPACES",
|
|
397
|
+
"SHOW NAMESPACES"
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
# SHOW GRAPHS
|
|
401
|
+
self.test_both(
|
|
402
|
+
"SHOW_GRAPHS",
|
|
403
|
+
"SHOW GRAPHS"
|
|
404
|
+
)
|
|
405
|
+
|
|
406
|
+
# ========================================================================
|
|
407
|
+
# 10. Advanced SELECT Tests
|
|
408
|
+
# ========================================================================
|
|
409
|
+
print("\n" + "=" * 80)
|
|
410
|
+
print("10. Advanced SELECT Tests")
|
|
411
|
+
print("=" * 80)
|
|
412
|
+
|
|
413
|
+
# SELECT with ORDER BY
|
|
414
|
+
self.test_both(
|
|
415
|
+
"SELECT_ORDER_BY",
|
|
416
|
+
"SELECT * FROM Person ORDER BY age DESC"
|
|
417
|
+
)
|
|
418
|
+
|
|
419
|
+
# SELECT with GROUP BY
|
|
420
|
+
self.test_both(
|
|
421
|
+
"SELECT_GROUP_BY",
|
|
422
|
+
"SELECT city, COUNT(*) FROM Person GROUP BY city"
|
|
423
|
+
)
|
|
424
|
+
|
|
425
|
+
# SELECT with aggregation functions
|
|
426
|
+
self.test_both(
|
|
427
|
+
"SELECT_AVG",
|
|
428
|
+
"SELECT AVG(age) FROM Person"
|
|
429
|
+
)
|
|
430
|
+
|
|
431
|
+
self.test_both(
|
|
432
|
+
"SELECT_SUM",
|
|
433
|
+
"SELECT SUM(age) FROM Person"
|
|
434
|
+
)
|
|
435
|
+
|
|
436
|
+
self.test_both(
|
|
437
|
+
"SELECT_MIN_MAX",
|
|
438
|
+
"SELECT MIN(age), MAX(age) FROM Person"
|
|
439
|
+
)
|
|
440
|
+
|
|
441
|
+
# ========================================================================
|
|
442
|
+
# 11. Variable Declarations
|
|
443
|
+
# ========================================================================
|
|
444
|
+
print("\n" + "=" * 80)
|
|
445
|
+
print("11. Variable Declarations")
|
|
446
|
+
print("=" * 80)
|
|
447
|
+
|
|
448
|
+
# LET variable
|
|
449
|
+
self.test_both(
|
|
450
|
+
"LET_VARIABLE",
|
|
451
|
+
'LET $author = "Alice"'
|
|
452
|
+
)
|
|
453
|
+
|
|
454
|
+
# Use variable in query
|
|
455
|
+
self.test_both(
|
|
456
|
+
"SELECT_WITH_VARIABLE",
|
|
457
|
+
'LET $min_age = 25; SELECT * FROM Person WHERE age > $min_age'
|
|
458
|
+
)
|
|
459
|
+
|
|
460
|
+
# ========================================================================
|
|
461
|
+
# 12. MERGE Operations
|
|
462
|
+
# ========================================================================
|
|
463
|
+
print("\n" + "=" * 80)
|
|
464
|
+
print("12. MERGE Operations")
|
|
465
|
+
print("=" * 80)
|
|
466
|
+
|
|
467
|
+
# MERGE NODE
|
|
468
|
+
self.test_both(
|
|
469
|
+
"MERGE_NODE",
|
|
470
|
+
'MERGE NODE Person {name: "Alice"} SET {age: 30, city: "NYC"}'
|
|
471
|
+
)
|
|
472
|
+
|
|
473
|
+
# ========================================================================
|
|
474
|
+
# 13. Search Queries
|
|
475
|
+
# ========================================================================
|
|
476
|
+
print("\n" + "=" * 80)
|
|
477
|
+
print("13. Search Queries")
|
|
478
|
+
print("=" * 80)
|
|
479
|
+
|
|
480
|
+
# DENSE SEARCH
|
|
481
|
+
self.test_both(
|
|
482
|
+
"DENSE_SEARCH",
|
|
483
|
+
'DENSE SEARCH "Alice" IN Person LIMIT 5',
|
|
484
|
+
expected_success=False # May fail if no embeddings
|
|
485
|
+
)
|
|
486
|
+
|
|
487
|
+
# SPARSE SEARCH
|
|
488
|
+
self.test_both(
|
|
489
|
+
"SPARSE_SEARCH",
|
|
490
|
+
'SPARSE SEARCH "Alice" IN Person LIMIT 5',
|
|
491
|
+
expected_success=False # May fail if no index
|
|
492
|
+
)
|
|
493
|
+
|
|
494
|
+
# HYBRID SEARCH
|
|
495
|
+
self.test_both(
|
|
496
|
+
"HYBRID_SEARCH",
|
|
497
|
+
'HYBRID SEARCH "Alice" IN Person LIMIT 5',
|
|
498
|
+
expected_success=False # May fail if no embeddings/index
|
|
499
|
+
)
|
|
500
|
+
|
|
501
|
+
# SEMANTIC SEARCH
|
|
502
|
+
self.test_both(
|
|
503
|
+
"SEMANTIC_SEARCH",
|
|
504
|
+
'SEMANTIC SEARCH "Alice" IN Person LIMIT 5',
|
|
505
|
+
expected_success=False # May fail if no embeddings
|
|
506
|
+
)
|
|
507
|
+
|
|
508
|
+
# GRAPH SEARCH
|
|
509
|
+
self.test_both(
|
|
510
|
+
"GRAPH_SEARCH",
|
|
511
|
+
'GRAPH SEARCH "Alice" VIA (WORKS_AT) DEPTH 2',
|
|
512
|
+
expected_success=False # May fail if no graph structure
|
|
513
|
+
)
|
|
514
|
+
|
|
515
|
+
# ========================================================================
|
|
516
|
+
# 14. RAG Queries
|
|
517
|
+
# ========================================================================
|
|
518
|
+
print("\n" + "=" * 80)
|
|
519
|
+
print("14. RAG Queries")
|
|
520
|
+
print("=" * 80)
|
|
521
|
+
|
|
522
|
+
# Simple RAG query
|
|
523
|
+
self.test_both(
|
|
524
|
+
"RAG_QUERY_SIMPLE",
|
|
525
|
+
f'RAG "What is Alice?" AT NAMESPACE {self.namespace}',
|
|
526
|
+
expected_success=False # May fail if no RAG setup
|
|
527
|
+
)
|
|
528
|
+
|
|
529
|
+
# RAG GENERATE
|
|
530
|
+
self.test_both(
|
|
531
|
+
"RAG_GENERATE",
|
|
532
|
+
'LET $query = "What is Alice?"; RAG GENERATE $query',
|
|
533
|
+
expected_success=False # May fail if no RAG setup
|
|
534
|
+
)
|
|
535
|
+
|
|
536
|
+
# ========================================================================
|
|
537
|
+
# 15. Analytics Queries
|
|
538
|
+
# ========================================================================
|
|
539
|
+
print("\n" + "=" * 80)
|
|
540
|
+
print("15. Analytics Queries")
|
|
541
|
+
print("=" * 80)
|
|
542
|
+
|
|
543
|
+
# PAGERANK
|
|
544
|
+
self.test_both(
|
|
545
|
+
"PAGERANK",
|
|
546
|
+
"PAGERANK ON Person ITERATIONS 10",
|
|
547
|
+
expected_success=False # May fail if no edges
|
|
548
|
+
)
|
|
549
|
+
|
|
550
|
+
# SHORTEST_PATH
|
|
551
|
+
self.test_both(
|
|
552
|
+
"SHORTEST_PATH",
|
|
553
|
+
'SHORTEST_PATH FROM "Alice" TO "TechCorp"',
|
|
554
|
+
expected_success=False # May fail if nodes don't exist
|
|
555
|
+
)
|
|
556
|
+
|
|
557
|
+
# COMMUNITY_DETECTION
|
|
558
|
+
self.test_both(
|
|
559
|
+
"COMMUNITY_DETECTION",
|
|
560
|
+
"COMMUNITY_DETECTION ON Person",
|
|
561
|
+
expected_success=False # May fail if no graph structure
|
|
562
|
+
)
|
|
563
|
+
|
|
564
|
+
# GRAPH SUMMARY
|
|
565
|
+
self.test_both(
|
|
566
|
+
"GRAPH_SUMMARY",
|
|
567
|
+
"GRAPH SUMMARY ON Person",
|
|
568
|
+
expected_success=False # May fail if no nodes
|
|
569
|
+
)
|
|
570
|
+
|
|
571
|
+
# HOP query
|
|
572
|
+
self.test_both(
|
|
573
|
+
"HOP_QUERY",
|
|
574
|
+
'HOP FROM Person TO Company DEPTH 1',
|
|
575
|
+
expected_success=False # May fail if no edges
|
|
576
|
+
)
|
|
577
|
+
|
|
578
|
+
# ========================================================================
|
|
579
|
+
# 16. NEIGHBORS Queries
|
|
580
|
+
# ========================================================================
|
|
581
|
+
print("\n" + "=" * 80)
|
|
582
|
+
print("16. NEIGHBORS Queries")
|
|
583
|
+
print("=" * 80)
|
|
584
|
+
|
|
585
|
+
# NEIGHBORS FROM
|
|
586
|
+
self.test_both(
|
|
587
|
+
"NEIGHBORS_FROM",
|
|
588
|
+
'NEIGHBORS FROM Person WHERE name = "Alice" DEPTH 1',
|
|
589
|
+
expected_success=False # May fail if no edges
|
|
590
|
+
)
|
|
591
|
+
|
|
592
|
+
# ========================================================================
|
|
593
|
+
# 17. Collection Operations
|
|
594
|
+
# ========================================================================
|
|
595
|
+
print("\n" + "=" * 80)
|
|
596
|
+
print("17. Collection Operations")
|
|
597
|
+
print("=" * 80)
|
|
598
|
+
|
|
599
|
+
# CREATE COLLECTION
|
|
600
|
+
self.test_both(
|
|
601
|
+
"CREATE_COLLECTION",
|
|
602
|
+
'CREATE COLLECTION test_collection {fields: [{name: "string"}, {age: "int"}]}',
|
|
603
|
+
expected_success=False # May not be implemented
|
|
604
|
+
)
|
|
605
|
+
|
|
606
|
+
# SHOW COLLECTIONS
|
|
607
|
+
self.test_both(
|
|
608
|
+
"SHOW_COLLECTIONS",
|
|
609
|
+
"SHOW COLLECTIONS"
|
|
610
|
+
)
|
|
611
|
+
|
|
612
|
+
# ========================================================================
|
|
613
|
+
# 18. Index Operations
|
|
614
|
+
# ========================================================================
|
|
615
|
+
print("\n" + "=" * 80)
|
|
616
|
+
print("18. Index Operations")
|
|
617
|
+
print("=" * 80)
|
|
618
|
+
|
|
619
|
+
# CREATE INDEX
|
|
620
|
+
self.test_both(
|
|
621
|
+
"CREATE_INDEX",
|
|
622
|
+
"CREATE INDEX test_index ON Person (name) TYPE DENSE",
|
|
623
|
+
expected_success=False # May fail if not implemented
|
|
624
|
+
)
|
|
625
|
+
|
|
626
|
+
# SHOW INDEXES
|
|
627
|
+
self.test_both(
|
|
628
|
+
"SHOW_INDEXES",
|
|
629
|
+
"SHOW INDEXES"
|
|
630
|
+
)
|
|
631
|
+
|
|
632
|
+
# ========================================================================
|
|
633
|
+
# 19. Statistics and Metadata
|
|
634
|
+
# ========================================================================
|
|
635
|
+
print("\n" + "=" * 80)
|
|
636
|
+
print("19. Statistics and Metadata")
|
|
637
|
+
print("=" * 80)
|
|
638
|
+
|
|
639
|
+
# SHOW STATS
|
|
640
|
+
self.test_both(
|
|
641
|
+
"SHOW_STATS",
|
|
642
|
+
"SHOW STATS"
|
|
643
|
+
)
|
|
644
|
+
|
|
645
|
+
# SHOW CURRENT GRAPH
|
|
646
|
+
self.test_both(
|
|
647
|
+
"SHOW_CURRENT_GRAPH",
|
|
648
|
+
"SHOW CURRENT GRAPH"
|
|
649
|
+
)
|
|
650
|
+
|
|
651
|
+
# DESCRIBE NODE
|
|
652
|
+
self.test_both(
|
|
653
|
+
"DESCRIBE_NODE",
|
|
654
|
+
"DESCRIBE NODE Person"
|
|
655
|
+
)
|
|
656
|
+
|
|
657
|
+
# ========================================================================
|
|
658
|
+
# 20. Pipeline Operations
|
|
659
|
+
# ========================================================================
|
|
660
|
+
print("\n" + "=" * 80)
|
|
661
|
+
print("20. Pipeline Operations")
|
|
662
|
+
print("=" * 80)
|
|
663
|
+
|
|
664
|
+
# SHOW PIPELINES
|
|
665
|
+
self.test_both(
|
|
666
|
+
"SHOW_PIPELINES",
|
|
667
|
+
"SHOW PIPELINES"
|
|
668
|
+
)
|
|
669
|
+
|
|
670
|
+
# ========================================================================
|
|
671
|
+
# 21. Advanced Traversal
|
|
672
|
+
# ========================================================================
|
|
673
|
+
print("\n" + "=" * 80)
|
|
674
|
+
print("21. Advanced Traversal")
|
|
675
|
+
print("=" * 80)
|
|
676
|
+
|
|
677
|
+
# TRAVERSE with VIA
|
|
678
|
+
self.test_both(
|
|
679
|
+
"TRAVERSE_VIA",
|
|
680
|
+
"TRAVERSE FROM Person VIA (WORKS_AT) TO Company"
|
|
681
|
+
)
|
|
682
|
+
|
|
683
|
+
# TRAVERSE with MAX DEPTH
|
|
684
|
+
self.test_both(
|
|
685
|
+
"TRAVERSE_MAX_DEPTH",
|
|
686
|
+
"TRAVERSE FROM Person MAX DEPTH 3"
|
|
687
|
+
)
|
|
688
|
+
|
|
689
|
+
# TRAVERSE with WHERE
|
|
690
|
+
self.test_both(
|
|
691
|
+
"TRAVERSE_WHERE",
|
|
692
|
+
'TRAVERSE FROM Person WHERE name = "Alice" MAX DEPTH 2'
|
|
693
|
+
)
|
|
694
|
+
|
|
695
|
+
# ========================================================================
|
|
696
|
+
# 22. Advanced MATCH Patterns
|
|
697
|
+
# ========================================================================
|
|
698
|
+
print("\n" + "=" * 80)
|
|
699
|
+
print("22. Advanced MATCH Patterns")
|
|
700
|
+
print("=" * 80)
|
|
701
|
+
|
|
702
|
+
# MATCH with RETURN
|
|
703
|
+
self.test_both(
|
|
704
|
+
"MATCH_RETURN",
|
|
705
|
+
"MATCH (Person)-[WORKS_AT]->(Company) RETURN Person.name, Company.name"
|
|
706
|
+
)
|
|
707
|
+
|
|
708
|
+
# MATCH with WHERE
|
|
709
|
+
self.test_both(
|
|
710
|
+
"MATCH_WHERE",
|
|
711
|
+
'MATCH (Person)-[WORKS_AT]->(Company) WHERE Person.name = "Alice"'
|
|
712
|
+
)
|
|
713
|
+
|
|
714
|
+
# ========================================================================
|
|
715
|
+
# 23. Aggregation Queries
|
|
716
|
+
# ========================================================================
|
|
717
|
+
print("\n" + "=" * 80)
|
|
718
|
+
print("23. Aggregation Queries")
|
|
719
|
+
print("=" * 80)
|
|
720
|
+
|
|
721
|
+
# AGGREGATE query
|
|
722
|
+
self.test_both(
|
|
723
|
+
"AGGREGATE_COUNT",
|
|
724
|
+
"AGGREGATE COUNT(*) FROM Person"
|
|
725
|
+
)
|
|
726
|
+
|
|
727
|
+
# ========================================================================
|
|
728
|
+
# 24. CREATE GRAPH Operations
|
|
729
|
+
# ========================================================================
|
|
730
|
+
print("\n" + "=" * 80)
|
|
731
|
+
print("24. CREATE GRAPH Operations")
|
|
732
|
+
print("=" * 80)
|
|
733
|
+
|
|
734
|
+
# CREATE GRAPH
|
|
735
|
+
self.test_both(
|
|
736
|
+
"CREATE_GRAPH",
|
|
737
|
+
"CREATE GRAPH test_graph"
|
|
738
|
+
)
|
|
739
|
+
|
|
740
|
+
# USE GRAPH
|
|
741
|
+
self.test_both(
|
|
742
|
+
"USE_GRAPH",
|
|
743
|
+
"USE GRAPH test_graph"
|
|
744
|
+
)
|
|
745
|
+
|
|
746
|
+
# ========================================================================
|
|
747
|
+
# 25. Transaction Operations
|
|
748
|
+
# ========================================================================
|
|
749
|
+
print("\n" + "=" * 80)
|
|
750
|
+
print("25. Transaction Operations")
|
|
751
|
+
print("=" * 80)
|
|
752
|
+
|
|
753
|
+
# BEGIN TRANSACTION
|
|
754
|
+
self.test_both(
|
|
755
|
+
"BEGIN_TRANSACTION",
|
|
756
|
+
"BEGIN TRANSACTION",
|
|
757
|
+
expected_success=False # May not be implemented
|
|
758
|
+
)
|
|
759
|
+
|
|
760
|
+
# COMMIT TRANSACTION
|
|
761
|
+
self.test_both(
|
|
762
|
+
"COMMIT_TRANSACTION",
|
|
763
|
+
"COMMIT TRANSACTION",
|
|
764
|
+
expected_success=False # May not be implemented
|
|
765
|
+
)
|
|
766
|
+
|
|
767
|
+
# ========================================================================
|
|
768
|
+
# 26. Verification: Check UUIDs in results
|
|
769
|
+
# ========================================================================
|
|
770
|
+
print("\n" + "=" * 80)
|
|
771
|
+
print("26. UUID Verification")
|
|
772
|
+
print("=" * 80)
|
|
773
|
+
|
|
774
|
+
# Verify CREATE NODE returns UUID
|
|
775
|
+
if result1:
|
|
776
|
+
has_uuid = 'uuid' in result1
|
|
777
|
+
no_node_id = 'node_id' not in result1
|
|
778
|
+
self.results['native']['UUID_RETURNED'] = has_uuid and no_node_id
|
|
779
|
+
print(f" [{'PASS' if has_uuid and no_node_id else 'FAIL'}] CREATE NODE returns UUID (no node_id)")
|
|
780
|
+
|
|
781
|
+
# Verify CREATE EDGE returns UUID
|
|
782
|
+
if result4:
|
|
783
|
+
has_uuid = 'uuid' in result4
|
|
784
|
+
no_edge_id = 'edge_id' not in result4
|
|
785
|
+
self.results['native']['EDGE_UUID_RETURNED'] = has_uuid and no_edge_id
|
|
786
|
+
print(f" [{'PASS' if has_uuid and no_edge_id else 'FAIL'}] CREATE EDGE returns UUID (no edge_id)")
|
|
787
|
+
|
|
788
|
+
# Verify nodes can be found by UUID
|
|
789
|
+
if self.created_node_uuids:
|
|
790
|
+
all_nodes = self.graph.get_all_nodes()
|
|
791
|
+
found_by_uuid = False
|
|
792
|
+
for node in all_nodes:
|
|
793
|
+
if node.properties.get('uuid') == self.created_node_uuids[0]:
|
|
794
|
+
found_by_uuid = True
|
|
795
|
+
break
|
|
796
|
+
self.results['native']['FIND_BY_UUID'] = found_by_uuid
|
|
797
|
+
print(f" [{'PASS' if found_by_uuid else 'FAIL'}] Can find node by UUID from properties")
|
|
798
|
+
|
|
799
|
+
# ========================================================================
|
|
800
|
+
# Print Summary
|
|
801
|
+
# ========================================================================
|
|
802
|
+
self.print_summary()
|
|
803
|
+
|
|
804
|
+
def print_summary(self):
|
|
805
|
+
"""Print test summary."""
|
|
806
|
+
print("\n" + "=" * 80)
|
|
807
|
+
print("TEST SUMMARY")
|
|
808
|
+
print("=" * 80)
|
|
809
|
+
|
|
810
|
+
# Native results
|
|
811
|
+
native_passed = sum(1 for v in self.results['native'].values() if v is True)
|
|
812
|
+
native_failed = sum(1 for v in self.results['native'].values() if v is False)
|
|
813
|
+
native_total = len([v for v in self.results['native'].values() if v is not None])
|
|
814
|
+
native_skipped = sum(1 for v in self.results['native'].values() if v is None)
|
|
815
|
+
|
|
816
|
+
print(f"\nNative Execution:")
|
|
817
|
+
print(f" Passed: {native_passed}/{native_total}")
|
|
818
|
+
print(f" Failed: {native_failed}/{native_total}")
|
|
819
|
+
if native_skipped > 0:
|
|
820
|
+
print(f" Skipped: {native_skipped}")
|
|
821
|
+
print(f" Success Rate: {(native_passed*100//native_total) if native_total > 0 else 0}%")
|
|
822
|
+
|
|
823
|
+
# API results
|
|
824
|
+
api_passed = sum(1 for v in self.results['api'].values() if v is True)
|
|
825
|
+
api_failed = sum(1 for v in self.results['api'].values() if v is False)
|
|
826
|
+
api_total = len([v for v in self.results['api'].values() if v is not None])
|
|
827
|
+
api_skipped = sum(1 for v in self.results['api'].values() if v is None)
|
|
828
|
+
|
|
829
|
+
print(f"\nAPI Execution:")
|
|
830
|
+
print(f" Passed: {api_passed}/{api_total}")
|
|
831
|
+
print(f" Failed: {api_failed}/{api_total}")
|
|
832
|
+
if api_skipped > 0:
|
|
833
|
+
print(f" Skipped: {api_skipped} (API server not running)")
|
|
834
|
+
print(f" Note: Start API server with: python -m contextsynapse.api.server")
|
|
835
|
+
if api_total > 0:
|
|
836
|
+
print(f" Success Rate: {(api_passed*100//api_total)}%")
|
|
837
|
+
|
|
838
|
+
# Group results by category
|
|
839
|
+
categories = {
|
|
840
|
+
'CREATE': ['CREATE_NODE', 'CREATE_EDGE', 'CREATE_GRAPH', 'CREATE_COLLECTION', 'CREATE_INDEX'],
|
|
841
|
+
'SELECT': ['SELECT', 'SELECT_COUNT', 'SELECT_WHERE', 'SELECT_ORDER_BY', 'SELECT_GROUP_BY'],
|
|
842
|
+
'UPDATE': ['UPDATE_NODE', 'UPDATE_EDGE'],
|
|
843
|
+
'DELETE': ['DELETE_NODE', 'DELETE_EDGE'],
|
|
844
|
+
'MATCH': ['MATCH_NODE', 'MATCH_PATTERN', 'MATCH_RETURN', 'MATCH_WHERE'],
|
|
845
|
+
'TRAVERSE': ['TRAVERSE', 'TRAVERSE_FROM', 'TRAVERSE_DEPTH', 'TRAVERSE_VIA'],
|
|
846
|
+
'SEARCH': ['DENSE_SEARCH', 'SPARSE_SEARCH', 'HYBRID_SEARCH', 'SEMANTIC_SEARCH', 'GRAPH_SEARCH'],
|
|
847
|
+
'RAG': ['RAG_QUERY', 'RAG_GENERATE'],
|
|
848
|
+
'ANALYTICS': ['PAGERANK', 'SHORTEST_PATH', 'COMMUNITY_DETECTION', 'GRAPH_SUMMARY', 'HOP_QUERY'],
|
|
849
|
+
'NAMESPACE': ['SHOW_NAMESPACES', 'SHOW_GRAPHS', 'SHOW_COLLECTIONS', 'SHOW_PIPELINES'],
|
|
850
|
+
'OTHER': ['MERGE_NODE', 'LET_VARIABLE', 'NEIGHBORS', 'AGGREGATE']
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
print(f"\n" + "=" * 80)
|
|
854
|
+
print("QUERY TYPE COVERAGE")
|
|
855
|
+
print("=" * 80)
|
|
856
|
+
|
|
857
|
+
for category, patterns in categories.items():
|
|
858
|
+
category_tests = [k for k in self.results['native'].keys()
|
|
859
|
+
if any(p in k for p in patterns)]
|
|
860
|
+
if category_tests:
|
|
861
|
+
passed = sum(1 for k in category_tests if self.results['native'].get(k) is True)
|
|
862
|
+
total = len([k for k in category_tests if self.results['native'].get(k) is not None])
|
|
863
|
+
print(f"\n{category}: {passed}/{total} passed")
|
|
864
|
+
|
|
865
|
+
# Detailed results
|
|
866
|
+
print(f"\n" + "=" * 80)
|
|
867
|
+
print("DETAILED RESULTS")
|
|
868
|
+
print("=" * 80)
|
|
869
|
+
print(f"\nNative:")
|
|
870
|
+
for test_name, result in sorted(self.results['native'].items()):
|
|
871
|
+
status = "[PASS]" if result is True else "[FAIL]" if result is False else "[SKIP]"
|
|
872
|
+
print(f" {status} {test_name}")
|
|
873
|
+
|
|
874
|
+
if api_total > 0:
|
|
875
|
+
print(f"\nAPI:")
|
|
876
|
+
for test_name, result in sorted(self.results['api'].items()):
|
|
877
|
+
status = "[PASS]" if result is True else "[FAIL]" if result is False else "[SKIP]"
|
|
878
|
+
print(f" {status} {test_name}")
|
|
879
|
+
|
|
880
|
+
print("\n" + "=" * 80)
|
|
881
|
+
print("QUERY TYPES TESTED")
|
|
882
|
+
print("=" * 80)
|
|
883
|
+
print("""
|
|
884
|
+
1. CREATE Operations: NODE, EDGE, GRAPH, COLLECTION, INDEX
|
|
885
|
+
2. SELECT Queries: Basic, WHERE, LIMIT, COUNT, ORDER BY, GROUP BY, Aggregations
|
|
886
|
+
3. UPDATE Operations: NODE, EDGE
|
|
887
|
+
4. DELETE Operations: NODE, EDGE
|
|
888
|
+
5. MATCH Queries: NODE, Pattern matching, RETURN, WHERE
|
|
889
|
+
6. TRAVERSE Queries: FROM, VIA, DEPTH, MAX DEPTH, WHERE
|
|
890
|
+
7. Search Queries: DENSE, SPARSE, HYBRID, SEMANTIC, GRAPH
|
|
891
|
+
8. RAG Queries: Simple RAG, RAG GENERATE
|
|
892
|
+
9. Analytics: PAGERANK, SHORTEST_PATH, COMMUNITY_DETECTION, GRAPH SUMMARY, HOP
|
|
893
|
+
10. Variable Declarations: LET
|
|
894
|
+
11. MERGE Operations: MERGE NODE
|
|
895
|
+
12. NEIGHBORS Queries
|
|
896
|
+
13. Namespace Operations: SHOW NAMESPACES, GRAPHS, COLLECTIONS, PIPELINES
|
|
897
|
+
14. Statistics: SHOW STATS, DESCRIBE
|
|
898
|
+
15. Transaction Operations: BEGIN, COMMIT
|
|
899
|
+
16. Aggregation: COUNT, SUM, AVG, MIN, MAX
|
|
900
|
+
""")
|
|
901
|
+
|
|
902
|
+
print("=" * 80)
|
|
903
|
+
|
|
904
|
+
# Overall success
|
|
905
|
+
overall_success = native_passed == native_total
|
|
906
|
+
if api_total > 0:
|
|
907
|
+
overall_success = overall_success and (api_passed == api_total)
|
|
908
|
+
|
|
909
|
+
return overall_success
|
|
910
|
+
|
|
911
|
+
|
|
912
|
+
def main():
|
|
913
|
+
"""Run comprehensive AIQL query tests."""
|
|
914
|
+
parser = argparse.ArgumentParser(description='Test all AIQL queries (native and/or API)')
|
|
915
|
+
parser.add_argument('--native-only', action='store_true',
|
|
916
|
+
help='Test only native execution (skip API tests)')
|
|
917
|
+
parser.add_argument('--api-only', action='store_true',
|
|
918
|
+
help='Test only API execution (skip native tests)')
|
|
919
|
+
parser.add_argument('--api-url', default='http://localhost:8000',
|
|
920
|
+
help='API server URL (default: http://localhost:8000)')
|
|
921
|
+
parser.add_argument('--namespace', default='test_all_queries',
|
|
922
|
+
help='Test namespace (default: test_all_queries)')
|
|
923
|
+
|
|
924
|
+
args = parser.parse_args()
|
|
925
|
+
|
|
926
|
+
if args.native_only and args.api_only:
|
|
927
|
+
print("[ERROR] Cannot specify both --native-only and --api-only")
|
|
928
|
+
sys.exit(1)
|
|
929
|
+
|
|
930
|
+
tester = AIQLQueryTester(
|
|
931
|
+
namespace=args.namespace,
|
|
932
|
+
api_url=args.api_url,
|
|
933
|
+
test_native_only=args.native_only,
|
|
934
|
+
test_api_only=args.api_only
|
|
935
|
+
)
|
|
936
|
+
|
|
937
|
+
try:
|
|
938
|
+
success = tester.run_all_tests()
|
|
939
|
+
sys.exit(0 if success else 1)
|
|
940
|
+
except Exception as e:
|
|
941
|
+
print(f"\n[ERROR] Test suite failed with exception: {e}")
|
|
942
|
+
import traceback
|
|
943
|
+
traceback.print_exc()
|
|
944
|
+
sys.exit(1)
|
|
945
|
+
|
|
946
|
+
|
|
947
|
+
if __name__ == "__main__":
|
|
948
|
+
main()
|