Skip to content

Commit

Permalink
Move BlazeProjectSnapshot instantiation one level up
Browse files Browse the repository at this point in the history
Begin separating project querying from building the project structure.
At this stage extract a `createBlazeProjectSnapshot` method and place it
close to the existing location of that code. This is to avoid other unrelated
changes at this stage.

PiperOrigin-RevId: 569187741
  • Loading branch information
Googler authored and copybara-github committed Oct 2, 2023
1 parent 81998c7 commit dcb9056
Show file tree
Hide file tree
Showing 8 changed files with 57 additions and 102 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@ public BlazeProjectSnapshot fullQuery(ProjectDefinition projectDef, BlazeContext
RefreshOperation fullQuery = projectRefresher.startFullUpdate(context, projectDef, vcsState);

QuerySpec querySpec = fullQuery.getQuerySpec().get();
return fullQuery.createBlazeProject(queryRunner.runQuery(querySpec, context));
return projectRefresher.createBlazeProjectSnapshot(
context, fullQuery.createPostQuerySyncData(queryRunner.runQuery(querySpec, context)));
}

private Optional<VcsState> getVcsState(BlazeContext context) {
Expand Down Expand Up @@ -133,6 +134,7 @@ public BlazeProjectSnapshot update(
} else {
querySummary = QuerySummary.EMPTY;
}
return refresh.createBlazeProject(querySummary);
return projectRefresher.createBlazeProjectSnapshot(
context, refresh.createPostQuerySyncData(querySummary));
}
}
33 changes: 7 additions & 26 deletions querysync/java/com/google/idea/blaze/qsync/FullProjectUpdate.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,10 @@
*/
package com.google.idea.blaze.qsync;

import com.google.common.collect.ImmutableSet;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.idea.blaze.common.Context;
import com.google.idea.blaze.common.vcs.VcsState;
import com.google.idea.blaze.exception.BuildException;
import com.google.idea.blaze.qsync.project.BlazeProjectSnapshot;
import com.google.idea.blaze.qsync.project.BuildGraphData;
import com.google.idea.blaze.qsync.project.PostQuerySyncData;
import com.google.idea.blaze.qsync.project.ProjectDefinition;
import com.google.idea.blaze.qsync.project.ProjectProto;
import com.google.idea.blaze.qsync.query.QuerySpec;
import com.google.idea.blaze.qsync.query.QuerySummary;
import java.io.IOException;
Expand All @@ -41,27 +35,18 @@ public class FullProjectUpdate implements RefreshOperation {

private final Context<?> context;
private final Path effectiveWorkspaceRoot;
private final BlazeQueryParser.Factory queryParserFactory;
private final ProjectDefinition projectDefinition;
private final Optional<VcsState> vcsState;
private final GraphToProjectConverter graphToProjectConverter;

public FullProjectUpdate(
Context<?> context,
ListeningExecutorService executor,
Path effectiveWorkspaceRoot,
ProjectDefinition definition,
PackageReader packageReader,
Optional<VcsState> vcsState,
ImmutableSet<String> handledRuleKinds) {
Optional<VcsState> vcsState) {
this.context = context;
this.effectiveWorkspaceRoot = effectiveWorkspaceRoot;
this.projectDefinition = definition;
this.vcsState = vcsState;
this.queryParserFactory = new BlazeQueryParser.Factory(context, handledRuleKinds);
this.graphToProjectConverter =
new GraphToProjectConverter(
packageReader, effectiveWorkspaceRoot, context, projectDefinition, executor);
}

@Override
Expand All @@ -71,15 +56,11 @@ public Optional<QuerySpec> getQuerySpec() throws IOException {
}

@Override
public BlazeProjectSnapshot createBlazeProject(QuerySummary output) throws BuildException {
PostQuerySyncData newData =
PostQuerySyncData.builder()
.setProjectDefinition(projectDefinition)
.setVcsState(vcsState)
.setQuerySummary(output)
.build();
BuildGraphData graph = queryParserFactory.newParser(newData.querySummary()).parse();
ProjectProto.Project project = graphToProjectConverter.createProject(graph);
return BlazeProjectSnapshot.builder().queryData(newData).graph(graph).project(project).build();
public PostQuerySyncData createPostQuerySyncData(QuerySummary output) {
return PostQuerySyncData.builder()
.setProjectDefinition(projectDefinition)
.setVcsState(vcsState)
.setQuerySummary(output)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package com.google.idea.blaze.qsync;

import com.google.idea.blaze.qsync.project.BlazeProjectSnapshot;
import com.google.idea.blaze.qsync.project.PostQuerySyncData;
import com.google.idea.blaze.qsync.query.QuerySpec;
import com.google.idea.blaze.qsync.query.QuerySummary;
import java.util.Optional;
Expand All @@ -41,7 +42,7 @@ public Optional<QuerySpec> getQuerySpec() {
}

@Override
public BlazeProjectSnapshot createBlazeProject(QuerySummary output) {
return latestProjectSnapshotSupplier.get();
public PostQuerySyncData createPostQuerySyncData(QuerySummary output) {
return latestProjectSnapshotSupplier.get().queryData();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,9 @@
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.idea.blaze.common.Context;
import com.google.idea.blaze.common.Label;
import com.google.idea.blaze.common.vcs.VcsState;
import com.google.idea.blaze.exception.BuildException;
import com.google.idea.blaze.qsync.project.BlazeProjectSnapshot;
import com.google.idea.blaze.qsync.project.BuildGraphData;
import com.google.idea.blaze.qsync.project.PostQuerySyncData;
import com.google.idea.blaze.qsync.project.ProjectProto;
import com.google.idea.blaze.qsync.query.Query;
import com.google.idea.blaze.qsync.query.Query.SourceFile;
import com.google.idea.blaze.qsync.query.QuerySpec;
Expand All @@ -47,38 +41,21 @@ class PartialProjectRefresh implements RefreshOperation {

private final Path effectiveWorkspaceRoot;
private final PostQuerySyncData previousState;
private final BlazeQueryParser.Factory queryParserFactory;
private final GraphToProjectConverter graphToProjectConverter;
private final PostQuerySyncData.Builder newState;
private final Optional<VcsState> currentVcsState;
@VisibleForTesting final ImmutableSet<Path> modifiedPackages;
@VisibleForTesting final ImmutableSet<Path> deletedPackages;

PartialProjectRefresh(
Context context,
ListeningExecutorService executor,
Path effectiveWorkspaceRoot,
PackageReader packageReader,
PostQuerySyncData previousState,
Optional<VcsState> currentVcsState,
ImmutableSet<Path> modifiedPackages,
ImmutableSet<Path> deletedPackages,
ImmutableSet<String> handledRuleKinds) {
ImmutableSet<Path> deletedPackages) {
this.effectiveWorkspaceRoot = effectiveWorkspaceRoot;
this.previousState = previousState;
this.newState =
PostQuerySyncData.builder()
.setVcsState(currentVcsState)
.setProjectDefinition(previousState.projectDefinition());
this.currentVcsState = currentVcsState;
this.modifiedPackages = modifiedPackages;
this.deletedPackages = deletedPackages;
this.queryParserFactory = new BlazeQueryParser.Factory(context, handledRuleKinds);
this.graphToProjectConverter =
new GraphToProjectConverter(
packageReader,
effectiveWorkspaceRoot,
context,
previousState.projectDefinition(),
executor);
}

private Optional<QuerySpec> createQuerySpec() {
Expand All @@ -96,21 +73,17 @@ private Optional<QuerySpec> createQuerySpec() {

@Override
public Optional<QuerySpec> getQuerySpec() {
Optional<QuerySpec> querySpec = createQuerySpec();
return querySpec;
return createQuerySpec();
}

@Override
public BlazeProjectSnapshot createBlazeProject(QuerySummary partialQuery) throws BuildException {
public PostQuerySyncData createPostQuerySyncData(QuerySummary partialQuery) {
Preconditions.checkNotNull(partialQuery, "queryOutput");
QuerySummary effectiveQuery = applyDelta(partialQuery);
PostQuerySyncData postQuerySyncData = newState.setQuerySummary(effectiveQuery).build();
BuildGraphData graph = queryParserFactory.newParser(effectiveQuery).parse();
ProjectProto.Project project = graphToProjectConverter.createProject(graph);
return BlazeProjectSnapshot.builder()
.queryData(postQuerySyncData)
.graph(graph)
.project(project)
return PostQuerySyncData.builder()
.setVcsState(currentVcsState)
.setProjectDefinition(previousState.projectDefinition())
.setQuerySummary(effectiveQuery)
.build();
}

Expand Down
40 changes: 27 additions & 13 deletions querysync/java/com/google/idea/blaze/qsync/ProjectRefresher.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@
import com.google.idea.blaze.common.vcs.VcsState;
import com.google.idea.blaze.exception.BuildException;
import com.google.idea.blaze.qsync.project.BlazeProjectSnapshot;
import com.google.idea.blaze.qsync.project.BuildGraphData;
import com.google.idea.blaze.qsync.project.PostQuerySyncData;
import com.google.idea.blaze.qsync.project.ProjectDefinition;
import com.google.idea.blaze.qsync.project.ProjectProto;
import java.nio.file.Path;
import java.util.Optional;
import java.util.function.Supplier;
Expand Down Expand Up @@ -60,14 +62,7 @@ public RefreshOperation startFullUpdate(
Context<?> context, ProjectDefinition spec, Optional<VcsState> vcsState) {
Path effectiveWorkspaceRoot =
vcsState.flatMap(s -> s.workspaceSnapshotPath).orElse(workspaceRoot);
return new FullProjectUpdate(
context,
executor,
effectiveWorkspaceRoot,
spec,
new WorkspaceResolvingPackageReader(effectiveWorkspaceRoot, workspaceRelativePackageReader),
vcsState,
handledRuleKinds);
return new FullProjectUpdate(context, effectiveWorkspaceRoot, spec, vcsState);
}

public RefreshOperation startPartialRefresh(
Expand Down Expand Up @@ -103,15 +98,34 @@ public RefreshOperation startPartialRefresh(RefreshParameters params, Context<?>
Path effectiveWorkspaceRoot =
params.latestVcsState.flatMap(s -> s.workspaceSnapshotPath).orElse(workspaceRoot);
return new PartialProjectRefresh(
context,
executor,
effectiveWorkspaceRoot,
new WorkspaceResolvingPackageReader(effectiveWorkspaceRoot, workspaceRelativePackageReader),
params.currentProject,
params.latestVcsState,
affected.getModifiedPackages(),
affected.getDeletedPackages(),
handledRuleKinds);
affected.getDeletedPackages());
}

public BlazeProjectSnapshot createBlazeProjectSnapshot(
Context<?> context, PostQuerySyncData postQuerySyncData) throws BuildException {
BlazeQueryParser.Factory queryParserFactory =
new BlazeQueryParser.Factory(context, handledRuleKinds);
Path effectiveWorkspaceRoot =
postQuerySyncData.vcsState().flatMap(s -> s.workspaceSnapshotPath).orElse(workspaceRoot);
WorkspaceResolvingPackageReader packageReader =
new WorkspaceResolvingPackageReader(effectiveWorkspaceRoot, workspaceRelativePackageReader);
GraphToProjectConverter graphToProjectConverter =
new GraphToProjectConverter(
packageReader,
effectiveWorkspaceRoot,
context,
postQuerySyncData.projectDefinition(),
executor);
BuildGraphData graph = queryParserFactory.newParser(postQuerySyncData.querySummary()).parse();
ProjectProto.Project project = graphToProjectConverter.createProject(graph);
return BlazeProjectSnapshot.builder()
.queryData(postQuerySyncData)
.graph(graph)
.project(project)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
*/
package com.google.idea.blaze.qsync;

import com.google.idea.blaze.exception.BuildException;
import com.google.idea.blaze.qsync.project.BlazeProjectSnapshot;
import com.google.idea.blaze.qsync.project.PostQuerySyncData;
import com.google.idea.blaze.qsync.query.QuerySpec;
import com.google.idea.blaze.qsync.query.QuerySummary;
import java.io.IOException;
Expand All @@ -30,8 +30,8 @@
* <ol>
* <li>Acquire an implementation, e.g. from {@link ProjectRefresher}
* <li>Run a {@code query} invocation based on the spec from {@link #getQuerySpec()}
* <li>To get the updated project snapshot pass the results of that query to {@link
* #createBlazeProject(QuerySummary)}.
* <li>To get the updated {@link PostQuerySyncData} pass the results of that query to {@link
* #createPostQuerySyncData(QuerySummary)}.
* </ol>
*/
public interface RefreshOperation {
Expand All @@ -40,5 +40,5 @@ public interface RefreshOperation {
Optional<QuerySpec> getQuerySpec() throws IOException;

/** Creates the new project snapshot. */
BlazeProjectSnapshot createBlazeProject(QuerySummary output) throws BuildException;
PostQuerySyncData createPostQuerySyncData(QuerySummary output);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth8.assertThat;
import static com.google.common.util.concurrent.MoreExecutors.newDirectExecutorService;

import com.google.common.collect.ImmutableSet;
import com.google.idea.blaze.common.Label;
Expand Down Expand Up @@ -99,14 +98,10 @@ public void testApplyDelta_replacePackage() {

PartialProjectRefresh queryStrategy =
new PartialProjectRefresh(
QuerySyncTestUtils.NOOP_CONTEXT,
newDirectExecutorService(),
Path.of("/workspace/root"),
QuerySyncTestUtils.EMPTY_PACKAGE_READER,
baseProject,
QuerySyncTestUtils.CLEAN_VCS_STATE,
/* modifiedPackages= */ ImmutableSet.of(Path.of("my/build/package1")),
ImmutableSet.of(),
ImmutableSet.of());
QuerySummary applied = queryStrategy.applyDelta(delta);
assertThat(applied.getRulesMap().keySet())
Expand Down Expand Up @@ -168,15 +163,11 @@ public void testApplyDelta_deletePackage() {

PartialProjectRefresh queryStrategy =
new PartialProjectRefresh(
QuerySyncTestUtils.NOOP_CONTEXT,
newDirectExecutorService(),
Path.of("/workspace/root"),
QuerySyncTestUtils.EMPTY_PACKAGE_READER,
baseProject,
QuerySyncTestUtils.CLEAN_VCS_STATE,
ImmutableSet.of(),
/* deletedPackages= */ ImmutableSet.of(Path.of("my/build/package1")),
ImmutableSet.of());
/* deletedPackages= */ ImmutableSet.of(Path.of("my/build/package1")));
assertThat(queryStrategy.getQuerySpec()).isEmpty();
QuerySummary applied = queryStrategy.applyDelta(QuerySummary.EMPTY);
assertThat(applied.getRulesMap().keySet())
Expand Down Expand Up @@ -233,14 +224,10 @@ public void testDelta_addPackage() {

PartialProjectRefresh queryStrategy =
new PartialProjectRefresh(
QuerySyncTestUtils.NOOP_CONTEXT,
newDirectExecutorService(),
Path.of("/workspace/root"),
QuerySyncTestUtils.EMPTY_PACKAGE_READER,
baseProject,
QuerySyncTestUtils.CLEAN_VCS_STATE,
/* modifiedPackages= */ ImmutableSet.of(Path.of("my/build/package2")),
ImmutableSet.of(),
ImmutableSet.of());
QuerySummary applied = queryStrategy.applyDelta(delta);
assertThat(applied.getRulesMap().keySet())
Expand All @@ -267,14 +254,10 @@ public void testDelta_packagesWithErrors() {

PartialProjectRefresh queryStrategy =
new PartialProjectRefresh(
QuerySyncTestUtils.NOOP_CONTEXT,
newDirectExecutorService(),
Path.of("/workspace/root"),
QuerySyncTestUtils.EMPTY_PACKAGE_READER,
baseProject,
QuerySyncTestUtils.CLEAN_VCS_STATE,
/* modifiedPackages= */ ImmutableSet.of(Path.of("my/build/package")),
ImmutableSet.of(),
ImmutableSet.of());
QuerySummary applied = queryStrategy.applyDelta(delta);
assertThat(applied.getPackagesWithErrors()).containsExactly(Path.of("my/build/package"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,8 @@ public void testStartPartialRefresh_vcsSnapshotUnchanged_existingProjectSnapshot
project.vcsState(),
project.projectDefinition());
assertThat(update).isInstanceOf(NoopProjectRefresh.class);
assertThat(update.createBlazeProject(QuerySummary.EMPTY)).isSameInstanceAs(existingProject);
assertThat(update.createPostQuerySyncData(QuerySummary.EMPTY))
.isSameInstanceAs(existingProject.queryData());
}

@Test
Expand Down

0 comments on commit dcb9056

Please sign in to comment.