Skip to content

Commit 0e1e940

Browse files
authored
Merge pull request #79 from cedricziel/switch-goto-tablename-to-index
Introduce Tablename Index and use it
2 parents e96d4ca + 6665751 commit 0e1e940

File tree

3 files changed

+113
-61
lines changed

3 files changed

+113
-61
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package com.cedricziel.idea.typo3.index;
2+
3+
import com.cedricziel.idea.typo3.index.externalizer.ObjectStreamDataExternalizer;
4+
import com.intellij.openapi.fileEditor.impl.LoadTextUtil;
5+
import com.intellij.openapi.util.TextRange;
6+
import com.intellij.util.indexing.*;
7+
import com.intellij.util.io.DataExternalizer;
8+
import com.intellij.util.io.EnumeratorStringDescriptor;
9+
import com.intellij.util.io.KeyDescriptor;
10+
import gnu.trove.THashMap;
11+
import org.jetbrains.annotations.NotNull;
12+
13+
import java.util.Map;
14+
import java.util.regex.Matcher;
15+
import java.util.regex.Pattern;
16+
17+
public class TablenameFileIndex extends FileBasedIndexExtension <String, TextRange> {
18+
19+
public static ID<String, TextRange> KEY = ID.create("com.cedricziel.idea.typo3.index.tablename");
20+
21+
@NotNull
22+
@Override
23+
public ID<String, TextRange> getName() {
24+
return KEY;
25+
}
26+
27+
@NotNull
28+
@Override
29+
public DataIndexer<String, TextRange, FileContent> getIndexer() {
30+
return inputData -> {
31+
Map<String, TextRange> map = new THashMap<>();
32+
33+
CharSequence charSequence = LoadTextUtil.loadText(inputData.getFile());
34+
35+
final Matcher matcher = Pattern
36+
.compile("create\\s+table\\s+(if\\s+not\\s+exists\\s+)?([a-zA-Z_0-9]+)", Pattern.CASE_INSENSITIVE)
37+
.matcher(charSequence);
38+
39+
try {
40+
while (matcher.find()) {
41+
if (matcher.groupCount() < 2) {
42+
return map;
43+
}
44+
45+
map.put(matcher.group(2), new TextRange(matcher.start(), matcher.end()));
46+
}
47+
} catch (IllegalStateException e) {
48+
// no matches
49+
}
50+
51+
return map;
52+
};
53+
}
54+
55+
@NotNull
56+
@Override
57+
public KeyDescriptor<String> getKeyDescriptor() {
58+
return EnumeratorStringDescriptor.INSTANCE;
59+
}
60+
61+
@NotNull
62+
@Override
63+
public DataExternalizer<TextRange> getValueExternalizer() {
64+
return new ObjectStreamDataExternalizer<>();
65+
}
66+
67+
@Override
68+
public int getVersion() {
69+
return 0;
70+
}
71+
72+
@NotNull
73+
@Override
74+
public FileBasedIndex.InputFilter getInputFilter() {
75+
return file -> file.getName().equals("ext_tables.sql");
76+
}
77+
78+
@Override
79+
public boolean dependsOnFileContent() {
80+
return true;
81+
}
82+
}

src/main/java/com/cedricziel/idea/typo3/util/TableUtil.java

Lines changed: 30 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,100 +1,69 @@
11
package com.cedricziel.idea.typo3.util;
22

3+
import com.cedricziel.idea.typo3.index.TablenameFileIndex;
34
import com.intellij.codeInsight.completion.CompletionResultSet;
45
import com.intellij.codeInsight.lookup.LookupElement;
5-
import com.intellij.openapi.fileEditor.impl.LoadTextUtil;
66
import com.intellij.openapi.project.Project;
77
import com.intellij.psi.PsiElement;
88
import com.intellij.psi.PsiFile;
9+
import com.intellij.psi.PsiManager;
910
import com.intellij.psi.search.FilenameIndex;
1011
import com.intellij.psi.search.GlobalSearchScope;
12+
import com.intellij.util.indexing.FileBasedIndex;
1113
import org.jetbrains.annotations.NotNull;
1214

13-
import java.util.Arrays;
1415
import java.util.HashSet;
15-
import java.util.Objects;
1616
import java.util.Set;
17-
import java.util.regex.Matcher;
18-
import java.util.regex.Pattern;
1917

2018
public class TableUtil {
2119

2220
public static final String EXT_TABLES_SQL_FILENAME = "ext_tables.sql";
2321

2422
public static Set<String> getAvailableTableNames(@NotNull Project project) {
25-
PsiFile[] extSqlFiles = getExtTablesSqlFilesInProject(project);
2623

27-
Set<String> tableNames = new HashSet<>();
28-
29-
for (PsiFile psiFile : extSqlFiles) {
24+
return new HashSet<>(FileBasedIndex.getInstance().getAllKeys(TablenameFileIndex.KEY, project));
25+
}
3026

31-
if (psiFile != null) {
27+
public static PsiElement[] getTableDefinitionElements(@NotNull String tableName, @NotNull Project project) {
3228

33-
CharSequence charSequence = LoadTextUtil.loadText(psiFile.getVirtualFile());
29+
PsiFile[] extTablesSqlFilesInProjectContainingTable = getExtTablesSqlFilesInProjectContainingTable(tableName, project);
30+
Set<PsiElement> elements = new HashSet<>();
3431

35-
final Matcher matcher = Pattern
36-
.compile("create\\s+table\\s+(if\\s+not\\s+exists\\s+)?([a-zA-Z_0-9]+)", Pattern.CASE_INSENSITIVE)
37-
.matcher(charSequence);
32+
PsiManager psiManager = PsiManager.getInstance(project);
3833

39-
try {
40-
while (matcher.find()) {
41-
if (matcher.groupCount() < 2) {
42-
return tableNames;
43-
}
34+
for (PsiFile virtualFile : extTablesSqlFilesInProjectContainingTable) {
35+
FileBasedIndex.getInstance().processValues(TablenameFileIndex.KEY, tableName, virtualFile.getVirtualFile(), (file, value) -> {
4436

45-
tableNames.add(matcher.group(2));
37+
PsiFile file1 = psiManager.findFile(file);
38+
if (file1 != null) {
39+
PsiElement elementAt = file1.findElementAt(value.getEndOffset() - 2);
40+
if (elementAt != null) {
41+
elements.add(elementAt);
4642
}
47-
} catch (IllegalStateException e) {
48-
// no matches
4943
}
50-
}
44+
45+
return true;
46+
}, GlobalSearchScope.allScope(project));
5147
}
5248

53-
return tableNames;
49+
return elements.toArray(new PsiElement[elements.size()]);
5450
}
5551

56-
public static PsiElement[] getTableDefinitionElements(@NotNull String tableName, @NotNull Project project) {
52+
private static PsiFile[] getExtTablesSqlFilesInProjectContainingTable(@NotNull String tableName, @NotNull Project project) {
53+
Set<String> set = new HashSet<>();
54+
set.add(tableName);
5755

58-
PsiFile[] extTablesSqlFilesInProjectContainingTable = getExtTablesSqlFilesInProjectContainingTable(tableName, project);
56+
Set<PsiFile> files = new HashSet<>();
57+
PsiManager psiManager = PsiManager.getInstance(project);
5958

60-
return Arrays
61-
.stream(extTablesSqlFilesInProjectContainingTable)
62-
.map(file -> {
63-
CharSequence charSequence = LoadTextUtil.loadText(file.getVirtualFile());
64-
65-
final Matcher matcher = Pattern
66-
.compile("create\\s+table\\s+(if\\s+not\\s+exists\\s+)?([a-zA-Z_0-9]+)", Pattern.CASE_INSENSITIVE)
67-
.matcher(charSequence);
68-
try {
69-
while (matcher.find()) {
70-
if (matcher.groupCount() < 2) {
71-
continue;
72-
}
73-
74-
final String foundTable = matcher.group(2);
75-
if (!foundTable.equals(tableName)) {
76-
continue;
77-
}
78-
79-
return file.findElementAt(matcher.end() - 2);
80-
}
81-
} catch (IllegalStateException e) {
82-
// do nothing
83-
}
59+
FileBasedIndex.getInstance().getFilesWithKey(TablenameFileIndex.KEY, set, virtualFile -> {
8460

85-
return null;
86-
})
87-
.filter(Objects::nonNull)
88-
.toArray(PsiElement[]::new);
89-
}
61+
files.add(psiManager.findFile(virtualFile));
9062

91-
private static PsiFile[] getExtTablesSqlFilesInProjectContainingTable(@NotNull String tableName, @NotNull Project project) {
63+
return true;
64+
}, GlobalSearchScope.allScope(project));
9265

93-
return Arrays
94-
.stream(getExtTablesSqlFilesInProject(project))
95-
.filter(Objects::nonNull)
96-
.filter(file -> LoadTextUtil.loadText(file.getVirtualFile()).toString().contains(tableName))
97-
.toArray(PsiFile[]::new);
66+
return files.toArray(new PsiFile[files.size()]);
9867
}
9968

10069
@NotNull

src/main/resources/META-INF/plugin.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ It is a great inspiration for possible solutions and parts of the code.</p>
267267
<!-- indexes -->
268268
<fileBasedIndex implementation="com.cedricziel.idea.typo3.index.CoreServiceMapStubIndex"/>
269269
<fileBasedIndex implementation="com.cedricziel.idea.typo3.index.ExtensionNameStubIndex"/>
270+
<fileBasedIndex implementation="com.cedricziel.idea.typo3.index.TablenameFileIndex"/>
270271

271272
<!-- completion -->
272273
<completion.contributor language="PHP"

0 commit comments

Comments
 (0)