diff --git a/components/configuration/VFBCircuitBrowser/circuitBrowserConfiguration.js b/components/configuration/VFBCircuitBrowser/circuitBrowserConfiguration.js index ecdf84c5c..baaff1ca3 100644 --- a/components/configuration/VFBCircuitBrowser/circuitBrowserConfiguration.js +++ b/components/configuration/VFBCircuitBrowser/circuitBrowserConfiguration.js @@ -1,4 +1,4 @@ -var locationCypherQuery = ( instances, paths, weight, autosuggest ) => ({ +var locationCypherQuery = ( instances, paths, weight ) => ({ "statements": [ { "statement" : "WITH [" + instances + "] AS neurons" @@ -14,7 +14,6 @@ var locationCypherQuery = ( instances, paths, weight, autosuggest ) => ({ + " relationshipWeightProperty: 'weight_p'," + " relationshipTypes: ['*']," + " path: true" - + " fq: ['shortform_autosuggest:" + autosuggest + "']" + "})" + " YIELD index, sourceNode, targetNode, nodeIds, path" + " WITH * ORDER BY index DESC" @@ -26,19 +25,11 @@ var locationCypherQuery = ( instances, paths, weight, autosuggest ) => ({ ] }); -var autosuggestFormat = query => { - if ( query?.startsWith("VFB") ){ - return "shortform_autosuggest:VFB*"; - } else if ( query?.startsWith("FB") ){ - return "shortform_autosuggest:FB*"; - } else if ( query?.startsWith("DataSet") ){ - return "facets_annotation:DataSet"; - } else if ( query?.startsWith("pub") ){ - return "facets_annotation:pub"; - } - - return ""; -}; +var Neo4jLabels = { + FAFB : "FAFB", + L1EM : "L1EM", + FlyEM_HB : "FlyEM_HB" +} // See query explanation on https://github.com/VirtualFlyBrain/graph_queries/blob/main/weighted_path.md @@ -137,5 +128,5 @@ module.exports = { styling, restPostConfig, locationCypherQuery, - autosuggestFormat + Neo4jLabels }; diff --git a/components/interface/VFBCircuitBrowser/Controls.js b/components/interface/VFBCircuitBrowser/Controls.js index 3e949b15f..20d778f5a 100644 --- a/components/interface/VFBCircuitBrowser/Controls.js +++ b/components/interface/VFBCircuitBrowser/Controls.js @@ -120,9 +120,11 @@ const configuration = require('../../configuration/VFBCircuitBrowser/circuitBrow const restPostConfig = require('../../configuration/VFBCircuitBrowser/circuitBrowserConfiguration').restPostConfig; const cypherQuery = require('../../configuration/VFBCircuitBrowser/circuitBrowserConfiguration').locationCypherQuery; const stylingConfiguration = require('../../configuration/VFBCircuitBrowser/circuitBrowserConfiguration').styling; +const Neo4jLabels = require('../../configuration/VFBCircuitBrowser/circuitBrowserConfiguration').Neo4jLabels; const searchConfiguration = require('./../../configuration/VFBCircuitBrowser/datasources/SOLRclient').searchConfiguration; -const datasourceConfiguration = require('./../../configuration/VFBCircuitBrowser/datasources/SOLRclient').datasourceConfiguration; +const defaultDatasourceConfiguration = require('./../../configuration/VFBCircuitBrowser/datasources/SOLRclient').datasourceConfiguration; +const datasourceConfiguration = JSON.parse(JSON.stringify(defaultDatasourceConfiguration)); /** * Create custom marks for Paths slider. @@ -161,6 +163,10 @@ class AutocompleteResults extends Component { this.setState({ filteredResults : results }); } + clearResults () { + this.setState({ filteredResults : {} }); + } + getFilteredResults (){ return this.state.filteredResults; } @@ -179,8 +185,10 @@ class AutocompleteResults extends Component { fullWidth freeSolo disableClearable + clearOnEscape disablePortal autoHighlight + clearOnBlur value={this.fieldLabel} id={this.props.index.toString()} ListboxProps={{ style: { maxHeight: "10rem" } }} @@ -267,6 +275,12 @@ class Controls extends Component { this.props.vfbCircuitBrowser(UPDATE_CIRCUIT_QUERY, neurons); delete this.autocompleteRef[id.toString()]; this.neuronFields = neurons; + + if ( !this.state.neurons.find( neuron => neuron.id != "") ) { + // reset configuration of fq to default + datasourceConfiguration.query_settings.fq = defaultDatasourceConfiguration.query_settings.fq; + } + this.forceUpdate(); } @@ -360,6 +374,12 @@ class Controls extends Component { getResultsSOLR( event.target.value, this.autocompleteRef[this.setInputValue].current.handleResults,searchConfiguration.sorter,datasourceConfiguration ); } this.neuronFields = neurons; + + if ( !this.neuronFields.find( neuron => neuron.id != "") ) { + // reset configuration of fq to default + this.autocompleteRef[this.setInputValue].current.clearResults(); + datasourceConfiguration.query_settings.fq = defaultDatasourceConfiguration.query_settings.fq; + } } /** @@ -369,9 +389,17 @@ class Controls extends Component { // Copy neurons and add selection to correct array index let neurons = this.neuronFields; let textFieldId = event.target.id.toString().split("-")[0]; - let shortForm = this.autocompleteRef[textFieldId].current.getFilteredResults()[value] && this.autocompleteRef[textFieldId].current.getFilteredResults()[value].short_form; + let result = this.autocompleteRef[textFieldId].current.getFilteredResults()[value]; + let shortForm = result && result.short_form; neurons[index] = { id : shortForm, label : value }; + result.facets_annotation.forEach( annotation => { + let facet = "facets_annotation:" + annotation; + if ( Object.values(Neo4jLabels).includes(annotation) && !datasourceConfiguration.query_settings.fq.includes(facet) ) { + datasourceConfiguration.query_settings.fq.push(facet); + } + }); + // Keep track of query selected, and send an event to redux store that circuit has been updated this.circuitQuerySelected = neurons; this.props.vfbCircuitBrowser(UPDATE_CIRCUIT_QUERY, neurons); diff --git a/components/interface/VFBCircuitBrowser/VFBCircuitBrowser.js b/components/interface/VFBCircuitBrowser/VFBCircuitBrowser.js index 9642071b3..04bd523ba 100644 --- a/components/interface/VFBCircuitBrowser/VFBCircuitBrowser.js +++ b/components/interface/VFBCircuitBrowser/VFBCircuitBrowser.js @@ -28,7 +28,6 @@ const styles = theme => ({ const configuration = require('../../configuration/VFBCircuitBrowser/circuitBrowserConfiguration').configuration; const restPostConfig = require('../../configuration/VFBCircuitBrowser/circuitBrowserConfiguration').restPostConfig; const cypherQuery = require('../../configuration/VFBCircuitBrowser/circuitBrowserConfiguration').locationCypherQuery; -const autosuggestFormat = require('../../configuration/VFBCircuitBrowser/circuitBrowserConfiguration').autosuggestFormat; const stylingConfiguration = require('../../configuration/VFBCircuitBrowser/circuitBrowserConfiguration').styling; /** @@ -198,10 +197,8 @@ class VFBCircuitBrowser extends Component { if (this.__isMounted){ // Show loading spinner while cypher query search occurs this.setState({ loading : true , neurons : neurons ? neurons : this.state.neurons, paths : paths ? paths : this.state.paths, weight : weight ? weight : this.state.weight, queryLoaded : false }); - let suggestion = this.state.neurons.find( neuron => neuron.id != "" )?.id; - console.log("Suggestion ", suggestion); // Perform cypher query. TODO: Remove hardcoded weight once edge weight is implemented - this.queryResults(cypherQuery(neurons ? neurons.map(a => `'${a.id}'`).join(",") : this.state.neurons, paths ? paths : this.state.paths, weight ? weight : this.state.weight, autosuggestFormat(suggestion))); + this.queryResults(cypherQuery(neurons ? neurons.map(a => `'${a.id}'`).join(",") : this.state.neurons, paths ? paths : this.state.paths, weight ? weight : this.state.weight)); } }