Skip to content

Commit 969cdb7

Browse files
authored
Merge pull request #7668 from ant-media/vod-search-metadata
Extend vod search with metadata queries
2 parents 4e24722 + c962739 commit 969cdb7

File tree

3 files changed

+65
-21
lines changed

3 files changed

+65
-21
lines changed

src/main/java/io/antmedia/datastore/db/DataStore.java

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1227,37 +1227,38 @@ protected void updateStreamInfo(Broadcast broadcast, BroadcastUpdate newBroadcas
12271227
* They are used by InMemoryDataStore and MapDBStore, Mongodb implements the same functionality inside its own class.
12281228
*/
12291229
protected ArrayList<VoD> searchOnServerVod(ArrayList<VoD> broadcastList, String search){
1230-
1230+
12311231
long startTime = System.nanoTime();
12321232
if(search != null && !search.isEmpty()) {
1233+
String searchLower = search.toLowerCase();
12331234
for (Iterator<VoD> i = broadcastList.iterator(); i.hasNext(); ) {
12341235
VoD item = i.next();
1235-
if(item.getVodName() != null && item.getStreamName() != null && item.getStreamId() != null && item.getVodId() != null) {
1236-
if (item.getVodName().toLowerCase().contains(search.toLowerCase()) || item.getStreamId().toLowerCase().contains(search.toLowerCase()) || item.getStreamName().toLowerCase().contains(search.toLowerCase()) || item.getVodId().toLowerCase().contains(search.toLowerCase()))
1237-
continue;
1238-
else i.remove();
1239-
}
1240-
else if (item.getVodName()!= null && item.getVodId() != null){
1241-
if (item.getVodName().toLowerCase().contains(search.toLowerCase()) || item.getVodId().toLowerCase().contains(search.toLowerCase()))
1242-
continue;
1243-
else i.remove();
1244-
}
1245-
else{
1246-
if (item.getVodId() != null){
1247-
if (item.getVodId().toLowerCase().contains(search.toLowerCase()))
1248-
continue;
1249-
else i.remove();
1250-
}
1236+
if (matchesVodSearch(item, searchLower)) {
1237+
continue;
12511238
}
1239+
i.remove();
12521240
}
12531241
}
1254-
1242+
12551243
long elapsedNanos = System.nanoTime() - startTime;
12561244
addQueryTime(elapsedNanos);
12571245
showWarningIfElapsedTimeIsMoreThanThreshold(elapsedNanos, "searchOnServerVod");
12581246
return broadcastList;
12591247
}
12601248

1249+
private boolean matchesVodSearch(VoD item, String searchLower) {
1250+
return containsIgnoreCase(item.getVodId(), searchLower) ||
1251+
containsIgnoreCase(item.getVodName(), searchLower) ||
1252+
containsIgnoreCase(item.getStreamId(), searchLower) ||
1253+
containsIgnoreCase(item.getStreamName(), searchLower) ||
1254+
containsIgnoreCase(item.getDescription(), searchLower) ||
1255+
containsIgnoreCase(item.getMetadata(), searchLower);
1256+
}
1257+
1258+
private boolean containsIgnoreCase(String field, String searchLower) {
1259+
return field != null && field.toLowerCase().contains(searchLower);
1260+
}
1261+
12611262
protected List<VoD> sortAndCropVodList(List<VoD> vodList, int offset, int size, String sortBy, String orderBy)
12621263
{
12631264
long startTime = System.nanoTime();

src/main/java/io/antmedia/datastore/db/MongoStore.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -825,7 +825,9 @@ public List<VoD> getVodList(int offset, int size, String sortBy, String orderBy,
825825
Filters.regex(STREAM_ID).caseInsensitive().pattern(".*" + search + ".*"),
826826
Filters.regex("streamName").caseInsensitive().pattern(".*" + search + ".*"),
827827
Filters.regex(VOD_ID).caseInsensitive().pattern(".*" + search + ".*"),
828-
Filters.regex("vodName").caseInsensitive().pattern(".*" + search + ".*")
828+
Filters.regex("vodName").caseInsensitive().pattern(".*" + search + ".*"),
829+
Filters.regex("description").caseInsensitive().pattern(".*" + search + ".*"),
830+
Filters.regex("metadata").caseInsensitive().pattern(".*" + search + ".*")
829831
)
830832
);
831833

@@ -973,14 +975,16 @@ public long getPartialVodNumber(String search)
973975
synchronized(vodLock) {
974976

975977
Query<VoD> query = vodDatastore.find(VoD.class);
976-
if (search != null && !search.isEmpty())
978+
if (search != null && !search.isEmpty())
977979
{
978980
logger.info("Server side search is called for {}", search);
979981
query.filter(Filters.or(
980982
Filters.regex("streamId").caseInsensitive().pattern(".*" + search + ".*"),
981983
Filters.regex("streamName").caseInsensitive().pattern(".*" + search + ".*"),
982984
Filters.regex(VOD_ID).caseInsensitive().pattern(".*" + search + ".*"),
983-
Filters.regex("vodName").caseInsensitive().pattern(".*" + search + ".*")
985+
Filters.regex("vodName").caseInsensitive().pattern(".*" + search + ".*"),
986+
Filters.regex("description").caseInsensitive().pattern(".*" + search + ".*"),
987+
Filters.regex("metadata").caseInsensitive().pattern(".*" + search + ".*")
984988
));
985989
}
986990
partialVodNumber = query.count();

src/test/java/io/antmedia/test/db/DBStoresUnitTest.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2148,6 +2148,45 @@ private void testVodSearch(DataStore dataStore){
21482148
vodList = dataStore.getVodList(0, 50, null, null, null, "vassdfsdgs");
21492149
assertEquals(0, vodList.size());
21502150

2151+
// Test search by metadata
2152+
VoD vodWithMetadata = new VoD("metaStream", "meta123" + (int)(Math.random() * 1000), "path", "metaVodName", 1517239908, 123, 17933, 1190425, VoD.STREAM_VOD, "metaVodId" + (int)(Math.random() * 91000), null);
2153+
vodWithMetadata.setMetadata("team=A,event=championship");
2154+
dataStore.addVod(vodWithMetadata);
2155+
2156+
vodList = dataStore.getVodList(0, 50, null, null, null, "team=A");
2157+
assertEquals(1, vodList.size());
2158+
assertEquals(vodWithMetadata.getVodId(), vodList.get(0).getVodId());
2159+
2160+
vodList = dataStore.getVodList(0, 50, null, null, null, "championship");
2161+
assertEquals(1, vodList.size());
2162+
assertEquals(vodWithMetadata.getVodId(), vodList.get(0).getVodId());
2163+
2164+
partialVodNumber = dataStore.getPartialVodNumber("team=A");
2165+
assertEquals(1, partialVodNumber);
2166+
2167+
// Test search by description
2168+
VoD vodWithDescription = new VoD("descStream", "desc123" + (int)(Math.random() * 1000), "path", "descVodName", 1517239908, 123, 17933, 1190425, VoD.STREAM_VOD, "descVodId" + (int)(Math.random() * 91000), null);
2169+
vodWithDescription.setDescription("Important recorded segment from Event B");
2170+
dataStore.addVod(vodWithDescription);
2171+
2172+
vodList = dataStore.getVodList(0, 50, null, null, null, "Event B");
2173+
assertEquals(1, vodList.size());
2174+
assertEquals(vodWithDescription.getVodId(), vodList.get(0).getVodId());
2175+
2176+
vodList = dataStore.getVodList(0, 50, null, null, null, "recorded segment");
2177+
assertEquals(1, vodList.size());
2178+
assertEquals(vodWithDescription.getVodId(), vodList.get(0).getVodId());
2179+
2180+
partialVodNumber = dataStore.getPartialVodNumber("Event B");
2181+
assertEquals(1, partialVodNumber);
2182+
2183+
// Test case insensitive search for metadata and description
2184+
vodList = dataStore.getVodList(0, 50, null, null, null, "TEAM=A");
2185+
assertEquals(1, vodList.size());
2186+
2187+
vodList = dataStore.getVodList(0, 50, null, null, null, "event b");
2188+
assertEquals(1, vodList.size());
2189+
21512190
}
21522191

21532192

0 commit comments

Comments
 (0)