From 8fe214820f24efda85352952d1f871d03fe7609b Mon Sep 17 00:00:00 2001 From: Anirudh Date: Thu, 16 May 2024 14:05:03 -0700 Subject: [PATCH] docs: update readme --- README.md | 136 ++++++++++++++++++++++--------- resources/nosql_subgraph.png | Bin 0 -> 4460 bytes resources/nosql_subgraph_sel.png | Bin 0 -> 4672 bytes resources/sql_subgraph.png | Bin 0 -> 4288 bytes resources/sql_subgraph_sel.png | Bin 0 -> 4458 bytes 5 files changed, 97 insertions(+), 39 deletions(-) create mode 100644 resources/nosql_subgraph.png create mode 100644 resources/nosql_subgraph_sel.png create mode 100644 resources/sql_subgraph.png create mode 100644 resources/sql_subgraph_sel.png diff --git a/README.md b/README.md index 167255e..5d7f803 100644 --- a/README.md +++ b/README.md @@ -2,51 +2,109 @@ The SQL studio enables developers to query SQL-enabled subgraphs on The Graph. -**IMPORTANT:** The only subgraph we currently support is Substreams Uniswap v3 Ethereum (ID: HUZDsRpEVP2AvzDCyzDHtdc64dyDxx8FQjzsmqSg4H3B). - ## Demo -![Demo](https://sql-studio-webapp.vercel.app/studio.gif) +![Demo](https://sql.semiotic.ai/studio.gif) 1. Open the extension on the *Activity Bar* -2. Use search button that you see when you hover your mouse over the *Available Subgraphs* menu. Find `convex` subgraph and select. You'll know it's selected when the icon next to it becomes a green circle. -4. Run `New Query` or click on the new file button that you see when you hover your mouse over the *Available Subgraphs* menu. This will create a GSQL file with the ID field pre-populated. -5. Type in a query. For instance, `SELECT * FROM pool LIMIT 1;` -6. Run the query using either the `Run Query` command or `C-m C-r` -7. Enter your gateway API Key if asked. +2. Select the `Uniswap V3 Ethereum` subgraph by clicking on it. +3. At the top of the *Available Subgraphs* explorer, click on the *New Query* button. This will create a GSQL file with the ID field pre-populated. +4. Type in a query. For instance, `SELECT * FROM token LIMIT 5;`. Capitalization matters. +5. Run the query using either the `Semiotic SQL: Run Query` command or the keybinding `C-m C-r` +6. Enter your API Key if prompted. If you just created an API key, be aware that it may take up to 30 seconds for it to be registered. + +If you need an API key, you can create one on [sql.semiotic.ai](sql.semiotic.ai). You can clear your API key stored in vscode user session secrets by executing `Clear API Key` command. -## Features - -- View most signalled subgraps on the network -- Use `New Query` menu for creating an sql document -- View subgraph database layout -- Supports dragging and dropping database table and columns into the sql text editor -- Syntax highlighting and autocompletion -- From the command menu `C-S-p`, you have access to all commands with the heading `Semiotic SQL`. These include: - - `New Query` - Create a GSQL window to write a new query. If you've already selected a subgraph in the *Available Subgraphs* menu, it will automatically populate the `ID` field in the document. - - `Add Subgraph Info` (`C-m C-a`) - If you haven't yet added a subgraph to the document, it will add the name and ID of the currently selected subgraph. - - `Replace Subgraph Info` (`C-m C-p`) - If there is no subgraph metadata in the document, add the metadata associated with the currently selected one. If there is, replace it with the currently selected one. - - `Run Query` (`C-m C-r`) - Execute the query. - - `Cancel Query` (`C-m C-c`) - Cancel execution. - - `Show Results` (`C-m C-n`) - Show the results of the executed query. - - `Load More Subgraphs` (`C-m C-l`) - Load the available subgraphs by signalled amount. - - `Clear API Key` - Clears gateway API Key stored in vscode user session secrets. - - `Search Subgraph by Name and Description` (`C-m C-s`) - Search the subgraph by its name and description. - - `Report a Bug` (`C-m C-b`) - Report a bug to us! -- View result table with - - Sort by clicking column names - - Search all text - - Export to CSV -- Properties in custom GSQL filetype enable easy sharing of files between team members. - -## Requirements - -## Extension Settings - -This extension contributes the following settings: - -## Known Issues +## The Anatomy of the Subgraph Studio + +Roughly speaking, we divide the Studio into two components. +The Explorer and the Playground. +We'll discuss each in turn below. + +### The Explorer + +The Explorer enables you to find subgraphs that you want to query. +The main interface to this is the *Available Subgraphs* view. +By default, this shows only subgraphs that have a SQL-enabled Indexer ready to serve you data. +We call these, SQL-enabled subgraphs as a shorthand, but this is a bit of a misnomer. +All subgraphs support SQL. +Just not all subgraphs have Indexers on them who are willing to serve SQL. +SQL-enabled subgraphs are marked by this symbol. + +![sql_subgraph](./resources/sql_subgraph.png) + +Alternatively, say you want to look at a subgraph that isn't SQL-enabled. +You can do that by searching for it using the keybinding `C-m C-s` or by moving your mouse to the top of the *Available Subgraphs* view and clicking on the magnifying glass. +With this, you can search either by the subgraph's name or by its description. +You might care to do this to inspect the queryable data on that subgraph. +Subgraphs that are not SQL-enabled are shown with this symbol. + +![nosql_subgraph](./resources/nosql_subgraph.png) + +Notice that the circle is blue for SQL-enabled subgraphs and red for subgraphs that aren't. +That's your clue. + +There's one more distinction we need to make. +There are SQL-enabled and SQL-disabled subgraphs. +There are also selected subgraphs and unselected subgraphs. +When you select a subgraph, the gray part turns green. + +![sql_subgraph_selected](./resources/sql_subgraph_sel.png) +![nosql_subgraph_selected](./resources/nosql_subgraph_sel.png) + +What does it mean to select a subgraph? +Firstly, when you create a new query using the button at the top of the *Available Subgraphs* view or by right clicking a selected subgraph, the GSQL file fills in metadata for the selected subgraph. +More on this in a second. +Secondly, when you select a subgraph, the *Subgraph Tables* view updates to show schema information for that subgraph. +Let's talk about this next. + +The *Subgraph Tables* view is a tree view. +At the top level, it shows the tables you can query in a subgraph. +If you expand one of those tables, you'll be able to see the columns and their types. +This view can help you write your queries, which moves us to the next part - the Playground. + +### The Playground + +Once you've used the Explorer to find a subgraph you want to query and create a new query, we open up a GSQL file for you. +This is a custom file type that contains comments at the top as metadata we use to query the subgraph. +Here's an example new file. + +```sql +--+SUBGRAPH: Uniswap V3 Ethereum +--+ID: HMwbgUHTSUByt1wn939V7ZmtkLmZzSwDrQF8g735Ke7b +``` + +It contains two pieces of metadata. +The `+SUBGRAPH` field gives the name of the subgraph you are querying. +The `+ID` field is the ID of the subgraph you're querying. +We use the `+ID` here to determine which subgraph to execute your SQL query against. +**This means that if you select, say, the convex subgraph in the Explorer, but your GSQL file contains the ID for Uniswap V3 Ethereum, we will execute your query against Uniswap V3 Ethereum.** +We do this so that it's easier to share these files with your collaborators. +When you send them a file, you can guarantee that they're on the same subgraph as you. +However, in case you do want to change the metadata in a file to reflect your selected subgraph, you can do so with the keybinding `C-m C-p` or by running `Semiotic SQL: Replace the Metadata...`. +Similarly, if you manually create a GSQL file, you can add the selected subgraph's metadata to it using `C-m C-a` or by running `Semiotic SQL: Selected Subgraph's Metadata...`. + +An advantage of the GSQL file is that we've built up a substantial SQL autocompletion engine that can help you fill in subgraph tables and columns into your query. +Just be aware that capitalization matters for SQL keywords. + +Once you have a query you'd like to run, you can run it with either `C-m C-r` or by running `Semiotic SQL: Run Query`. +If this is your first time running a query, this will prompt you for an API key. +You can create one on [sql.semiotic.ai](sql.semiotic.ai). +That'll kick off the query. +If you realize you've made a mistake and want to cancel it, you can use `C-m C-c` or run `Semiotic SQL: Cancel Query`. +Otherwise, the query will pop up the *Semiotic SQL Result* view and display the table. +If you ever close this and want to reopen it, you can use `C-m C-n` or run `Semiotic SQL: Show Results`. + +If you want to use this data, you can click on the CSV button above the table. +You can also sort by clicking column names in the table or search for specific text in the table. +If something went wrong, you can report a bug using `C-m C-b` or by running `Semiotic SQL: Report a Bug`. + +## Commands + +From the command menu `C-S-p`, you have access to all commands with the heading `Semiotic SQL`. ## Release Notes + +See our [CHANGELOG](https://github.com/semiotic-ai/vscode-sql-studio/blob/main/CHANGELOG.md). diff --git a/resources/nosql_subgraph.png b/resources/nosql_subgraph.png new file mode 100644 index 0000000000000000000000000000000000000000..d332c3a06e46c7c9e624f8a0d15ae86dfa0f20a6 GIT binary patch literal 4460 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 MQ`S;~DOf@O12x+ASO5S3 literal 0 HcmV?d00001 diff --git a/resources/sql_subgraph.png b/resources/sql_subgraph.png new file mode 100644 index 0000000000000000000000000000000000000000..f2139ce232c91057d8dce8faeb497509fba6aa35 GIT binary patch literal 4288 zcmZ`+XEfYR-~Q_s(N@XoQC4S{C9--aQKQ7ITP4b3)#zQcs42>3l_Y`?tlml1k_bT% zB@!)qFA?FEyqovKbI$YOIdf)yb7tn6eqFzrG&2+ZD|B3R003MuG|;(CvTlDPEj1~{ zEI+m+839*=+r|J80R@1#Bmg)k6~%1;KnM%~wwwU~SpWc>n5P})Dx?Z()Gd7-;LqPs z+FkLGR06^n{1XHKjD)|DY|y`w)IU?Wp^m0y*xWA8%gk=Qeee&G6*;GQ^;#m_quFNI z1H;e~KUWsOI*6lOR?2iRZEP~+UTF71?&3b4XrEV26n+f$TMwOs78-erhVGz4caZ^F zU2(krZ#)J)*!7$lwCGuFH9lMdVo%D2c;B$(Y4n;tB|Kl>i2kF$AD+J+&h%k37^xXg zSkfrDopxF)GjCN@I<@KCVzY=*s-M4R$cidst_Fj1E6fCBMQOC+1vaML!@>Pan8ouE ztWxA2&jSmKvRZ6?oB%CaN~#~MppcVF)a=Yk5kPkH?enXqFGc>;a-eYm8Rk`fZKmhW zNKaT^FwTKDbM5mWDRGYcTY)JGQXKT1e31-Ob}g_yY{4G_8o&6Jkn$Wg*0&kFd@|eU z>F47*-+C)&)THFTbp?IMKSJrGtjE99P@psx0~7O>y*JE3--C=THZP$B5cWMhTMfEW z*X``eN}jq6^TQPsl0WY4ndM8O@LzV@h|b$uCs!EX4$h2GC}OYZT5}BDyeW|X-ZL61 zas%QnBJ%F0DNP3P$fx(FgsxWr{D_^dzrUZdN}}+2Yi|kMiDz|Dz}Ho+B>T?kzP|TO zI@t9%6$_{A47H-JugdqHZN={`;l4R`#h!?v6|r|Nj73B$zjSk>6}bUSY!nY^+5Mi4 zeTbp5YXea%5sC3FhtD5BmVv{rM?^Qgq;9aP?wY&%qP#tg3`nn$vP92)pK=stTP}3y zv_}DP_D}+8i#1=55mC*yE_hqWp{`M(QB$V;r%x)p%#@#|UmyFKhJ4H5A6D@FR#a(3 zcY#5rmx)6YjG3D8^u=V+p%ucV4FiJHl4l_X3kpRp=}zBa_u~*!&V26}?36v9|a9Fb&l8b14Oe9dX=M zu$BJ(V_d(Mrh({9Oq0Kh>8u#6?jG?VMCxZby9KiqY~Ob5h+torb+A36W27uIduQXH z6GCeAYj24_7M)615`aSQ-=@vZsJB@>4y!jYCHS>YoHLXR5+01`&2rO=(j6ZiJnW8y z91;z08B?VYK$VLvfaK6-@LL^=u5i-vCt7jXH^|FFj&*bFWo{-ST67JpqTz-3}@)c^b!iV|jEQ{B`(1bAr zB1El-&E%h+ir3G3a2^7B>(O|4OhHrcw>xK+uduU(QJVQPA7ntUF3YXx(sH?WMqG7CGQlQ*(qUFxh){Y3`(A{cFfw6w(DEMB!u!lnHWW- zT32ZM+!duxxnDZ&?UGh{_y*-1q?F2@kt>`pL?Yd0Rh0mF!B0D}7^<{}CQ7FxF)|i* z;o(#|R*$hg86z%+f-z5+Yoqi9jdBWs?ER{iV6O9H%MM|tpy}r5ON$$bq|aH5P4_}x z&s6H=ebD`Q{zL5Dh;EFDiCJe?>6Uwy0#}r|Q}*YqEVF5S8@z-XpXukxQkc5B=kx*d zi|%TA{+J^}9Vv$7^pW!N%IK}CQiQu-0;0KT@hlB2DX8s@XIoo!StwS0kgcSq-vnDO931jcEEIXgS_lxG)MKpWvD9EBUp5(+09R<=- zk(0ykwFA8ta})L7fM2MF!RCs4fB zcEXU0qx0;urk%p6g!AbEvEfnuP!DJ&`R)u_(J}UyyKtT3F0vJ03dH^zR2S2oy*QZ= zla>kP&F5fWBB|1Ng{6$)sto1SJKCovqC&aKIs)7jDz;Xutgd_{DRD4UynSOtEi|5 zAZVmxW})i2prycJdz=8($q?ZY*ZKld+;oM<_%4a@ne zBI%Pu?vw}q{;}Jt?eH?yBgjj<_;Nh^>Y;9p;Z3@&P;E&v-B3l>9@+$f`jF!_vwU$> z?f~(cQ`!GBklo##S?Z0S*N5EQFD>v6sFt&zcAP3hbG&5QNyv76d($KH5*e@S-`Di8 zwE)S9gq7819kOe;ir807q{;vI(Z;;?PhA<*QGz(i$fH3b*-B5h9&R4(ON{L~r+Y|- z?!>b?<85YaY*H&i_uS9|8v$2dIr~&kr4Ll!8UOSxYaEX^o7OcT`Lr9evz1b^Oc7e( z*Bd`cGA6eFEm^NR`90c^C7!u9I&wA8?PWQYs)k>&CsM0`JS7o))Kq7aFx4?6!LDZuBMTfwwy7B!u%bx|^FHp_&RZ!<NP`_e&%`$t$zDfpF_M<^tk znIq2W!}M~tk6d3_*g#v1_QKbWW>h~AcQQ$Txw}{xrhREQZCdIAbMrroLo{H{-D%Z}pv1~=y%6Y%4X5r-CMp}~= z_OFI$&ByW*Sad9kZNKWPYjs-Lk_%-+XNWLC$Pg_f8KnGkz|4QF7!n+&J(aOkxL-F4 zLcCH@7p2Lzw$g;eRv1G*#D&~UI!FDqaz z7#}xU^0mXDtZ(Wiv~EJ2)K~90QMMi`4kB0M|1@Lsh=aZC_#p3&oq@)B&)`a|YXipxBiEMa`6 zsr1_!0g|l@3ap#YdQ-0Nn27$qhgJ-KR5}MNaHDeHZHK>lH>j~I!ggvIL%y_xU2_8e zjtxkTVv&(ZH)Pz^Q4nF{!po|4VSPPF9P2{Q^O84a)`xMN}$^>L2lAi2`Xi4roX zy1vpvO!{MD6t8Z?sGQ|JP}(x?9}O&aY0`ZD@e;az_)yd<){k9G?@75WDlpz0j5Lxhw)}w9J=jDVC4AQA~#`Putn^B>bX-AEARAP$dvj7 z&-Y|zeQD*iy2d1!8B#azm$9Gq;B(IzuQZzq*(bxE1s~OayHmre*nFmITxt%M4Cb{H z&U|hb*s$;x<57)f3?OXGS}+Lh$|h$?z3HEx@udr1XfHoRBU$Y8 z3gnY7d?`pBM+UrG1(}It5z3nEPwYm*nmVa&a;@+_C#XppXgc!U&U;wK1p$S8rAkiO zzbEtI=a2(7oKE4ZG#}Gxh%l4?SBrBTi&|cBN?W^=9`*ada9w!Ig4d}e-FrcgyOHbq zc&7DISv zb3?d)aOGDAGV1Jb@Pi)~O3>C^fe3fw?^MsGZYhtP^-iK|R`UdaVRVh-*u4TyckRI| zM&^h@i131{jE}YnqvKpFQ~dW@eR5YY*l)01<$M-}dm_HG;is1pp5BsU`63`Z^~Yh( z=qgBsVzohD?f{!eV}9GL9{sIDzHGd$n;x$tkdWiN)}3f{TO|FMul=fI?qc%Y5+Zk9 z_kG^Sk004N>d=vn?2^goSI|F{Eg74=GR#2C_4#a$#sG73u^}(|6E;^K#f)UGv_~-~ zo$uY=CRx)r5?OP(#YNw*`bE}7y?_w1X^@G5ubqZIFZx&QRec)r$`~!S&eTb-Ys}c# zM@uu)KCybaN78#6UIKB0;TTV8r_0*v8jAw@szHrGzLJVFMf%KV?3rnAlQEX^Yjg!0 ztwopVxr5+m*2s%(hjEayM+(I++_V>Qn|g@4hdEs3TF=u-=TD>aGlex;DlE#}<89BV z$l_#06~Y=S9^-SyHNs7bQe7e8wJYpj+(wSug!%l3w2wVH81k}XYwh+!{fPABK&gc@6}8A>QtixTS|f zkWp?JPwG*XrA=*WJlD*o*W>joV%WeJz+JHMAN>;JoVABNgdTnu$`{or7voTW)Gs6s zJ)r9SL$evpl+L+d_xF=860BB7XE>_bcw<)odVJ+CDJU7bj#AY)KZcH3dqu+G}0hQcPb6iBHas$uz(=3 zl)m+!ch39cojEi2oICfMnRD*<&7Cu`y4tFwM6^Tz0FbIdmGrRI?q4SWVMoucbOWqm zwuS0x0l;%Y0Lsbd*`>(z4Doe$B z2tA>uJ^(=0_pjp&d6Z+-%_Gnnrh>baQc7DmT~hod9PDK1jG?V>j3B?Kb7=iGSMtZulMCLS^`m=6mEVZ)GpZbNoVa_t+eIXn{T?)BQ6s>! zg64d!^U0og1UuKZt?Rls7fC`H(suL_0eUU-8oH2vw=)*rp*bqg3Xz-0kr&-i})5 zDKLLMy7%F%uuN7GkhJa%X%pj=S(VLKgiUR96I1*d2|>?Zi|~5et37= zL%_W+KL~R2M|4lEGp+Oek1J1+enRi9DrlgY@0qPbsF~4 zS^LY+ivp2hkUO3G=KO1cLm^PRagD2rY=Y7Vh5F?P%TMt^AUtz3GeDdrT2D4gppVmZ z@(g?j(7P=>zDAb752m^cgq zL~IB>x^()8-nkvh-Ba^N6yb2^72}@iNL#a>K}Gh#s1GD(pq04PFJh#ikYcGftVRNP zArOY+?$7zIqS|&X)_)47t3PU7k$r6a2fuagHg8YV54NL|?Nz%eQ_?x%_UR7inzFnq z2k^;S2xhy8Q^j*xzb?J-AR;g{P4Qq=j^3r!I@bry_YS_5Oi!>V6aBij5)bdD&8A$_ z44X)^i{Vz*-7%F>&aq{a`(lJ`saB3kG(k3=k1)K|8l>~)$SFExFbtH69u zSan*)f5be9-fEg1K<=R>$piiSi-t*{zYugGAhMCcAE@WA)7b0`JQC$w+3BL|!xFvZ zNAlp6^L=cR3nIs2NOE==~ zXT)<{dCm|_0e4w~Ay&|wXhUw|&uo(L%IMwkXJo(!v2jfM;r)rxnnJzRDD9%7D)KAb z#BF8;a15dcJQhzMt@gR^Gbg`zpZ?$%e4X-~7C*2CwX!V7}g)+?X$$zwG~< zR2E>fpc(vP-Mghq!;PfA;fgCy;(9tfCTWi+uJ9pjzTX%e)^nQCYGNAcIO$F=3eq~C z%k9tl5(J*tC|u6m*h~!r)0bMpRL?tX?$z9xLA(^nq7SQ3N}I3`2h82#d2Wq-i1eK)NQ8Kz7L@ z`~p0qEOVPrI@e=NU&@igAE*51^r`$9^=aDe6h_25p-YW>l4Vgs8pURZ89GaA+Djjn z!bB(*xzV){B@SvIw9T0#hev{_hRokwRRmc^E7lhTIx(^3Nf+~2E!U8T4G)3=LAKyV zMUV66Dt~(i!MlDP7RfUCda}y2_O>Jlru$v#-TfaKmW+|qRPF-Wj!D&A>M2TkZ_A)X zTwfRl;@PE>bdvPGaH>`8pFLb6Iqj2r5t+7fOtVh+Ez4o_`qe&sOhJ+t)wmjNK}K2ap-`P_HZh!2yZN2y<@xY_vd z$0uams(3{MQD0B)@jhu_EXh41+y6)Bs@e#xTHWHR!8gR%Tj4k&x;=~0YfG@IlMQhM zXPNk-@evgoF!I&?#5oTvPGvsWIUK|9Z6GJZx{?8RVix3)i4(G9k7GU#-m=hX8F7rI zd}RaQHW@rk27YM
  • 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 C5NAUG literal 0 HcmV?d00001