Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extraction & QoL Improvements #375

Merged
merged 12 commits into from
May 8, 2023
13 changes: 9 additions & 4 deletions cineast-api/src/main/java/org/vitrivr/cineast/api/Main.java
Original file line number Diff line number Diff line change
@@ -4,6 +4,7 @@
import java.util.logging.Logger;
import org.vitrivr.cineast.core.render.lwjgl.renderer.RenderJob;
import org.vitrivr.cineast.core.render.lwjgl.renderer.RenderWorker;

import static org.vitrivr.cineast.core.util.CineastConstants.DEFAULT_CONFIG_PATH;

import org.vitrivr.cineast.core.render.lwjgl.util.fsm.abstractworker.JobControlCommand;
@@ -65,13 +66,17 @@ public static void main(String[] args) {
APIEndpoint.stop();
GRPCEndpoint.stop();
PrometheusServer.stopServer();
RenderWorker.getRenderJobQueue().add(new RenderJob(JobControlCommand.SHUTDOWN_WORKER));
if (RenderWorker.getRenderJobQueue() != null) {
RenderWorker.getRenderJobQueue().add(new RenderJob(JobControlCommand.SHUTDOWN_WORKER));
}
System.out.println("Goodbye!");
}));

/* Initialize Renderer */
var renderThread = new Thread(new RenderWorker(new LinkedBlockingDeque<>()), "RenderWorker");
renderThread.start();
if (Config.sharedConfig().getExtractor().getEnableRenderWorker()) {
/* Initialize Renderer */
var renderThread = new Thread(new RenderWorker(new LinkedBlockingDeque<>()), "RenderWorker");
renderThread.start();
}

try {
/* Start Cineast CLI in interactive mode (blocking). */
Original file line number Diff line number Diff line change
@@ -134,14 +134,14 @@ public final void handle(Session session, T message) {
* @param segmentIds List of segment IDs that should be looked up.
* @return List of found {@link MediaSegmentDescriptor}
*/
protected List<MediaSegmentDescriptor> loadSegments(List<String> segmentIds, String queryID) {
LOGGER.trace("Loading segment information for {} segmentIDs, qid {}", segmentIds.size(), queryID);
protected List<MediaSegmentDescriptor> loadSegments(List<String> segmentIds, String queryId) {
LOGGER.trace("Loading segment information for {} segmentIds, qId {}", segmentIds.size(), queryId);
return TimeHelper.timeCall(() -> {
final Map<String, MediaSegmentDescriptor> map = this.mediaSegmentReader.lookUpSegments(segmentIds, queryID);
final Map<String, MediaSegmentDescriptor> map = this.mediaSegmentReader.lookUpSegments(segmentIds, queryId);
final ArrayList<MediaSegmentDescriptor> sdList = new ArrayList<>(map.size());
segmentIds.stream().filter(map::containsKey).forEach(s -> sdList.add(map.get(s)));
return sdList;
}, "loading segment information, qid " + queryID, Level.TRACE);
}, "loading segment information, qid " + queryId, Level.TRACE);
}


@@ -151,14 +151,14 @@ protected List<MediaSegmentDescriptor> loadSegments(List<String> segmentIds, Str
* @param objectIds List of object IDs that should be looked up.
* @return List of found {@link MediaObjectDescriptor}
*/
protected List<MediaObjectDescriptor> loadObjects(List<String> objectIds, String queryID) {
LOGGER.trace("Loading object information for {} segmentIDs, qid {}", objectIds.size(), queryID);
protected List<MediaObjectDescriptor> loadObjects(List<String> objectIds, String queryId) {
LOGGER.trace("Loading object information for {} segmentIds, qid {}", objectIds.size(), queryId);
return TimeHelper.timeCall(() -> {
final Map<String, MediaObjectDescriptor> map = this.mediaObjectReader.lookUpObjects(objectIds, queryID);
final Map<String, MediaObjectDescriptor> map = this.mediaObjectReader.lookUpObjects(objectIds, queryId);
final ArrayList<MediaObjectDescriptor> vdList = new ArrayList<>(map.size());
objectIds.stream().filter(map::containsKey).forEach(s -> vdList.add(map.get(s)));
return vdList;
}, "loading object information, qid " + queryID, Level.TRACE);
}, "loading object information, qid " + queryId, Level.TRACE);
}

/**
@@ -247,21 +247,21 @@ synchronized List<Thread> loadAndWriteSegmentMetadata(Session session, String qu
*
* @return objectIds retrieved for the segmentIds
*/
protected List<String> submitSegmentAndObjectInformation(Session session, String queryID, List<String> segmentIds) {
protected List<String> submitSegmentAndObjectInformation(Session session, String queryId, List<String> segmentIds) {
/* Load segment & object information. */
LOGGER.trace("Loading segment and object information for submission, {} segments, qid {}", segmentIds.size(), queryID);
final List<MediaSegmentDescriptor> segments = this.loadSegments(segmentIds, queryID);
return submitPrefetchedSegmentAndObjectInformation(session, queryID, segments);
LOGGER.trace("Loading segment and object information for submission, {} segments, qid {}", segmentIds.size(), queryId);
final List<MediaSegmentDescriptor> segments = this.loadSegments(segmentIds, queryId);
return submitPrefetchedSegmentAndObjectInformation(session, queryId, segments);
}

protected List<String> submitPrefetchedSegmentAndObjectInformation(Session session, String queryID, List<MediaSegmentDescriptor> segments) {
protected List<String> submitPrefetchedSegmentAndObjectInformation(Session session, String queryId, List<MediaSegmentDescriptor> segments) {
final List<String> objectIds = segments.stream().map(MediaSegmentDescriptor::getObjectId).collect(Collectors.toList());
return submitPrefetchedSegmentandObjectInformationfromIDs(session, queryID, segments, objectIds);
return submitPrefetchedSegmentandObjectInformationfromIDs(session, queryId, segments, objectIds);
}

List<String> submitPrefetchedSegmentandObjectInformationfromIDs(Session session, String queryID, List<MediaSegmentDescriptor> segments, List<String> objectIds) {
List<String> submitPrefetchedSegmentandObjectInformationfromIDs(Session session, String queryId, List<MediaSegmentDescriptor> segments, List<String> objectIds) {
LOGGER.trace("Loading object information");
final List<MediaObjectDescriptor> objects = this.loadObjects(objectIds, queryID);
final List<MediaObjectDescriptor> objects = this.loadObjects(objectIds, queryId);

if (segments.isEmpty() || objects.isEmpty()) {
LOGGER.traceEntry("Segment / Objectlist is Empty, ignoring this iteration");
@@ -270,8 +270,8 @@ List<String> submitPrefetchedSegmentandObjectInformationfromIDs(Session session,
LOGGER.trace("Writing results to the websocket");

/* Write segments, objects and similarity search data to stream. */
this.write(session, new MediaObjectQueryResult(queryID, objects));
this.write(session, new MediaSegmentQueryResult(queryID, segments));
this.write(session, new MediaObjectQueryResult(queryId, objects));
this.write(session, new MediaSegmentQueryResult(queryId, segments));
return objectIds;
}

Original file line number Diff line number Diff line change
@@ -35,7 +35,7 @@ public final class IdConfig {
* Constructor for default {@link IdConfig}.
*/
public IdConfig() {
this("UniqueObjectIdGenerator", ExistenceCheck.CHECK_SKIP, new HashMap<>());
this("UniqueObjectIdGenerator", ExistenceCheck.SKIP_IF_EXISTS, new HashMap<>());
}

/**
@@ -50,7 +50,7 @@ public IdConfig(@JsonProperty(value = "name", required = true) String name,
@JsonProperty(value = "properties") Map<String, String> properties) {

this.name = name;
this.existenceCheckMode = (existenceCheckMode == null ? ExistenceCheck.CHECK_SKIP : existenceCheckMode);
this.existenceCheckMode = (existenceCheckMode == null ? ExistenceCheck.PROCEED_IF_EXISTS : existenceCheckMode);
this.properties = (properties == null ? new HashMap<>(0) : properties);
}

@@ -77,7 +77,7 @@ public ObjectIdGenerator getGenerator() {
}

public enum ExistenceCheck {
CHECK_SKIP,
CHECK_PROCEED
SKIP_IF_EXISTS,
PROCEED_IF_EXISTS
}
}
Original file line number Diff line number Diff line change
@@ -116,7 +116,7 @@ default List<Map<String, PrimitiveTypeProvider>> getRows(String column, Iterable
/**
* SELECT * where column IN (values)
*/
List<Map<String, PrimitiveTypeProvider>> getRows(String column, Iterable<PrimitiveTypeProvider> values, String dbQueryID);
List<Map<String, PrimitiveTypeProvider>> getRows(String column, Iterable<PrimitiveTypeProvider> values, String dbQueryId);

/**
* Conversion to PrimitiveTypeProviders is expensive so underlying classes should feel free to override if they wish to optimize for performance
@@ -132,7 +132,7 @@ default List<Map<String, PrimitiveTypeProvider>> getRows(String column, List<Str
* <p>
* {@link #getRows(String, Iterable, String)}
*/
default List<Map<String, PrimitiveTypeProvider>> getRows(String column, List<String> values, String dbQueryID) {
default List<Map<String, PrimitiveTypeProvider>> getRows(String column, List<String> values, String dbQueryId) {
return getRows(column, values.stream().map(StringTypeProvider::new).collect(Collectors.toList()), null);
}

@@ -222,8 +222,8 @@ default Map<String, Integer> countDistinctValues(String column) {
/**
* Returns all available metadata based on the specification.
*/
default List<Map<String, PrimitiveTypeProvider>> getMetadataBySpec(List<MetadataAccessSpecification> spec, String dbQueryID, ReadableQueryConfig queryConfig) {
return this.getMetadataByIdAndSpec(null, spec, null, dbQueryID, queryConfig);
default List<Map<String, PrimitiveTypeProvider>> getMetadataBySpec(List<MetadataAccessSpecification> spec, String dbQueryId, ReadableQueryConfig queryConfig) {
return this.getMetadataByIdAndSpec(null, spec, null, dbQueryId, queryConfig);
}

/**
@@ -232,11 +232,11 @@ default List<Map<String, PrimitiveTypeProvider>> getMetadataBySpec(List<Metadata
* @param ids ids for which to fetch metadata
* @param spec which metadata should be fetched
* @param idColName the name of the column which the id refers to. Can be null, in which case the default behavior is used
* @param dbQueryID query identifier. Can be null
* @param dbQueryId query identifier. Can be null
* @param queryConfig query config
*/
default List<Map<String, PrimitiveTypeProvider>> getMetadataByIdAndSpec(List<String> ids, List<MetadataAccessSpecification> spec, String idColName, String dbQueryID, ReadableQueryConfig queryConfig) {
LOGGER.trace("fetching metadata with spec, dbQueryID {}", dbQueryID);
default List<Map<String, PrimitiveTypeProvider>> getMetadataByIdAndSpec(List<String> ids, List<MetadataAccessSpecification> spec, String idColName, String dbQueryId, ReadableQueryConfig queryConfig) {
LOGGER.trace("fetching metadata with spec, dbQueryId {}", dbQueryId);
return getAll().stream().filter(tuple -> {
// check if there are any elements of the specification which do not work
if (spec.stream().noneMatch(el -> {
Original file line number Diff line number Diff line change
@@ -184,7 +184,7 @@ public List<float[]> getFeatureVectors(String column, PrimitiveTypeProvider valu
}

@Override
public List<Map<String, PrimitiveTypeProvider>> getRows(String column, Iterable<PrimitiveTypeProvider> values, String dbQueryID) {
public List<Map<String, PrimitiveTypeProvider>> getRows(String column, Iterable<PrimitiveTypeProvider> values, String dbQueryId) {
if (values == null) {
return new ArrayList<>(0);
}
Original file line number Diff line number Diff line change
@@ -42,7 +42,7 @@ public List<Map<String, PrimitiveTypeProvider>> getFulltextRows(int rows, String
}

@Override
public List<Map<String, PrimitiveTypeProvider>> getRows(String column, Iterable<PrimitiveTypeProvider> values, String dbQueryID) {
public List<Map<String, PrimitiveTypeProvider>> getRows(String column, Iterable<PrimitiveTypeProvider> values, String dbQueryId) {
return new ArrayList<>(0);
}

Loading