Skip to content

Реализовать поиск по AST на SQL #4

Description

@alexeyklimov
  1. Find classes without equals/hashCode
WITH 
-- Step 1: Find classes with equals
classes_with_equals AS (
  SELECT DISTINCT m.class_id
  FROM java.methods m
  WHERE m.name = 'equals'
),

-- Step 2: Find classes with hashCode
classes_with_hashcode AS (
  SELECT DISTINCT m.class_id
  FROM java.methods m
  WHERE m.name = 'hashCode'
),

-- Step 3: Find classes without either
classes_missing_methods AS (
  SELECT 
    c.id,
    c.fully_qualified_name,
    c.file_path,
    ce.class_id AS has_equals,
    ch.class_id AS has_hashcode
  FROM java.classes c
  LEFT JOIN classes_with_equals ce ON ce.class_id = c.id
  LEFT JOIN classes_with_hashcode ch ON ch.class_id = c.id
)

SELECT fully_qualified_name, file_path
FROM classes_missing_methods
WHERE has_equals IS NULL OR has_hashcode IS NULL;
  1. Find deep call chains
WITH 
-- Step 1: Calculate path lengths between all method pairs
method_paths AS (
  SELECT 
    m1.id AS caller_id,
    m2.id AS callee_id,
    m1.signature AS caller_sig,
    m2.signature AS callee_sig,
    path_length(m1.id, m2.id, 'calls') AS depth
  FROM java.methods m1
  CROSS JOIN java.methods m2
  WHERE path_length(m1.id, m2.id, 'calls') >= 5
),

-- Step 2: Filter and rank
deep_chains AS (
  SELECT 
    caller_sig,
    callee_sig,
    depth
  FROM method_paths
  WHERE depth >= 5
)

SELECT 
  caller_sig AS start_method,
  callee_sig AS end_method,
  depth AS chain_length
FROM deep_chains
ORDER BY depth DESC
LIMIT 50;

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions