Skip to content

Commit 26806ee

Browse files
author
Komal Yadav
committed
updated
1 parent ec4c161 commit 26806ee

File tree

3 files changed

+59
-63
lines changed

3 files changed

+59
-63
lines changed

cdap-metadata-ext-spanner/src/main/java/io/cdap/cdap/metadata/spanner/MetadataMutator.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package io.cdap.cdap.metadata.spanner;
1818

19-
import static io.cdap.cdap.metadata.spanner.SpannerMetadataStorage.DISCARD;
2019
import static io.cdap.cdap.metadata.spanner.SpannerMetadataStorage.GSON;
2120
import static io.cdap.cdap.metadata.spanner.SpannerMetadataStorage.METADATA_PROPS_TABLE;
2221
import static io.cdap.cdap.metadata.spanner.SpannerMetadataStorage.METADATA_TABLE;
@@ -222,7 +221,7 @@ private static ChangeRequest update(MetadataEntity entity, VersionedMetadata bef
222221
* @return the list of mutations to execute and the change caused by the mutation
223222
*/
224223
private static ChangeRequest remove(VersionedMetadata before, MetadataMutation.Remove remove) throws IOException {
225-
Metadata after = filterMetadata(before.getMetadata(), DISCARD,
224+
Metadata after = filterMetadata(before.getMetadata(), false,
226225
remove.getKinds(), remove.getScopes(), remove.getRemovals());
227226
return new ChangeRequest(bufferWrites(remove.getEntity(), before.getVersion(), after),
228227
new MetadataChange(remove.getEntity(), before.getMetadata(), after));

cdap-metadata-ext-spanner/src/main/java/io/cdap/cdap/metadata/spanner/SpannerMetadataStorage.java

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import com.google.cloud.spanner.Value;
3737
import com.google.common.annotations.VisibleForTesting;
3838
import com.google.common.base.Preconditions;
39+
import com.google.common.base.Splitter;
3940
import com.google.common.base.Strings;
4041
import com.google.common.collect.ImmutableMap;
4142
import com.google.common.collect.Maps;
@@ -76,6 +77,7 @@
7677
import java.util.Optional;
7778
import java.util.Set;
7879
import java.util.concurrent.ExecutionException;
80+
import java.util.regex.Pattern;
7981
import java.util.stream.Collectors;
8082
import java.util.stream.IntStream;
8183
import java.util.stream.StreamSupport;
@@ -120,10 +122,7 @@ public class SpannerMetadataStorage implements MetadataStorage {
120122
"creation-time", Tables.Metadata.CREATED_FIELD
121123
);
122124

123-
@VisibleForTesting
124-
static final boolean KEEP = true;
125-
@VisibleForTesting
126-
static final boolean DISCARD = false;
125+
private static final Pattern SPACE_SEPARATOR_PATTERN = Pattern.compile("\\s+");
127126

128127
@Override
129128
public void initialize(MetadataStorageContext context) throws Exception {
@@ -339,7 +338,7 @@ public void dropIndex() throws IOException {
339338
public Metadata read(Read read) throws IOException {
340339
try (ReadOnlyTransaction transaction = dbClient.readOnlyTransaction()) {
341340
Metadata metadata = readVersionedMetadata(read.getEntity(), transaction).getMetadata();
342-
return filterMetadata(metadata, KEEP, read.getKinds(),
341+
return filterMetadata(metadata, true, read.getKinds(),
343342
read.getScopes(), read.getSelection());
344343
} catch (SpannerException e) {
345344
throw new IOException("Error reading from Spanner", e);
@@ -516,11 +515,7 @@ public static String toMetadataId(MetadataEntity entity) {
516515

517516
@Override
518517
public SearchResponse search(SearchRequest request) {
519-
Cursor cursor = Optional.ofNullable(request.getCursor())
520-
.filter(s -> !s.isEmpty())
521-
.map(Cursor::fromString)
522-
.orElse(null);
523-
518+
Cursor cursor = Strings.isNullOrEmpty(request.getCursor()) ? null : Cursor.fromString(request.getCursor());
524519
return doSearch(request, cursor);
525520
}
526521

@@ -549,7 +544,6 @@ private SearchResponse doSearch(SearchRequest request,
549544
ResultSet resultSet = transaction.executeQuery(statement);
550545
List<MetadataRecord> results = new ArrayList<>();
551546
String nextActualCursor = null;
552-
553547
while (resultSet.next()) {
554548
results.add(mapResult(resultSet));
555549
nextActualCursor = createNextCursorKey(resultSet, sortColumns);
@@ -566,18 +560,37 @@ private SearchResponse doSearch(SearchRequest request,
566560
*/
567561
private QueryBuildResult buildQuery(SearchRequest request, @Nullable Cursor requestCursor) {
568562
StringBuilder sql = new StringBuilder("SELECT * FROM metadata");
563+
MetadataScope scope = request.getScope();
569564
Map<String, Value> params = new HashMap<>();
570565
SortDetailsResult sortDetails = getSortDetails(request);
571566
List<String> sortColumns = sortDetails.getColumns();
572567
List<Sorting.Order> sortOrders = sortDetails.getOrders();
568+
List<String> allSearchConditions = new ArrayList<>();
569+
Iterable<String> terms = Splitter.on(SPACE_SEPARATOR_PATTERN)
570+
.omitEmptyStrings().trimResults().split(request.getQuery());
571+
572+
if (request.getNamespaces() != null && !request.getNamespaces().isEmpty()) {
573+
allSearchConditions.add("namespace IN UNNEST(@namespaces)");
574+
params.put("namespaces", Value.stringArray(request.getNamespaces()));
575+
}
576+
577+
if (request.getTypes() != null && !request.getTypes().isEmpty()) {
578+
allSearchConditions.add("entity_type IN UNNEST(@types)");
579+
params.put("types", Value.stringArray(request.getTypes()));
580+
}
573581

574582
// Add standard filter conditions (namespaces, types, etc.) to the WHERE clause.
575-
List<String> conditions = appendFilterConditions(request, params);
583+
for (String searchTerm : terms) {
584+
List<String> termConditions = appendFilterConditions(searchTerm, params, scope);
585+
if (!termConditions.isEmpty()) {
586+
allSearchConditions.add("(" + String.join(" OR ", termConditions) + ")");
587+
}
588+
}
576589

577590
// Add the special WHERE condition for keyset pagination if a cursor exists.
578-
appendCursorCondition(requestCursor, sortColumns, sortOrders, conditions, params);
579-
if (!conditions.isEmpty()) {
580-
sql.append(" WHERE ").append(String.join(" AND ", conditions));
591+
appendCursorCondition(requestCursor, sortColumns, sortOrders, allSearchConditions, params);
592+
if (!allSearchConditions.isEmpty()) {
593+
sql.append(" WHERE ").append(String.join(" AND ", allSearchConditions));
581594
}
582595

583596
// Add the ORDER BY clause.
@@ -625,28 +638,16 @@ private SortDetailsResult getSortDetails(SearchRequest request) {
625638
/**
626639
* Appends standard WHERE conditions and their parameters for filtering the search.
627640
*/
628-
private List<String> appendFilterConditions(SearchRequest request, Map<String, Value> params) {
641+
private List<String> appendFilterConditions(String term, Map<String, Value> params , MetadataScope scope) {
629642
List<String> conditions = new ArrayList<>();
630-
631-
if (request.getNamespaces() != null && !request.getNamespaces().isEmpty()) {
632-
conditions.add("namespace IN UNNEST(@namespaces)");
633-
params.put("namespaces", Value.stringArray(request.getNamespaces()));
634-
}
635-
636-
if (request.getTypes() != null && !request.getTypes().isEmpty()) {
637-
conditions.add("entity_type IN UNNEST(@types)");
638-
params.put("types", Value.stringArray(request.getTypes()));
639-
}
640-
641-
String query = request.getQuery().toLowerCase();
642-
if (query.isEmpty() || query.equals("*")) {
643+
if (term.isEmpty() || term.equals("*")) {
643644
return conditions;
644645
}
645646

646-
if (query.contains(":")) {
647-
conditions.add(buildKeyValueSearchCondition(query, params));
647+
if (term.contains(":")) {
648+
conditions.add(buildKeyValueSearchCondition(term, params));
648649
} else {
649-
conditions.add(buildScopedSearchCondition(query, request.getScope(), params));
650+
conditions.add(buildScopedSearchCondition(term, scope, params));
650651
}
651652

652653
return conditions;
@@ -895,7 +896,7 @@ private Cursor getCursor(SearchRequest request, List<MetadataRecord> results, St
895896
private MetadataRecord mapResult(ResultSet resultSet) {
896897
String metadataId = resultSet.getString(Tables.Metadata.METADATA_ID_FIELD);
897898
Struct row = resultSet.getCurrentRowAsStruct();
898-
String metadataJson = row.getJson(7);
899+
String metadataJson = row.getJson(Tables.Metadata.METADATA_COLUMN_FIELD);
899900
Metadata metadata = GSON.fromJson(metadataJson, Metadata.class);
900901
MetadataEntity entity = toMetadataEntity(metadataId);
901902
return new MetadataRecord(entity, metadata);

cdap-metadata-ext-spanner/src/test/java/io/cdap/cdap/metadata/spanner/SpannerMetadataStorageTest.java

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,6 @@ public class SpannerMetadataStorageTest extends MetadataStorageTest {
9797
private static InstanceAdminClient adminClient;
9898
private static Spanner spanner;
9999

100-
// Metadata table names
101-
private static final String METADATA_TABLE = "metadata";
102-
private static final String METADATA_PROPS_TABLE = "metadata_props";
103-
104100
// Indicates whether the Spanner emulator is active, guiding cleanup decisions.
105101
private static boolean isEmulatorRunning;
106102

@@ -213,7 +209,7 @@ public void testFiltering() {
213209
Assert.assertEquals(new Metadata(tags(sys), props(user, uval)),
214210
SpannerMetadataStorage.filterMetadata(
215211
before,
216-
SpannerMetadataStorage.DISCARD,
212+
false,
217213
MetadataKind.NONE,
218214
MetadataScope.NONE,
219215
ImmutableSet.of(new ScopedNameOfKind(MetadataKind.TAG, user),
@@ -223,7 +219,7 @@ public void testFiltering() {
223219
Assert.assertEquals(new Metadata(tags(sys), props(user, uval)),
224220
SpannerMetadataStorage.filterMetadata(
225221
before,
226-
SpannerMetadataStorage.DISCARD,
222+
false,
227223
MetadataKind.ALL,
228224
MetadataScope.ALL,
229225
ImmutableSet.of(new ScopedNameOfKind(MetadataKind.TAG, user),
@@ -233,7 +229,7 @@ public void testFiltering() {
233229
Assert.assertEquals(new Metadata(tags(user), props(sys, sval)),
234230
SpannerMetadataStorage.filterMetadata(
235231
before,
236-
SpannerMetadataStorage.KEEP,
232+
true,
237233
MetadataKind.NONE,
238234
MetadataScope.NONE,
239235
ImmutableSet.of(new ScopedNameOfKind(MetadataKind.TAG, user),
@@ -243,7 +239,7 @@ public void testFiltering() {
243239
Assert.assertEquals(new Metadata(tags(user), props(sys, sval)),
244240
SpannerMetadataStorage.filterMetadata(
245241
before,
246-
SpannerMetadataStorage.KEEP,
242+
true,
247243
MetadataKind.ALL,
248244
MetadataScope.ALL,
249245
ImmutableSet.of(new ScopedNameOfKind(MetadataKind.TAG, user),
@@ -253,21 +249,21 @@ public void testFiltering() {
253249
Assert.assertEquals(before,
254250
SpannerMetadataStorage.filterMetadata(
255251
before,
256-
SpannerMetadataStorage.DISCARD,
252+
false,
257253
MetadataKind.NONE,
258254
MetadataScope.NONE,
259255
null));
260256
Assert.assertEquals(before,
261257
SpannerMetadataStorage.filterMetadata(
262258
before,
263-
SpannerMetadataStorage.DISCARD,
259+
false,
264260
MetadataKind.NONE,
265261
MetadataScope.ALL,
266262
null));
267263
Assert.assertEquals(before,
268264
SpannerMetadataStorage.filterMetadata(
269265
before,
270-
SpannerMetadataStorage.DISCARD,
266+
false,
271267
MetadataKind.ALL,
272268
MetadataScope.NONE,
273269
null));
@@ -276,7 +272,7 @@ public void testFiltering() {
276272
Assert.assertEquals(before,
277273
SpannerMetadataStorage.filterMetadata(
278274
before,
279-
SpannerMetadataStorage.KEEP,
275+
true,
280276
MetadataKind.ALL,
281277
MetadataScope.ALL,
282278
null));
@@ -285,7 +281,7 @@ public void testFiltering() {
285281
Assert.assertEquals(Metadata.EMPTY,
286282
SpannerMetadataStorage.filterMetadata(
287283
before,
288-
SpannerMetadataStorage.DISCARD,
284+
false,
289285
MetadataKind.ALL,
290286
MetadataScope.ALL,
291287
null));
@@ -294,23 +290,23 @@ public void testFiltering() {
294290
Assert.assertEquals(Metadata.EMPTY,
295291
SpannerMetadataStorage.filterMetadata(
296292
before,
297-
SpannerMetadataStorage.KEEP,
293+
true,
298294
MetadataKind.NONE,
299295
MetadataScope.NONE,
300296
null));
301297
// test keeping nothing
302298
Assert.assertEquals(Metadata.EMPTY,
303299
SpannerMetadataStorage.filterMetadata(
304300
before,
305-
SpannerMetadataStorage.KEEP,
301+
true,
306302
MetadataKind.ALL,
307303
MetadataScope.NONE,
308304
null));
309305
// test keeping nothing
310306
Assert.assertEquals(Metadata.EMPTY,
311307
SpannerMetadataStorage.filterMetadata(
312308
before,
313-
SpannerMetadataStorage.KEEP,
309+
true,
314310
MetadataKind.NONE,
315311
MetadataScope.ALL,
316312
null));
@@ -319,31 +315,31 @@ public void testFiltering() {
319315
Assert.assertEquals(new Metadata(tags(user), props(user, uval)),
320316
SpannerMetadataStorage.filterMetadata(
321317
before,
322-
SpannerMetadataStorage.DISCARD,
318+
false,
323319
MetadataKind.ALL,
324320
Collections.singleton(MetadataScope.SYSTEM),
325321
null));
326322
// test removing all USER
327323
Assert.assertEquals(new Metadata(tags(sys), props(sys, sval)),
328324
SpannerMetadataStorage.filterMetadata(
329325
before,
330-
SpannerMetadataStorage.DISCARD,
326+
false,
331327
MetadataKind.ALL,
332328
Collections.singleton(MetadataScope.USER),
333329
null));
334330
// test keeping all SYSTEM
335331
Assert.assertEquals(new Metadata(tags(sys), props(sys, sval)),
336332
SpannerMetadataStorage.filterMetadata(
337333
before,
338-
SpannerMetadataStorage.KEEP,
334+
true,
339335
MetadataKind.ALL,
340336
Collections.singleton(MetadataScope.SYSTEM),
341337
null));
342338
// test keeping all USER
343339
Assert.assertEquals(new Metadata(tags(user), props(user, uval)),
344340
SpannerMetadataStorage.filterMetadata(
345341
before,
346-
SpannerMetadataStorage.KEEP,
342+
true,
347343
MetadataKind.ALL,
348344
Collections.singleton(MetadataScope.USER),
349345
null));
@@ -352,7 +348,7 @@ public void testFiltering() {
352348
Assert.assertEquals(new Metadata(tags(), props(sys, sval, user, uval)),
353349
SpannerMetadataStorage.filterMetadata(
354350
before,
355-
SpannerMetadataStorage.DISCARD,
351+
false,
356352
Collections.singleton(MetadataKind.TAG),
357353
MetadataScope.ALL,
358354
null));
@@ -361,7 +357,7 @@ public void testFiltering() {
361357
Assert.assertEquals(new Metadata(tags(sys, user), props()),
362358
SpannerMetadataStorage.filterMetadata(
363359
before,
364-
SpannerMetadataStorage.DISCARD,
360+
false,
365361
Collections.singleton(MetadataKind.PROPERTY),
366362
MetadataScope.ALL,
367363
null));
@@ -370,7 +366,7 @@ public void testFiltering() {
370366
Assert.assertEquals(new Metadata(tags(sys, user), props()),
371367
SpannerMetadataStorage.filterMetadata(
372368
before,
373-
SpannerMetadataStorage.KEEP,
369+
true,
374370
Collections.singleton(MetadataKind.TAG),
375371
MetadataScope.ALL,
376372
null));
@@ -379,7 +375,7 @@ public void testFiltering() {
379375
Assert.assertEquals(new Metadata(tags(), props(sys, sval, user, uval)),
380376
SpannerMetadataStorage.filterMetadata(
381377
before,
382-
SpannerMetadataStorage.KEEP,
378+
true,
383379
Collections.singleton(MetadataKind.PROPERTY),
384380
MetadataScope.ALL,
385381
null));
@@ -388,7 +384,7 @@ public void testFiltering() {
388384
Assert.assertEquals(new Metadata(tags(user), props(sys, sval, user, uval)),
389385
SpannerMetadataStorage.filterMetadata(
390386
before,
391-
SpannerMetadataStorage.DISCARD,
387+
false,
392388
Collections.singleton(MetadataKind.TAG),
393389
Collections.singleton(MetadataScope.SYSTEM),
394390
null));
@@ -397,7 +393,7 @@ public void testFiltering() {
397393
Assert.assertEquals(new Metadata(tags(sys, user), props(sys, sval)),
398394
SpannerMetadataStorage.filterMetadata(
399395
before,
400-
SpannerMetadataStorage.DISCARD,
396+
false,
401397
Collections.singleton(MetadataKind.PROPERTY),
402398
Collections.singleton(MetadataScope.USER),
403399
null));
@@ -406,7 +402,7 @@ public void testFiltering() {
406402
Assert.assertEquals(new Metadata(tags(sys), props()),
407403
SpannerMetadataStorage.filterMetadata(
408404
before,
409-
SpannerMetadataStorage.KEEP,
405+
true,
410406
Collections.singleton(MetadataKind.TAG),
411407
Collections.singleton(MetadataScope.SYSTEM),
412408
null));
@@ -415,7 +411,7 @@ public void testFiltering() {
415411
Assert.assertEquals(new Metadata(tags(), props(user, uval)),
416412
SpannerMetadataStorage.filterMetadata(
417413
before,
418-
SpannerMetadataStorage.KEEP,
414+
true,
419415
Collections.singleton(MetadataKind.PROPERTY),
420416
Collections.singleton(MetadataScope.USER),
421417
null));

0 commit comments

Comments
 (0)