Commit 8343274b authored by Feng Xue's avatar Feng Xue

Add ETag support to correlation and regression

Add the support to correlation and regression

Fixes #2062
parent 9ce7cd95
package com.nesstar.rest.common;
import com.nesstar.api.Server;
import com.nesstar.api.Study;
import com.nesstar.api.Variable;
import com.nesstar.api.analysis.MissingDeletionType;
import java.util.List;
public class CorrelationClassVariables {
private Study study;
private Server server;
private List<Variable> correlationVariables;
private List<Variable> weightVariables;
private String caseSubsetExpression;
private MissingDeletionType missingDeletionType;
public Study getStudy() {
return study;
}
public void setStudy(Study study) {
this.study = study;
}
public Server getServer() {
return server;
}
public void setServer(Server server) {
this.server = server;
}
public List<Variable> getCorrelationVariables() {
return correlationVariables;
}
public void setCorrelationVariables(List<Variable> correlationVariables) {
this.correlationVariables = correlationVariables;
}
public List<Variable> getWeightVariables() {
return weightVariables;
}
public void setWeightVariables(List<Variable> weightVariables) {
this.weightVariables = weightVariables;
}
public String getCaseSubsetExpression() {
return caseSubsetExpression;
}
public void setCaseSubsetExpression(String caseSubsetExpression) {
this.caseSubsetExpression = caseSubsetExpression;
}
public MissingDeletionType getMissingDeletionType() {
return missingDeletionType;
}
public void setMissingDeletionType(MissingDeletionType missingDeletionType) {
this.missingDeletionType = missingDeletionType;
}
}
...@@ -75,7 +75,7 @@ public final class ETag { ...@@ -75,7 +75,7 @@ public final class ETag {
} }
data.add(classVariables.getCaseSubset()); data.add(classVariables.getCaseSubset());
return ETag.createETag(new ETagGenerator(data)); return createETag(new ETagGenerator(data));
} }
public static ETag generateEtagForCube(final Cube cube, final CubeRequest cubeRequest, final HttpServletRequest request) { public static ETag generateEtagForCube(final Cube cube, final CubeRequest cubeRequest, final HttpServletRequest request) {
...@@ -84,4 +84,44 @@ public final class ETag { ...@@ -84,4 +84,44 @@ public final class ETag {
data.add(url).add(cube).add(cubeRequest); data.add(url).add(cube).add(cubeRequest);
return createETag(new ETagGenerator(data)); return createETag(new ETagGenerator(data));
} }
public static ETag generateEtagForCorrelation(final CorrelationClassVariables classVariables, final HttpServletRequest request) {
ETagData data = new ETagData();
String url = request.getRequestURL().toString();
data.add(url).add(classVariables.getStudy());
for (Variable variable: classVariables.getCorrelationVariables()) {
data.add(variable);
}
for (Variable variable: classVariables.getWeightVariables()) {
data.add(variable);
}
data.add(classVariables.getCaseSubsetExpression());
data.add(classVariables.getMissingDeletionType());
return createETag(new ETagGenerator(data));
}
public static ETag generateEtagForRegression(final RegressionClassVariables classVariables, final HttpServletRequest request) {
ETagData data = new ETagData();
String url = request.getRequestURL().toString();
data.add(url).add(classVariables.getStudy());
for (Variable variable: classVariables.getIndependentVariables()) {
data.add(variable);
}
for (Variable variable: classVariables.getWeightVariables()) {
data.add(variable);
}
data.add(classVariables.getDependentVariable());
data.add(classVariables.getCaseSubsetExpression());
data.add(classVariables.getMissingDeletionType());
return createETag(new ETagGenerator(data));
}
} }
package com.nesstar.rest.common;
import com.nesstar.api.Server;
import com.nesstar.api.Study;
import com.nesstar.api.Variable;
import com.nesstar.api.analysis.MissingDeletionType;
import java.util.List;
public class RegressionClassVariables {
private Study study;
private Server server;
private Variable dependentVariable;
private List<Variable> independentVariables;
private List<Variable> weightVariables;
private String caseSubsetExpression;
private MissingDeletionType missingDeletionType;
public Study getStudy() {
return study;
}
public void setStudy(Study study) {
this.study = study;
}
public Server getServer() {
return server;
}
public void setServer(Server server) {
this.server = server;
}
public Variable getDependentVariable() {
return dependentVariable;
}
public void setDependentVariable(Variable dependentVariable) {
this.dependentVariable = dependentVariable;
}
public List<Variable> getIndependentVariables() {
return independentVariables;
}
public void setIndependentVariables(List<Variable> independentVariables) {
this.independentVariables = independentVariables;
}
public List<Variable> getWeightVariables() {
return weightVariables;
}
public void setWeightVariables(List<Variable> weightVariables) {
this.weightVariables = weightVariables;
}
public String getCaseSubsetExpression() {
return caseSubsetExpression;
}
public void setCaseSubsetExpression(String caseSubsetExpression) {
this.caseSubsetExpression = caseSubsetExpression;
}
public MissingDeletionType getMissingDeletionType() {
return missingDeletionType;
}
public void setMissingDeletionType(MissingDeletionType missingDeletionType) {
this.missingDeletionType = missingDeletionType;
}
}
package com.nesstar.rest.resources; package com.nesstar.rest.resources;
import com.nesstar.api.NotAuthorizedException; import com.nesstar.api.NotAuthorizedException;
import com.nesstar.api.Server;
import com.nesstar.api.Study;
import com.nesstar.api.Variable; import com.nesstar.api.Variable;
import com.nesstar.api.analysis.CorrelationBuilder; import com.nesstar.api.analysis.CorrelationBuilder;
import com.nesstar.api.analysis.CorrelationResult; import com.nesstar.api.analysis.CorrelationResult;
import com.nesstar.api.analysis.MissingDeletionType;
import com.nesstar.api.subset.CaseSubset; import com.nesstar.api.subset.CaseSubset;
import com.nesstar.api.subset.SubsetSyntaxException; import com.nesstar.api.subset.SubsetSyntaxException;
import com.nesstar.rest.common.ServerHandler;
import com.nesstar.rest.common.Operation; import com.nesstar.rest.common.Operation;
import com.nesstar.rest.common.OperationRunner; import com.nesstar.rest.common.OperationRunner;
import com.nesstar.rest.common.ResourceExtractor; import com.nesstar.rest.common.ResourceExtractor;
import com.nesstar.rest.common.ServerHandler; import com.nesstar.rest.common.ETag;
import com.nesstar.rest.common.CorrelationClassVariables;
import com.nesstar.rest.result_object_makers.MetadataMaker; import com.nesstar.rest.result_object_makers.MetadataMaker;
import com.yammer.metrics.annotation.Timed; import com.yammer.metrics.annotation.Timed;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam; import javax.ws.rs.QueryParam;
...@@ -38,14 +38,6 @@ public final class CorrelationResource extends AbstractResource { ...@@ -38,14 +38,6 @@ public final class CorrelationResource extends AbstractResource {
super(serverHandler); super(serverHandler);
} }
private static class ClassVariables {
private Study study;
private Server server;
private List<Variable> correlationVariables;
private List<Variable> weightVariables;
private String caseSubsetExpression;
private MissingDeletionType missingDeletionType;
}
@GET @GET
@Timed @Timed
...@@ -54,53 +46,57 @@ public final class CorrelationResource extends AbstractResource { ...@@ -54,53 +46,57 @@ public final class CorrelationResource extends AbstractResource {
@PathParam("studyId") final String studyId, @PathParam("studyId") final String studyId,
@QueryParam("caseSubset") final String caseSubset, @QueryParam("caseSubset") final String caseSubset,
@QueryParam("missDeletion") final String missingDeletion, @QueryParam("missDeletion") final String missingDeletion,
@Context final HttpServletRequest request) { @Context final HttpServletRequest request,
@Context final HttpServletResponse response) {
final ClassVariables classVariables = new ClassVariables(); final CorrelationClassVariables classVariables = new CorrelationClassVariables();
return OperationRunner.runWithExceptionHandling(new Operation() { return OperationRunner.runWithExceptionHandling(new Operation() {
@Override @Override
public Object run() throws Exception { public Object run() throws Exception {
MissingDeletionType missingDeletionType = MissingDeletionType.valueOf(missingDeletion); classVariables.setServer(serverHandler.getServer());
classVariables.server = serverHandler.getServer(); classVariables.setStudy(ResourceExtractor.getStudy(studyId, classVariables.getServer()));
classVariables.study = ResourceExtractor.getStudy(studyId, classVariables.server); classVariables.setCorrelationVariables(ResourceExtractor.getVariables(correlationVariables, classVariables.getServer()));
classVariables.correlationVariables = ResourceExtractor.getVariables(correlationVariables, classVariables.server); classVariables.setWeightVariables(ResourceExtractor.getVariables(weightVariables, classVariables.getServer()));
classVariables.weightVariables = ResourceExtractor.getVariables(weightVariables, classVariables.server); classVariables.setCaseSubsetExpression(caseSubset);
classVariables.caseSubsetExpression = caseSubset; try {
if (null != missingDeletionType) { classVariables.setMissingDeletionType(classVariables.getMissingDeletionType());
classVariables.missingDeletionType = missingDeletionType; } catch (NullPointerException e) {
//ignore
} }
CorrelationResult correlationResult = performCorrelation(classVariables); CorrelationResult correlationResult = performCorrelation(classVariables);
ETag etag = ETag.generateEtagForCorrelation(classVariables, request);
setETagHeader(etag, response);
return getCorrelationObject(correlationResult, classVariables); return getCorrelationObject(correlationResult, classVariables);
} }
}, serverHandler); }, serverHandler);
} }
private CorrelationResult performCorrelation(ClassVariables classVariables) throws IOException, NotAuthorizedException, SubsetSyntaxException { private CorrelationResult performCorrelation(CorrelationClassVariables classVariables) throws IOException, NotAuthorizedException, SubsetSyntaxException {
CorrelationBuilder correlationBuilder = new CorrelationBuilder(); CorrelationBuilder correlationBuilder = new CorrelationBuilder();
for (Variable variable : classVariables.correlationVariables) { for (Variable variable : classVariables.getCorrelationVariables()) {
correlationBuilder.addCorrelationVariable(variable); correlationBuilder.addCorrelationVariable(variable);
} }
for (Variable weightVariable : classVariables.weightVariables) { for (Variable weightVariable : classVariables.getWeightVariables()) {
correlationBuilder.addWeightVariable(weightVariable); correlationBuilder.addWeightVariable(weightVariable);
} }
if (classVariables.caseSubsetExpression != null) { if (classVariables.getCaseSubsetExpression() != null) {
correlationBuilder.setCaseSubset(CaseSubset.compile(classVariables.caseSubsetExpression, classVariables.server)); correlationBuilder.setCaseSubset(CaseSubset.compile(classVariables.getCaseSubsetExpression(), classVariables.getServer()));
} }
if (classVariables.missingDeletionType != null) { if (classVariables.getMissingDeletionType() != null) {
correlationBuilder.setMissingDeletionType(classVariables.missingDeletionType); correlationBuilder.setMissingDeletionType(classVariables.getMissingDeletionType());
} }
return classVariables.study.correlate(correlationBuilder); return classVariables.getStudy().correlate(correlationBuilder);
} }
private Object getCorrelationObject(CorrelationResult correlationResult, ClassVariables classVariables) throws IOException, NotAuthorizedException { private Object getCorrelationObject(CorrelationResult correlationResult, CorrelationClassVariables classVariables) throws IOException, NotAuthorizedException {
HashMap<String, Object> resultValuesMap = new LinkedHashMap<String, Object>(); HashMap<String, Object> resultValuesMap = new LinkedHashMap<String, Object>();
for (int i = 0; i < classVariables.correlationVariables.size(); i++) { List<Variable> correlationVariables = classVariables.getCorrelationVariables();
for (int j = i + 1; j < classVariables.correlationVariables.size(); j++) { for (int i = 0; i < correlationVariables.size(); i++) {
Variable var1 = classVariables.correlationVariables.get(i); for (int j = i + 1; j < correlationVariables.size(); j++) {
Variable var2 = classVariables.correlationVariables.get(j); Variable var1 = correlationVariables.get(i);
Variable var2 = correlationVariables.get(j);
String key = var1.getId() + "|" + var2.getId(); String key = var1.getId() + "|" + var2.getId();
resultValuesMap.put(key, getCorrelationCoefficients(var1, var2, correlationResult)); resultValuesMap.put(key, getCorrelationCoefficients(var1, var2, correlationResult));
} }
......
...@@ -2,21 +2,23 @@ package com.nesstar.rest.resources; ...@@ -2,21 +2,23 @@ package com.nesstar.rest.resources;
import com.nesstar.api.NotAuthorizedException; import com.nesstar.api.NotAuthorizedException;
import com.nesstar.api.Server; import com.nesstar.api.Server;
import com.nesstar.api.Study;
import com.nesstar.api.Variable; import com.nesstar.api.Variable;
import com.nesstar.api.analysis.LinearRegressionBuilder; import com.nesstar.api.analysis.LinearRegressionBuilder;
import com.nesstar.api.analysis.LinearRegressionResult; import com.nesstar.api.analysis.LinearRegressionResult;
import com.nesstar.api.analysis.MissingDeletionType; import com.nesstar.api.analysis.MissingDeletionType;
import com.nesstar.api.subset.CaseSubset; import com.nesstar.api.subset.CaseSubset;
import com.nesstar.rest.common.ServerHandler;
import com.nesstar.rest.common.Operation; import com.nesstar.rest.common.Operation;
import com.nesstar.rest.common.OperationRunner; import com.nesstar.rest.common.OperationRunner;
import com.nesstar.rest.result_object_makers.ErrorMaker;
import com.nesstar.rest.common.ResourceExtractor; import com.nesstar.rest.common.ResourceExtractor;
import com.nesstar.rest.common.ServerHandler; import com.nesstar.rest.common.ETag;
import com.nesstar.rest.common.RegressionClassVariables;
import com.nesstar.rest.result_object_makers.ErrorMaker;
import com.nesstar.rest.result_object_makers.MetadataMaker; import com.nesstar.rest.result_object_makers.MetadataMaker;
import com.yammer.metrics.annotation.Timed; import com.yammer.metrics.annotation.Timed;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.QueryParam; import javax.ws.rs.QueryParam;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
...@@ -39,16 +41,6 @@ public final class RegressionResource extends AbstractResource { ...@@ -39,16 +41,6 @@ public final class RegressionResource extends AbstractResource {
super(serverHandler); super(serverHandler);
} }
private static class ClassVariables {
private Study study;
private Server server;
private Variable dependentVariable;
private List<Variable> independentVariables;
private List<Variable> weightVariables;
private String caseSubsetExpression;
private MissingDeletionType missingDeletionType;
}
@GET @GET
@Timed @Timed
public Object regress(@QueryParam("depVar") final String dependentVariable, public Object regress(@QueryParam("depVar") final String dependentVariable,
...@@ -57,9 +49,10 @@ public final class RegressionResource extends AbstractResource { ...@@ -57,9 +49,10 @@ public final class RegressionResource extends AbstractResource {
@QueryParam("caseSubset") final String caseSubset, @QueryParam("caseSubset") final String caseSubset,
@QueryParam("missDeletion") final String missingDeletion, @QueryParam("missDeletion") final String missingDeletion,
@PathParam("studyId") final String studyId, @PathParam("studyId") final String studyId,
@Context final HttpServletRequest request) { @Context final HttpServletRequest request,
@Context final HttpServletResponse response) {
final ClassVariables classVariables = new ClassVariables(); final RegressionClassVariables classVariables = new RegressionClassVariables();
if (dependentVariable == null || independentVariables.isEmpty()) { if (dependentVariable == null || independentVariables.isEmpty()) {
return ErrorMaker.getBadRequestError("The request must specify a dependent variable and at least 1 independent variables."); return ErrorMaker.getBadRequestError("The request must specify a dependent variable and at least 1 independent variables.");
...@@ -68,47 +61,52 @@ public final class RegressionResource extends AbstractResource { ...@@ -68,47 +61,52 @@ public final class RegressionResource extends AbstractResource {
return OperationRunner.runWithExceptionHandling(new Operation() { return OperationRunner.runWithExceptionHandling(new Operation() {
@Override @Override
public Object run() throws Exception { public Object run() throws Exception {
MissingDeletionType missingDeletionType = MissingDeletionType.valueOf(missingDeletion); classVariables.setServer(serverHandler.getServer());
classVariables.server = serverHandler.getServer(); Server server = classVariables.getServer();
classVariables.study = ResourceExtractor.getStudy(studyId, classVariables.server); classVariables.setStudy(ResourceExtractor.getStudy(studyId, server));
classVariables.dependentVariable = ResourceExtractor.getVariable(dependentVariable, classVariables.server); classVariables.setDependentVariable(ResourceExtractor.getVariable(dependentVariable, server));
classVariables.independentVariables = ResourceExtractor.getVariables(independentVariables, classVariables.server); classVariables.setIndependentVariables(ResourceExtractor.getVariables(independentVariables, server));
classVariables.weightVariables = ResourceExtractor.getVariables(weightVariables, classVariables.server); classVariables.setWeightVariables(ResourceExtractor.getVariables(weightVariables, server));
classVariables.caseSubsetExpression = caseSubset; classVariables.setCaseSubsetExpression(caseSubset);
if (null != missingDeletionType) { try {
classVariables.missingDeletionType = missingDeletionType; classVariables.setMissingDeletionType(classVariables.getMissingDeletionType());
} catch (NullPointerException e) {
//ignore
} }
LinearRegressionResult linearRegressionResult = performRegression(classVariables); LinearRegressionResult linearRegressionResult = performRegression(classVariables);
ETag etag = ETag.generateEtagForRegression(classVariables, request);
setETagHeader(etag, response);
return getRegressionObject(linearRegressionResult, classVariables); return getRegressionObject(linearRegressionResult, classVariables);
} }
}, serverHandler); }, serverHandler);
} }
private LinearRegressionResult performRegression(ClassVariables classVariables) throws Exception { private LinearRegressionResult performRegression(RegressionClassVariables classVariables) throws Exception {
LinearRegressionBuilder builder = new LinearRegressionBuilder(); LinearRegressionBuilder builder = new LinearRegressionBuilder();
builder.setDependentVariable(classVariables.dependentVariable); builder.setDependentVariable(classVariables.getDependentVariable());
for (Variable independentVariable : classVariables.independentVariables) { for (Variable independentVariable : classVariables.getIndependentVariables()) {
builder.addIndependentVariable(independentVariable); builder.addIndependentVariable(independentVariable);
} }
for (Variable weightVariable : classVariables.weightVariables) { for (Variable weightVariable : classVariables.getWeightVariables()) {
builder.addWeightVariable(weightVariable); builder.addWeightVariable(weightVariable);
} }
if (classVariables.caseSubsetExpression != null) { if (classVariables.getCaseSubsetExpression() != null) {
builder.setCaseSubset(CaseSubset.compile(classVariables.caseSubsetExpression, classVariables.server)); builder.setCaseSubset(CaseSubset.compile(classVariables.getCaseSubsetExpression(), classVariables.getServer()));
} }
if (classVariables.missingDeletionType != null) { MissingDeletionType missingDeletionType = classVariables.getMissingDeletionType();
builder.setMissingDeletionType(classVariables.missingDeletionType); if (missingDeletionType != null) {
builder.setMissingDeletionType(missingDeletionType);
} }
return (LinearRegressionResult) classVariables.study.regress(builder); return (LinearRegressionResult) classVariables.getStudy().regress(builder);
} }
private Object getRegressionObject(LinearRegressionResult linearRegressionResult, ClassVariables classVariables) throws IOException, NotAuthorizedException { private Object getRegressionObject(LinearRegressionResult linearRegressionResult, RegressionClassVariables classVariables) throws IOException, NotAuthorizedException {
HashMap<String, Object> regression = new LinkedHashMap<String, Object>(); HashMap<String, Object> regression = new LinkedHashMap<String, Object>();
regression.put("dependentVariableId", classVariables.dependentVariable.getId()); regression.put("dependentVariableId", classVariables.getDependentVariable().getId());
regression.put("caseCount", linearRegressionResult.getCaseCount()); regression.put("caseCount", linearRegressionResult.getCaseCount());
regression.put("intercept", linearRegressionResult.getIntercept()); regression.put("intercept", linearRegressionResult.getIntercept());
...@@ -121,7 +119,7 @@ public final class RegressionResource extends AbstractResource { ...@@ -121,7 +119,7 @@ public final class RegressionResource extends AbstractResource {
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
List<Map> independentVariablesData = new ArrayList<Map>(); List<Map> independentVariablesData = new ArrayList<Map>();
for (Variable independentVariable : classVariables.independentVariables) { for (Variable independentVariable : classVariables.getIndependentVariables()) {
independentVariablesData.add(getIndependentVariableData(independentVariable, linearRegressionResult)); independentVariablesData.add(getIndependentVariableData(independentVariable, linearRegressionResult));
} }
regression.put("independentVariablesData", independentVariablesData); regression.put("independentVariablesData", independentVariablesData);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment