Skip to content

Commit 02d4146

Browse files
committed
feat: getTable skip if collection type is view
1 parent f2e6358 commit 02d4146

File tree

1 file changed

+71
-46
lines changed

1 file changed

+71
-46
lines changed

src/Schema/Builder.php

Lines changed: 71 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -117,52 +117,77 @@ public function dropAllTables()
117117
$this->drop($collection);
118118
}
119119
}
120-
121-
public function getTables()
122-
{
123-
$db = $this->connection->getMongoDB();
124-
$collections = [];
125-
126-
foreach ($db->listCollectionNames() as $collectionName) {
127-
// Skip system collections
128-
if (str_starts_with($collectionName, 'system.')) {
129-
continue;
130-
}
131-
132-
$stats = $db->selectCollection($collectionName)->aggregate([
133-
['$collStats' => ['storageStats' => ['scale' => 1]]],
134-
['$project' => ['storageStats.totalSize' => 1]],
135-
])->toArray();
136-
137-
$collections[] = [
138-
'name' => $collectionName,
139-
'schema' => null,
140-
'size' => $stats[0]?->storageStats?->totalSize ?? null,
141-
'comment' => null,
142-
'collation' => null,
143-
'engine' => null,
144-
];
145-
}
146-
147-
usort($collections, function ($a, $b) {
148-
return $a['name'] <=> $b['name'];
149-
});
150-
151-
return $collections;
152-
}
153-
154-
public function getTableListing()
155-
{
156-
$collections = array_filter(
157-
iterator_to_array($this->connection->getMongoDB()->listCollectionNames()),
158-
// Skip system collections
159-
fn($name) => !str_starts_with($name, 'system.')
160-
);
161-
162-
sort($collections);
163-
164-
return $collections;
165-
}
120+
/** @param string|null $schema Database name */
121+
public function getTables($schema = null)
122+
{
123+
$db = $this->connection->getDatabase($schema);
124+
$collections = [];
125+
126+
foreach ($db->listCollections() as $collectionInfo) {
127+
$collectionName = $collectionInfo->getName();
128+
129+
// Skip system collections
130+
if (str_starts_with($collectionName, 'system.')) {
131+
continue;
132+
}
133+
// Skip views it doesnt suport aggregate
134+
$isView = ($collectionInfo['type'] ?? '') === 'view';
135+
$stats = null;
136+
137+
if (! $isView) {
138+
// Only run aggregation if it's a normal collection
139+
$stats = $db->selectCollection($collectionName)->aggregate([
140+
['$collStats' => ['storageStats' => ['scale' => 1]]],
141+
['$project' => ['storageStats.totalSize' => 1]],
142+
])->toArray();
143+
}
144+
145+
$collections[] = [
146+
'name' => $collectionName,
147+
'schema' => $db->getDatabaseName(),
148+
'schema_qualified_name' => $db->getDatabaseName().'.'.$collectionName,
149+
'size' => $stats[0]?->storageStats?->totalSize ?? null,
150+
'comment' => null,
151+
'collation' => null,
152+
'engine' => $isView ? 'view' : 'collection',
153+
];
154+
}
155+
156+
usort($collections, fn ($a, $b) => $a['name'] <=> $b['name']);
157+
158+
return $collections;
159+
}
160+
161+
/**
162+
* @param string|null $schema
163+
* @param bool $schemaQualified If a schema is provided, prefix the collection names with the schema name
164+
* @return array
165+
*/
166+
public function getTableListing($schema = null, $schemaQualified = false)
167+
{
168+
$collections = [];
169+
170+
if ($schema === null || is_string($schema)) {
171+
$collections[$schema ?? 0] = iterator_to_array($this->connection->getDatabase($schema)->listCollectionNames());
172+
} elseif (is_array($schema)) {
173+
foreach ($schema as $db) {
174+
$collections[$db] = iterator_to_array($this->connection->getDatabase($db)->listCollectionNames());
175+
}
176+
}
177+
178+
if ($schema && $schemaQualified) {
179+
$collections = array_map(fn ($db, $collections) => array_map(static fn ($collection) => $db.'.'.$collection, $collections), array_keys($collections), $collections);
180+
}
181+
182+
$collections = array_merge(...array_values($collections));
183+
184+
// Exclude system collections before sorting
185+
$collections = array_filter($collections, fn ($name) => ! str_starts_with($name, 'system.'));
186+
187+
sort($collections);
188+
189+
return $collections;
190+
}
166191

167192
public function getColumns($table)
168193
{

0 commit comments

Comments
 (0)