Какова семантика объявления метода?

На основе запроса, определенного в metric.xml, я пытаюсь выяснить, сколько методов объявляет класс:

MATCH
    (t:Type:File)-[:DECLARES]->(m:Method)
WHERE 
    t.fqn=~'.*MyException'
RETURN
    t.fqn as Type, COUNT(m) as MethodCount

It's 41.

Я меняю запрос на

MATCH
    (t:Class:File)-[:DECLARES]->(m:Method)
WHERE
    t.fqn=~'.*MyException'
RETURN
    t.fqn as Type, COUNT(m) as MethodCount

и я получаю 25 за тот же класс. Разве это не должно быть таким же результатом? Если я открою класс и посчитаю вручную, я найду только 23. Так что же это значит, если класс или тип «объявляют» метод? Похоже, что некоторые унаследованные методы также учитываются в зависимости от :Type или :Class. И как мне получить "реальное" количество методов, объявленных самим классом, без унаследованных методов?


person Jens Nerche    schedule 14.06.2016    source источник
comment
проверьте этот stackoverflow.com/questions/1857775/   -  person Aravind    schedule 14.06.2016


Ответы (3)


Основная причина заключается в том, что один и тот же тип исключения, скорее всего, доступен в виде нескольких узлов, поскольку он содержится в одном артефакте и требуется для других. Чтобы найти «настоящий» узел, используйте следующий запрос:

MATCH
  (:Artifact)-[:CONTAINS]->(t:Type)-[:DECLARES]->(m:Method)
WHERE
  t.fqn=~'.*MyException'
RETURN
  t.fqn as Type, COUNT(m) as MethodCount
person Dirk Mahler    schedule 14.06.2016
comment
Также с этим запросом я получаю два дополнительных метода: getCause() и initCause(Throwable) из Throwable. Оба метода были вызваны из MyException, но не объявлены в нем. Эти методы имеют только свойство подписи, так что теперь я могу правильно фильтровать, но, возможно, было бы неплохо сделать подсказку в документации для metric.xml. - person Jens Nerche; 15.06.2016
comment
Можете ли вы привести пример исключения, вызывающего эти методы? Я хотел бы взглянуть на сгенерированный байт-код. - person Dirk Mahler; 15.06.2016

Первый запрос находит узлы нескольких типов с одним и тем же fqn и агрегирует результат. Просто добавьте id(t) в предложение возврата, и вы должны его увидеть.

person Dirk Mahler    schedule 14.06.2016

В исходном посте было несколько связанных вопросов. Ответ, как найти только те методы, которые действительно объявлены в классе:

MATCH
  (:Artifact)-[:CONTAINS]->(t:Type)-[:DECLARES]->(m:Method)
WHERE
  t.fqn=~'.*MyException' AND m.name <> ''
RETURN
  t.fqn as Type, COUNT(m) as MethodCount
person Jens Nerche    schedule 15.06.2016